- ベストアンサー
エクセルマクロ:範囲の選択
マクロで範囲を指定したいのですが、 dataと名づけたシートA1に例えば8という値、A2に20という値があります。 この数字は他のセルから参照する計算式になっていて再計算をするたびに変わります。 この時、C8:E20の範囲を指定したいのですが、やみくもに Dim c As Integer c = 3 'C列 Range(Cells(Sheets("data").Range("A1").Value, c), Cells(Sheets("data").Range("A2").Value, c + 2)).Select Selection.Copy などと書いてみたのですが、うまくいきません。 どのように記述すればよいか、教えてください、宜しくお願いいたします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
[.Value]を外したら動きましたよ。 Range(Cells(Sheets("data").Range("A1"), c), Cells(Sheets("data").Range("A2"), c + 2)).Select か、 Range("C" & Sheets("data").Range("A1").Value & ":E" & Sheets("data").Range("A2").Value).Select 若しくは、 Dim c As Integer Dim A1 As Long Dim A2 As Long c = 3 'C列 A1 = Sheets("data").Range("A1").Value A2 = Sheets("data").Range("A2").Value Range(Cells(A1, c), Cells(A2, c + 2)).Select
その他の回答 (3)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 特に、大きな問題はないと思いますが、他のシートから行うとエラーが出るかもしれませんね。 たとえば、以下のような初級用のコードでみて分かるように、With ステートメントで、ひとつずつオブジェクトをコンテナ(=親オブジェクトを含める)にして確認してみると良いです。 原因は、親オブジェクトが違ってしまっているからです。 Sub testSample() Dim c As Integer c = 3 'C列 With Sheets("data") .Range(.Cells(.Range("A1").Value, c), .Cells(.Range("A2").Value, c + 2)).Copy End With 'ペースト側 With Worksheets("Sheet2") .Select .Range("B1").Select .Paste End With End Sub ------------------------------------------------- それが了解したら、以下のように分かちがきして、変数を設けて書くとより分かりやすいです。Rangeオブジェクトの中で計算する場合、オブジェクトのプロパティを入れるよりも、変数にしたほうが分かりやすいです。ただし、A1,A2は、0が入るとエラーが発生しますので、たとえば、以下の場合は、If lngRow1 * lngRow2 = 0 Then Exit Sub などとすると良いです。 Sub testSample2() Dim lngRow1 As Long Dim lngRow2 As Long Dim intCol As Integer intCol = 3 'C列 With Sheets("data") lngRow1 = .Range("A1").Value lngRow2 = .Range("A2").Value .Range(.Cells(lngRow1, intCol), .Cells(lngRow2, intCol + 2)).Copy _ Worksheets("Sheet2").Range("B1") 'コピー&ペースト End With End Sub
お礼
Wendy02さん、いつもありがとうございます。 ご指摘の通り他のシートから引っ張ってきていることから生じたエラーのようです。 変数を定義するやり方で解決いたしました。
- fly_moon
- ベストアンサー率20% (213/1046)
A1とA2はどんな式なんでしょう? SUMでやってみたら上記のソースそのままで動きましたけど。
お礼
ありがとうございます、シートが複数あってそこから引っ張っているのでそのあたりの問題のようでした。
- zap35
- ベストアンサー率44% (1383/3079)
With WorkSheets("data") Range(.Cells(.Range("A1").Value, "C"), .Cells(.Range("A2").Value, "E")).Copy End With とか With WorkSheets("data") .Range("C" & .Range("A1").Value & ":E" & .Range("A2").Value).Copy End With でもよいと思います。シートが複数ある時はシートを明示しないとうまく動かなくなることがあります
お礼
ありがとうございます、うまくいきました。
お礼
ありがとうございます、2番目のやり方でうまくいきました。