• ベストアンサー

エクセルVBA:範囲選択について

初歩的な質問ですが、よろしくお願いします。 Excel2000です。 グラフを描くための範囲選択をしたいのですが、うまくいきません。 状況は、 ・列A、列Bにデータが入っている。(データの数はAB同じで2行以上) ・開始点は一定。(ここでは、行10と仮定します) ・終了点が変化する。(但し、終了点は常に一番下のデータ) これだけです。 一番下のデータを参照するので、 Range("A10 : Range("B10").End(xlDown)").Select Range("A10 : Range("B65536").End(xlUp)").Select Range("A10 : Cells(ActiveSheet.Rows.Count, 2).End(xlUp)").Select と書きましたが、全てダメでした。 直接書くのがダメなら変数を使おうと思い、 Dim StopCell as Range Set StopCell = Range("B65536").End(xlUp) Range("A10 : StopCell").Select と書きましたが、ダメでした。 このとき、変数StopCellには「セル」ではなく、「セルの値」が代入されているようです。 Valueと書いていないのに値が代入されていること、オブジェクト変数なのに数値が代入されていることが納得できません。 どこをどのように間違えているのでしょうか。 また、目的のマクロはどのようになるのでしょうか。 大村あつし著「かんたんプログラミングExcel2000VBA基礎編」および「同 コントロール・関数編」で勉強していますが解決しません。 ご教授ください。

  • vdx
  • お礼率93% (45/48)

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

  • ベストアンサー
  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.7

まず Dim StopCell as Range って宣言してますね? これが理解に困難にしている原因だと思います。 Range("A1") というのがあったとき、 (一)Range("A1").Value (二)Range("A1") という二つの意味があります。 これは使用する状況に合わせて変化します。 仮にデータの最終がB99だったとき Set StopCell = Range("B65536").End(xlUp) とすると StopCell=Range("$B$99") と同じ扱いになります。 もし Dim A as String A=Range("$B$99") としたときは、Range("$B$99").Value を返します。 これは文字列を求めているとPCが判断して、セルの値を返します。 宣言を変えて・・・ Dim A as Range Set A=Range("$B$99") としたときは、Range("$B$99")のセルそのものを返します。 つまりは、ユーザの受けの形によってセルそのものを受け取るか、あるいはセルの値を受けてるかをPC側で判断してるのです。 ついでに Dim A as String A=Range("$B$99").Address としたときは、Range("$B$99")のアドレスをそのまま文字列として返します。 ここで注意してほしいのは、「アドレスをただのセルの場所を文字で返す」ということです。 「決してセルそのものの情報をもっているわけではありません」 Rangeの型で宣言してセットされたセルの情報はたくさん存在するのです。 先に挙げた Range(セル範囲の左上隅のセル,セル範囲の右下隅のセル).Select というのはセルの位置だけを渡すのではなく、セルそのものを渡さなければなりません。 一度、ステップイン実行をしながら、StopCell変数を範囲選択して、右クリックでウォッチ式に追加を選択して、ウォッチウィンドウでそのStopCellの構造を見てみてはいかがでしょう。 すこしイメージがつかめるかも?

vdx
質問者

お礼

やっとわかりました!! 各宣言による違い、理解しました。 ステップインで確認すると数値が表示されるのは、 Dim A as Range Set A=Range("$B$99") としたとき、 変数 A には「セルB99への参照」が入っている。 したがって、変数 A の中身を見ることは、すなわち、セルB99の中身を見る、ということですね。 結果として数値が見えますが、変数に数値が代入されているわけじゃなかったんですね。 これなら納得です。 回答No.3で書いて頂いたソースも意味が理解できました。 感謝です。 ありがとうございます!!

その他の回答 (8)

  • april21
  • ベストアンサー率42% (91/216)
回答No.9

書き忘れました。^^; >グラフを描くための範囲選択をしたいのですが グラフですから縦横に項目がついてますね? 空白行は存在しないので CurrentRegionで選択できますのでお勧めです。

vdx
質問者

お礼

ありがとうございます。 範囲選択はお陰様でうまくいったのですが、現在グラフで格闘しているところです。 考えても解決しないようならまたお世話になると思いますので、その際はよろしくお願いします。

  • april21
  • ベストアンサー率42% (91/216)
