- ベストアンサー
マクロの変数のことで
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"がゼロになるとエラーになってしまうのでしょうか? 指定したセルを基点にして貼り付けられるようにするには、どうすればいいでしょうか?
- みんなの回答 (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
その他の回答 (3)
- papayuka
- ベストアンサー率45% (1388/3066)
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
お礼
ありがとうございました。 大変参考になりました。
- NCU
- ベストアンサー率10% (32/318)
「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
お礼
ありがとうございました。 大変参考になりました。
- zap35
- ベストアンサー率44% (1383/3079)
試してみましたが x.Cut y.Offset(0, 0) を実行直後 yは<オブジェクトが必要です>の状態になってしまっていました。 x.Cut y だけにしても同様です。つまりペーストしたセルのオブジェクト情報が不定になっているようです。 InputBoxの直後に ArdsY = y.Address でアドレスを待避しておいて x.Cut Range(AdreY).Offset(i,0) とすれば正常動作しましたが、どなたか解説していただけませんかね…
お礼
ありがとうございました。 大変参考になりました。
お礼
ありがとうございました。 大変参考になりました。