- ベストアンサー
エクセルマクロの行選択
複数行選択するマクロで Rows("1:10").Select の括弧の中に変数を入れたいのですがうまくいきません。"や&を使ってみたのですがいまいちわかりません。 よろしくお願いします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 回答は、すでに出ていますが、当分は、Rows(i &":" & j).Select のような書き方でよいと思います。(VB系以外の人からみると、かなり乱暴な書き方に見えるようですが、これが、VB系の利点でもあります。自動キャスティングで、i も j も、& ":" &で、文字になってしまうのですから。) 他の書き方で、Rangeオブジェクトを使う方法は、その上位オブジェクトが見えていないと、実行時エラーを起こします。Rangeオブジェクトのプロパティは、その中に、Rangeオブジェクトを入れられますが、外と中のオブジェクトとは、一切のつながりがありませんから、ミスをしやくすなります。だから、私は、With ステートメントを使います。 With ActiveSheet .Range(.Cells(i, 1), .Cells(j, 1)).EntireRow.Select End With また、今回のような場合は、 Rows(i).Resize(k).Select i で行を決めたら、k は、それから何行という書き方で、Resize プロパティを使うことが多いです。
その他の回答 (5)
- imogasi
- ベストアンサー率27% (4737/17069)
一旦文字列にセットしてみると、VBAのありがたさがわかる Sub test01() Dim s As String i = 5 j = 10 s = i & ":" & j Rows(s).Select Selection.Delete End Sub ーー Sub test02() i = 10 Range("A" & i).Select End Sub が可能なのと一緒。 しかしどっこい Sub test03() Dim s As String i = "A" J = 10 s = i & J Worksheets("Sheet1").Range(s).Select End Sub ーーー Sub test04() Dim i As String i = "A10" Worksheets("Sheet1").Range(i).Select End Sub はエラーになる。
お礼
ありがとうございます。 test04は間違えてやってしまいそうです。 大変参考になりました。 また機会がありましたらよろしくお願いします。
- Yosha
- ベストアンサー率59% (172/287)
>自動キャスティングで、i も j も、& ":" &で、文字になってしまうのですから。とは?簡単に教えてください。 Rows()は、数値(変数を含む)で使用するときは、対象は1行です。範囲を対象とするときは、括弧の中は文字列で表現しなければなりません。例えば「Rows("1:10")」のようにです。 このなかの数字を変数で扱いたいときに、Rows("i:j")や、Rows("i" & ":" & "j")としてもi、jが変数として機能しなくてうまくいきません。しかし、本来の使い方とは違うけれども、もしRows(数値変数1 & ":" & 数値変数2)という形で使えるならば便利ではないかと考えるようになります。 これを実現させたのが、EXCELの自動キャスティングです。 EXCELは、事前に変数を定義していても、状況によって、数値として取り扱うのか、文字として取り扱うのかを判断し、そのときだけ一時的に内部で変数の「値」を文字列とか、数値とかに変換処理して実行しています。 ちなみに、 Dim a As Integer, b As Integer a = 1: b = 2 Cells(1, 1).Value = a + b Cells(2, 1).Value = a & b または Range("A1") = a + b Range("A2") = a & b を実行してみてください。セル"A1"に"3"、セル"A2"に"12"が入りました。 即ち、数値として定義した変数[a][b]を、セル"A1"では数値として、セル"A2"では文字列としてEXCELが自動的に変換して処理したわけです。 この機能は、便利な面と、定義通りに動いてくれないためにエラーを誘う可能性があるという迷惑な面とがあります。 このあたりのことを、Wendy02さんがANo.2でおっしゃっています。
お礼
ありがとうございます。 =が【等しい】と【代入】を自動で区別している見たいなものなんですね。 大変参考になりました。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは #3の回答者です。 >今回とは違う使い方もあるようで?です。→" & 変数 & " と考えるとややこしくなります。 「" & 変数 & "」 は、「"文字列" & 変数 & "文字列"」 という組み合わせです。 「&」は、文字列と文字列をつなぐ演算子。「"文字"」は、「""」のセットで、本当の文字扱いになるわけです。 そうはいっても、複雑なものに対して、誰もが、それを一回で書けるとは思えません。 たとえば、 ret = WorksheetFunction.Substitute(TextLine, """", "") こんなスタイルがあります。---「""」を取り除け --- という意味です。つまり、「""」を『""』で囲んでいます。 これ以上複雑な内容などは、イミディエイト・ウインドウ(Debug.Pring)の使い方を覚えたりして、チェックしていくしかないと思います。 (註:余計な突っ込みされると嫌なので、それは、あくまでも、基本の規則だけの話です。他の言語を応用した場合などは、除きます。)
お礼
ありがとうございます。 「"文字列" & 変数 & "文字列"」と書かれればなるほどそうかとわかりましたが、""の中に(が入っていたせいでわかりづらく、変な使い方があると勘違いしてしまいました。大変参考になりました。ありがとうございました。
- Yosha
- ベストアンサー率59% (172/287)
Range(Rows(変数a), Rows(変数b)).Select Rows(変数a & ":" & 変数b).Select 上の式のほうが、使い易いようです。 Rangeオブジェクトの括弧内を、Rowsプロパティ、Columnsプロパティ、Cellsプロパティに変えるだけで、同じフォーマットで使えるので覚え易く、利用範囲も広がります。
お礼
ありがとうございます。 Range(Rows(変数a), Rows(変数b)).Select 確かに使いやすいです。 &”の使い方がいまいちよくわかっていないのでこっちのほうがいいです。 また機会がありましたらよろしくお願いします。
- n-jun
- ベストアンサー率33% (959/2873)
Dim i As Long Dim j As Long i = 4 j = 12 Rows(i & ":" & j).Select MsgBox "とか" i = 16 j = 22 Range(Cells(i, 1), Cells(j, 1)).EntireRow.Select こうゆう感じの事でしょうか?
お礼
ありがとうございます。 Rows(i & ":" & j).Select これです。 また機会がありましたらお願いします。
お礼
ありがとうございます。 &”の使い方がいまいちよくわかりません。 >自動キャスティングで、i も j も、& ":" &で、文字になってしまうのですから。 とは?簡単に教えてください。 今回とは違う使い方もあるようで?です。→" & 変数 & "