回答No.8

>それなら納得できますが、実際にはNo.3TAGOSAKU7さんの回答でも動作しますし・・・ SETステートメントを見逃してました。(>_<) <TAGOSAKU7さん 私の書いたのはSETは使わなかったので混同してました。すみませんm(__)m >Range(Range("A10"), StopCell).Select はNGです。 >理由は3番の回答の[(1)の方法を説明]内にあります。 #6の補足要求は↑の事についてなのでしょうか?それとも質問者に対して? >april21さんのソースは両方とも正しく動作しました。 という事なので・・・。 では、(^^)/~~~

vdx
質問者

お礼

ありがとうございます。 やっと意味が理解できました。 april21さんのソースも勉強になりました。

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.6

ごめんなさい 勘違いです

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.5

april21さんの回答に誤りがあります。 >Range("A10 : " & StopCell).Select 又は Range(Range("A10"), StopCell).Select Range("A10 : " & StopCell).Select はOKです。 Range(Range("A10"), StopCell).Select はNGです。 理由は3番の回答の[(1)の方法を説明]内にあります。

vdx
質問者

お礼

ありがとうございます。 >Range(Range("A10"), StopCell).Select はNGです。 これも、正常に動作しました。 このソースは正しいのでしょうか、間違っているのでしょうか。 間違っているけど、動くのでしょうか。 StopCellに数値が代入されているにも関わらず動作することにも疑問を感じます。 [(1)の方法を説明]をもう少し詳しく説明していただけないでしょうか。 あ、でもあまり無理なさらずに。

  • april21
  • ベストアンサー率42% (91/216)
回答No.4

>このとき、変数StopCellには「セル」ではなく、「セルの値」が代入されているようです。 valueプロパティは省略出来る事になってるので一番下のデータのセルの値が代入されます。 (記述が長くなる場合などに用います) 間違えてるのはセルアドレスを指定しなければいけないのにセルの値になってるからです。 Range("A10 : " & StopCell.Address).Select ではセルの値のアドレスとなってしまうので エラーになるのでは? ■変数を用いたものを直すなら Dim StopCell As String StopCell = Range("B65536").End(xlUp).Address Range("A10 : " & StopCell).Select 又は Range(Range("A10"), StopCell).Select (^^)/~~~

vdx
質問者

お礼

ありがとうございます。 Valueは省略できるのですね。 気をつけます。 >間違えてるのはセルアドレスを指定しなければいけないのにセルの値になってるからです。 それなら納得できますが、実際にはNo.3TAGOSAKU7さんの回答でも動作しますし・・・ april21さんのソースは両方とも正しく動作しました。

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.3

失礼しました。 最近仕事が忙しくて・・・・半分寝てる状態で質問を読んでいたので、質問の意味を間違えて答えました。 april21さんが答えた Range(Range("A10"), Range("B65536").End(xlUp).Address).Select がベストだと思います。 先ほどのぼくの発言は無視してください。 ちなみにvdxさんが書いたソースは非常におしい!! もうちょっとがんばったらできたと思いますよ!! どのようにしたらよいかというと   Range("A10 : StopCell").Select となってる部分を   (1)Range("A10 : " & StopCell.Address).Select もしくは   (2)Range(Range("A10"), StopCell).Select とすると動きます。 StopCellは変数ですよね? この場合はRange型ですが、もしIntegerでもLongでもStringでも ""の中に書くと変数ではなくその変数名が文字として扱われます。 (1)の方法を説明 "A10 : StopCell"としたときエクセルはA10~StopCellって? と思ってします。 "A10 : " & StopCell.Address とすると StopCell.Addressは"$B$99"などの文字を返すので、&で連結を行い A10~$B$99を範囲として指定を行います。 (2)の方法の説明   Range(セル範囲の左上隅のセル,セル範囲の右下隅のセル).Select この書式に当てはめただけです。

vdx
質問者

お礼

