• ベストアンサー

マクロの変数のことで

Sub test() Dim x As Range, y As Range Dim i As Integer i = 0 Set y = Application.InputBox("", "Paste", Type:=8)  For Each x In Selection   x.Cut y.Offset(i, 0)   i = i + 1  Next x End Sub 上記マクロは、選択されているセルを切り取って、指定したセルを基点として下方向に貼り付けるものです。 "i"の初期値を"1"にすると成功しますが、"0"だとエラーになります。"-3"などにすると、値がゼロになった時点でエラーになります。なぜ"i"がゼロになるとエラーになってしまうのでしょうか?  指定したセルを基点にして貼り付けられるようにするには、どうすればいいでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • bonaron
  • ベストアンサー率64% (482/745)
回答No.4

何らかの理由で、Cutによって yが破壊されているようですから、 直接 yを参照しなければ大丈夫のようです。 Sub test1()   Dim x As Range, y As Range   Dim R As Long   Dim C As Long   Set y = Application.InputBox("", "Paste", Type:=8)   R = y.Row   C = y.Column   For Each x In Selection     x.Cut Cells(R, C)     R = R + 1   Next End Sub

naruue
質問者

お礼

ありがとうございました。 大変参考になりました。

その他の回答 (3)

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.3

A1:A5を選択して下記を実行しC1を選ぶと、なんと x のアドレスが $C$1 $C$2 $C$4 $C$7 $C$11 と出力されちゃいますので、非常に怪しい動きですね。 Sub test1() Dim x As Range, y As Range Dim i As Integer  i = 0  Set y = Application.InputBox("", "Paste", Type:=8)  For Each x In Selection     x.Cut y.Offset(i, 0)     Set y = x     i = i + 1     Debug.Print x.Address  Next x End Sub #2さんもおっしゃるように Cut が問題のようです。 Copyでも動きました。 Sub test() Dim x As Range, y As Range Dim i As Integer  i = 0  Set y = Application.InputBox("", "Paste", Type:=8)  For Each x In Selection    x.Copy y.Offset(i, 0)    i = i + 1  Next x  Selection.Clear End Sub

naruue
質問者

お礼

ありがとうございました。 大変参考になりました。

  • NCU
  • ベストアンサー率10% (32/318)
回答No.2

「Cut」に原因がありそうです。 Cutを使わなければ問題無い筈です。 Sub test()   Dim x As Range, y As Range   Dim i As Integer   Set y = Application.InputBox("", "Paste", Type:=8)   For Each x In Selection     y.Offset(i).Value = x.Value     x.ClearContents     i = i + 1   Next End Sub

naruue
質問者

お礼

ありがとうございました。 大変参考になりました。

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.1

試してみましたが  x.Cut y.Offset(0, 0) を実行直後 yは<オブジェクトが必要です>の状態になってしまっていました。  x.Cut y だけにしても同様です。つまりペーストしたセルのオブジェクト情報が不定になっているようです。 InputBoxの直後に  ArdsY = y.Address でアドレスを待避しておいて  x.Cut Range(AdreY).Offset(i,0) とすれば正常動作しましたが、どなたか解説していただけませんかね…

naruue
質問者

お礼

ありがとうございました。 大変参考になりました。