こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

エクセル VBAマクロ セルの単純移動

基本的な質問ですが、よろしくお願いします。

エクセルのVBAで、Selectセルを1つだけ上下左右に移動させることを
”汎用的に書く”としたらどのようにすれば良いでしょうか?

例えば、Selectセルを一番上や、一番下、へというのであれば、
Selection.End(xlUp).Select
Selection.End(xlDown).Select
一番右や、一番左なら、
Selection.End(xlToRight).Select
Selection.End(xlToLeft).Select
のように書いて、実行できます。

それでは、今いる所のすぐ隣りのセルへ移動させるということを
同じように表現するには、どのようにしたら良いでしょうか。

事の発端は、
マクロの自動記録を使って、セルを移動していっても、
Range("A1").Select
Range("B1").Select
Range("B2").Select
Range("C2").Select
Range("C3").Select
:

のように、絶対セル位置で記録されてしまうため、
同じような処理を順に隣りや後の行・列に向かって繰り返すような処理を
書こうとしたときに、汎用的には動いてくれないところからです。

参考になるページを自力では見つけられませんでした。よろしくお願いします。

投稿日時 - 2006-06-29 11:36:43

QNo.2245113

困ってます

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

Sub test()
Selection.Offset(1, 0).Select
End Sub

(1, 0)の数値を変えればいかようにでも動かせます。

投稿日時 - 2006-06-29 11:47:30

お礼

求めていたのはこれです!
ありがとうございました!
こういうのをヘルプなどで探すコツってあるのでしょうか。
とりあえず、もうさっき詰まっていた処理は終わりました。
即答ありがとうございました。

投稿日時 - 2006-06-29 12:55:45

このQ&Aは役に立ちましたか?

16人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

#2です。補足に関して
例データ Sheet1
01xyz02abc
03def0445607vbn
05pqr06123
08dfgh

コード 標準モジュール
Sub teast01()
Dim sh1 As Worksheet
Dim sh2 As Worksheet
Set sh1 = Worksheets("sheet1")
Set sh2 = Worksheets("sheet2")
k = 2
d = sh1.Range("A65536").End(xlUp).Row
MsgBox d
For i = 1 To d
r = sh1.Cells(i, "IV").End(xlToLeft).Column
MsgBox r
For j = 1 To r Step 2
sh2.Cells(k, "A") = sh1.Cells(i, j)
sh2.Cells(k, "B") = sh1.Cells(i, j + 1)
k = k + 1
Next j
Next i
End Sub
結果
Sheet2
01xyz
02abc
03def
04456
07vbn
05pqr
06123
08dfgh
それにしても、当初質問から、うかがい知れない問題を質問していたわけですね。
色々質問で自分のやり方を固執し説明するより、適切な例と、結果を例示して、やり方は回答者に任せて、良いと思う回答を真似するのが良いです。

投稿日時 - 2006-06-30 19:33:59

補足

よく見たら、最初が3列でも対応できていますね!
素晴らしい!また別のときにでも使えそうです。
ありがとうございます。

投稿日時 - 2006-07-01 00:56:00

お礼

なるほど!別のシートに作成するという考え方があったのですね。
ご指摘ありがとうございました。
何となく自分で「ここまでは解けるのだけど」と右往左往して、
途中まで考えたつもりだったのですが、
そもそも根本的に何がしたいかで、ぜんぜん違う観点の考え方も
あるんだ、という感じで、二重に勉強になりました。
具体的なコードも含め、何度もありがとうございました。

投稿日時 - 2006-07-01 00:54:47

ANo.3

Activeなセルの移動は、Offsetプロパティが便利ですが、繰返し処理で汎用的に動かしたいというニーズを実現するためには、imogasiさまのおっしゃるとおりCellsプロパティを多用することをお勧めします。
Rangeプロパティのようにセル範囲を特定することはできませんが、引数に変数を使うことで、利用の幅が大きく広がります。

投稿日時 - 2006-06-30 07:30:45

お礼

はい。ありがとうございました。

投稿日時 - 2006-06-30 16:08:27

ANo.2

>今いる所のすぐ隣りのセルへ移動させるということを
同じように表現するには、どのようにしたら良いでしょうか
セルを移動させるというより、
>同じような処理を順に隣りや後の行・列に向かって繰り返すような処理を書こうとしたときに
なら
対象セルを移動して処理を続けるのは
For i=1 to 3
cells(i,"A")=1
Next i
のように行を変数化・相対化して1づつ増やせばよい。
マクロの記録からの飛躍・脱出の第1歩です。
>Selectセルを1つだけ上下左右に移動させることを
これは、イベントと組合さなければならないことに気づいていますか。
ボタンをクリックしたら下へ移動するは昨日質問がありました。
このことを言いたいのではないでしょう。質問の表現が正確でないから誤解を生じます。
ーー
例えば
A1からA10セルまで、値が30より大きければ、セルに色をつけたい
のような質問をすればよい。

投稿日時 - 2006-06-29 21:33:27

補足

ご指摘も含めて、ありがとうございました。

元々やりたかったこととしては、

?
…┌───┬───┬───┬───┐
 │01 │xyz │02 │abc │
…├───┼───┼───┼───┤
 │03 │def │04 │456 │
…├───┼───┼───┼───┤
 │05 │pqr │06 │123 │
…└───┴───┴───┴───┘

 ↓次のように整形する↓

 ┌───┬───┐
 │01 │xyz │
 ├───┼───┤
 │02 │abc │
 ├───┼───┤
 │03 │def │
 ├───┼───┤
 │04 │456 │
 ├───┼───┤
 │05 │pqr │
 ├───┼───┤
 │06 │123 │
 └───┴───┘
(枠が崩れてしまうようで、ご容赦ください)

?の開始列位置が不定な状態で、

カーソルを「02 - abc」の位置に持っていってから、

★「02 - abc」をカットする
←左←左↓下移動し、
1行開けて(Selection.EntireRow.Insert)
そこへペースト
再び右→右→下↓移動し、そこで終了。

続けて動かせば、再び★から走り出す。

というようなものを作ろうとしていました。
マクロをボタンに割り付けて、順次押していき、
編集の状況を見ながら、1行づつ整形させたいなと思っていました。

そこで、
←左←左↓下移動
再び右→右→下↓移動

というようなことを1コマづつ動かせないかな、
for文でCell(x,y)位置を回すとしても、固定値になってしまうしなぁ、
と思ったのが発端でした。

何れにしましてもありがとうございました。

投稿日時 - 2006-06-30 16:05:54

あなたにオススメの質問