プロが教えるわが家の防犯対策術!

複数行選択するマクロで
Rows("1:10").Select
の括弧の中に変数を入れたいのですがうまくいきません。"や&を使ってみたのですがいまいちわかりません。
よろしくお願いします。

A 回答 (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 プロパティを使うことが多いです。
    • good
    • 1
この回答へのお礼

ありがとうございます。
&”の使い方がいまいちよくわかりません。

>自動キャスティングで、i も j も、& ":" &で、文字になってしまうのですから。
とは?簡単に教えてください。
今回とは違う使い方もあるようで?です。→" & 変数 & "

お礼日時:2007/11/22 07:48

一旦文字列にセットしてみると、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
はエラーになる。
    • good
    • 0
この回答へのお礼

ありがとうございます。
test04は間違えてやってしまいそうです。
大変参考になりました。
また機会がありましたらよろしくお願いします。

お礼日時:2007/11/30 07:50

>自動キャスティングで、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でおっしゃっています。
    • good
    • 0
この回答へのお礼

ありがとうございます。
=が【等しい】と【代入】を自動で区別している見たいなものなんですね。
大変参考になりました。

お礼日時:2007/11/30 07:47

こんにちは



#3の回答者です。

>今回とは違う使い方もあるようで?です。→" & 変数 & "

と考えるとややこしくなります。

「" & 変数 & "」 は、「"文字列" & 変数 & "文字列"」 という組み合わせです。

「&」は、文字列と文字列をつなぐ演算子。「"文字"」は、「""」のセットで、本当の文字扱いになるわけです。

そうはいっても、複雑なものに対して、誰もが、それを一回で書けるとは思えません。

たとえば、
ret = WorksheetFunction.Substitute(TextLine, """", "")

こんなスタイルがあります。---「""」を取り除け --- という意味です。つまり、「""」を『""』で囲んでいます。

これ以上複雑な内容などは、イミディエイト・ウインドウ(Debug.Pring)の使い方を覚えたりして、チェックしていくしかないと思います。

(註:余計な突っ込みされると嫌なので、それは、あくまでも、基本の規則だけの話です。他の言語を応用した場合などは、除きます。)
    • good
    • 0
この回答へのお礼

ありがとうございます。
「"文字列" & 変数 & "文字列"」と書かれればなるほどそうかとわかりましたが、""の中に(が入っていたせいでわかりづらく、変な使い方があると勘違いしてしまいました。大変参考になりました。ありがとうございました。

お礼日時:2007/11/30 07:42

Range(Rows(変数a), Rows(変数b)).Select



Rows(変数a & ":" & 変数b).Select

上の式のほうが、使い易いようです。

Rangeオブジェクトの括弧内を、Rowsプロパティ、Columnsプロパティ、Cellsプロパティに変えるだけで、同じフォーマットで使えるので覚え易く、利用範囲も広がります。
    • good
    • 0
この回答へのお礼

ありがとうございます。
Range(Rows(変数a), Rows(変数b)).Select
確かに使いやすいです。
&”の使い方がいまいちよくわかっていないのでこっちのほうがいいです。
また機会がありましたらよろしくお願いします。

お礼日時:2007/11/22 07:40

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
こうゆう感じの事でしょうか?
    • good
    • 0
この回答へのお礼

ありがとうございます。
Rows(i & ":" & j).Select
これです。
また機会がありましたらお願いします。

お礼日時:2007/11/22 07:36

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!