ありがとうございます。 両方ともうまく動きました。 分かりやすい説明も勉強になります。 一つ分からないのですが、 Set StopCell = Range("B65536").End(xlUp) としたときに、StopCellには「数値」が代入されています。 これは、ステップインで実行しながら確認しました。 このとき、StopCellは単なる数値なので、 StopCell.Address は意味をなさないような気がします。(実際は動作するのですが・・) なぜ「"$B$99"などの文字を返す」のでしょうか。 (2)の方法も、StopCellが数値だとおかしいと思います。 No.4のapril21さんが指摘しているように、 >「セルアドレスを指定しなければいけないのにセルの値になってる」 ように見えますが・・・ 正常に動作しますが、いまいち納得できません。

  • april21
  • ベストアンサー率42% (91/216)
回答No.2

データに空白セルを含まなければ↓ Range("A10").CurrentRegion.Select 含むなら↓ Range(Range("A10"), Range("B65536").End(xlUp).Address).Select

vdx
質問者

お礼

なるほど。 そういえば、CurrentRegionは本にもありました! これなら短くてすっきりしますね。 Rangeを使う場合は、Rangeの中でRangeを使って指定すればいいんですね。 アドレスを参照するので、Addressを使うと。 Addressの代わりに、ついSelectを使いたくなってしまいます。 ありがとうございました。

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.1

Dim lngStartRow As Long Dim lngEndRow As Long lngStartRow = 10 lngEndRow = 20 Sheets(1).Range("A" & lngStartRow & ":B" & lngEndRow).Select でRangeの中に"A10:B20"という文字列を作成してSelectしてあげると範囲指定ができます。 余計かもしれませんがエクセルのグラフにデータ範囲を設定するときはSetSourceDataを使用した気がします。Select使わなかったかも?

vdx
質問者

お礼

お疲れのところ、夜遅くにありがとうございます。

関連するQ&A

  • Excelのセル選択範囲の指定について

    Excelのセル選択範囲の指定について d = Range("A65536").End(xlUp).Row Range("A1:K" & d).Select これでやると A1からk列のデータの最後の(データの入っている行)までを選択しますが このk列というところを n = ActiveSheet.Range("A1").End(xlToRight).Columnを使いKでなくデータのある列nを使った表現に変えたい。どうすればいいか。

  • エクセル2003のVBAの範囲選択について質問です。

    エクセル2003のVBAの範囲選択について質問です。 OSはXPです。 Range("B1:C" & Range("A" & Cells.Rows.Count).End(xlUp).Row).Select この意味は、B1セルからC()の範囲指定をするのに、()をA列の最終行を探すことによって指定する、ということだと思います。いろいろなサイトを参照させてもらいました。 この場合のA列の最終行を探す方法は、A列のデータが歯抜けの場合に正しく探せないので、一旦最終行を探し、そこから上に見に行って最初にデータが入っている行を探している、で正しいと思います。 私が知りたいのは、逆に歯抜けの場合はそこを最終行として指定する方法です。つまり、一旦最終行を探し、上に見に行くのではなく、A列の上から下に見に行って、空白(歯抜け)が見つかったところを最終行と指定する方法です。xlDownを使うのだろう、というところまでは判ったのですが、どうにもその先が判りません。 歯抜けの場合の方がマイナーなのか、この方法を具体例を記載しているサイトを見つけることができませんでした。 よろしくお願いいたします。

  • エクセルVBAで範囲の指定をしたいです(初心者)

    エクセルVBAで範囲の指定をしたいです(初心者) 列AからJがデータが入る範囲です。 列AとBとCには必ず数値等が何かしら入ります。 列Dは常に空白です。 列E以降は何か入ることも入らないこともあります。 7行目までデータがある場合、 A1セルからこの場合はJ7セルまでを範囲指定したいのですが 行数は未定なので、 Range("A1").Select Range(Selection,Selection.End(xlDown)).Select でA列のデータ最終行まで下がり、そこから9つ右の列までを 範囲指定するというのがよくわかりません。 自動記録で絶対参照と相対参照を切り替えてやってみたのですが、 どうしても Range(Selection, Selection.End(xlDown)).Select ActiveCell.Range("A1:J7").Select と常にA1からJ7が指定になってしまいます。 バージョンは2003です。 つたない質問文で申し訳ありませんが、 どなたか宜しくお願いいたします。

  • 【Excelマクロ】 行全体を選択したい

    下記マクロはデータが入っている最終行の次のセル(A列)を選択するマクロです。 但し、A列はデータが入っていないこともあるため、必ずデータが入っているB列をキーにしています。 NT = Cells(Rows.Count, "B").End(xlUp).Row + 1 Range("A" & NT).Select B125までデータが入っていた場合A126にカーソルが置かれますが、本当は126行全体を選択したいのです。 「Range("A" & NT).Select」部分をどのようなマクロに変更したらよろしいでしょうか?

  • Excel VBA 範囲の条件付け

    現在下記のコードを組んでいます。 やりたい事は、sheet1~3で背景色の赤いセルと、 そのセルの上方の最初の空白セルの下3行をsheet4にコピペする。 【下記コードで実現出来ていないこと】 1.背景色が赤いセルとそのスグ上の3行をコピペしてしまう。 2.同じシートに背景色が赤いセルが複数あっても、1つしかコピペしない。 3.sheet4のコピペ先をA3、A13、A23と仮に指定しているが、  sheet1のコピペ内容に1行空けて、sheet2のコピペ内容、  また1行空けて、sheet3のコピペ内容というセル指定にしたい。 以上、よろしくお願い致します。 Sub Test() Dim i As Long, r As Range With Worksheets("sheet1") For i = 1 To .Range("A65536").End(xlUp).Row If .Range("A" & i).Interior.ColorIndex = 3 Then Set r = .Range("A" & i).EntireRow Set r = Union(r, r.End(xlUp).Resize(3).EntireRow) End If Next i End With If Not r Is Nothing Then r.Copy Sheets("Sheet4").Select Range("A3").Select ActiveSheet.Paste With Worksheets("sheet2") For i = 1 To .Range("A65536").End(xlUp).Row If .Range("A" & i).Interior.ColorIndex = 3 Then Set r = .Range("A" & i).EntireRow Set r = Union(r, r.End(xlUp).Resize(3).EntireRow) End If Next i End With If Not r Is Nothing Then r.Copy Sheets("Sheet4").Select Range("A13").Select ActiveSheet.Paste With Worksheets("Sheet3") For i = 1 To .Range("A65536").End(xlUp).Row If .Range("A" & i).Interior.ColorIndex = 3 Then Set r = .Range("A" & i).EntireRow Set r = Union(r, r.End(xlUp).Resize(3).EntireRow) End If Next i End With If Not r Is Nothing Then r.Copy Sheets("sheet4").Select Range("A23").Select ActiveSheet.Paste End Sub

  • EXCEL VBA セルの選択範囲を変化させたい。

    いつもお世話になっております。 Range("E3:E5").Select のようなプロパティで選択するセルの範囲を列、行共に変数で与えたいのですが、 できますでしょうか?

  • エクセルVBAで教えて下さい。

    A1のセルに [ 1- 5] 4.05398e-01 3.63385e-01 -2.22992e-01 9.89158e-03 -6.43695e-02 A2のセルに [ 6-10] -5.12224e-04 4.07480e-04 -2.73746e-04 -1.77853e-02 -2.13805e-03 A3のセルに [11-15] -6.88489e-03 -2.06765e-02 -9.44633e-03 6.97059e-03 -1.28400e-02 と、このような感じでA7セルまで同じ感じでスペースで空いた数値が入力されています。 A8のセルのみ [36-37] -6.39210e-03 -1.55806e-03 と入力されております。 まず行いたいのはスペースが空いてる部分で、それぞれの数値を各セルに分けたいです。 A1のセルに入力されている [ 1- 5] 4.05398e-01 3.63385e-01 -2.22992e-01 9.89158e-03 -6.43695e-02 ならば A1に[1-5] B1セルに4.05398e-01 C1セルに3.63385e-01 のように これをA1からA8のセルで行ったあと指定のセルを30行目に貼り付けます。 E1→A29 C2→B29 D2→C29 E2→D29 E3→E29 F3→F29 B4→G29 D5→H29 E5→I29 F5→J29 貼り付けのデータは増えていきます。つまり、30行目にデータが入ってる場合は そのデータが1行下の行に下がり、新たなデータが30行目に追加されます。 このようにして、データが最大で58行目まで追加される可能性があります。 最小であれば30行目、31行目の2つしかない場合あります。 この時、0の近似値を各列のセルから探し、当てはまるセルを赤く塗り潰すというのが 今回行いたいことです。 A列ならA30~A58までの中で0の近似値を探し、当てはまるセルを赤く塗り潰す。 ただ空白の場合は無視してもらいたいです。0の近似値だと空白が選択されてしまうので。 近似値探しの前までならマクロがありますのでご参照下さい。 Sub Macro4() ' ' Macro4 Macro ' ' Range("A1:A8").Select Selection.TextToColumns Destination:=Range("A1"), DataType:=xlFixedWidth, _ FieldInfo:=Array(Array(0, 1), Array(7, 1), Array(21, 1), Array(34, 1), Array(47, 1), _ Array(60, 1)), TrailingMinusNumbers:=True Range("A1").Select Range("E1").Select Selection.Copy Range("A29").Select ActiveSheet.Paste Range("C2:E2").Select Application.CutCopyMode = False Selection.Copy Range("B29").Select ActiveSheet.Paste Range("E3:F3").Select Application.CutCopyMode = False Selection.Copy Range("E29").Select ActiveSheet.Paste Range("B4").Select Application.CutCopyMode = False Selection.Copy Range("G29").Select ActiveSheet.Paste Range("D5:F5").Select Application.CutCopyMode = False Selection.Copy Range("H29").Select ActiveSheet.Paste Range("J7").Select Application.CutCopyMode = False Range("A29:K29").Select Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove Range("A29:K29").Select With Selection.Interior .Pattern = xlNone .TintAndShade = 0 .PatternTintAndShade = 0 End With Range("A29").Select Range("A1:F8").Select Selection.ClearContents Range("A1").Select Range("K29").Select With Selection.Interior .Pattern = xlNone .TintAndShade = 0 .PatternTintAndShade = 0 End With Selection.NumberFormatLocal = "G/標準" End Sub わかりずらい質問ですみませんが、ご指導の程 お願い致します。

  • VBA 表の1つ下のセルを選択する

    EXCEL2003のVBAを使っています。 オートフィルタで抽出させた表があります。 入力されているセルの、1つ下のセルを選択するにはどうしたら良いでしょうか。     A 1  あああ  2  あああ  5  あああ  1行目から19行目までの列の中で、"あああ"だけをオートフィルタで抽出している 10  あああ  14  あああ   16  あああ  20   ※ ←ここを選択したい。 Range("A65536").Select Selection.End(xlUp).Select ActiveCell.Offset(1, 0).Select これだとA17のセルが選択されてしまいます。 表全体の1つ下のセルを選択する方法はあるでしょうか?

  • 選択範囲に関する質問

    いつもお世話になっております。 初歩的な質問だと思いますが宜しくお願い致します。 リストでA列にデータが並んでいます。BとC列に数字があり、 B列に新しい列を入れて Range("B2").Select ActiveCell.FormulaR1C1 = "=SUM(RC[1]:RC[2])" こちらをAのデータが入ってる行数までペーストさせたいのですが、 どうしたらデータが入ってる行数までペーストさせるマクロを組み込めるでしょうか? Range("A2").End(xlDown).Rowなどで最終行まで調べることは出来るのですが、 Select、Copyの場合はどのように入れたら宜しいでしょうか? 自分で調べてみていろいろやってみましたのですが上手く行きませんでした…

  • エクセルVBAでセル範囲選択→並べ替え

    大きなデータを選択する場合でA列には空白がない場合、 Range("A1").CurrentRegion.Select でいいと思うのですが、このデータを並べ替えようとするとき、1行から4行めには別の文字列がはいっており、5行目以下がデータであるとき、 Range("A1").CurrentRegion.Offset(4).Selectで下にさげると、最終選択範囲も下がってしまいます。 最終の範囲を変えず、開始位置を5行目にかえるにはどうすればよいのでしょうか?

専門家に質問してみよう