OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

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

  • 暇なときにでも
  • 質問No.155812
  • 閲覧数313
  • ありがとう数9
  • 気になる数0
  • 回答数9
  • コメント数0

お礼率 93% (45/48)

初歩的な質問ですが、よろしくお願いします。
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基礎編」および「同 コントロール・関数編」で勉強していますが解決しません。

ご教授ください。
通報する
  • 回答数9
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.7
レベル12

ベストアンサー率 65% (276/422)

まず
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

お礼率 93% (45/48)

やっとわかりました!!
各宣言による違い、理解しました。

ステップインで確認すると数値が表示されるのは、

Dim A as Range
Set A=Range("$B$99")

としたとき、
変数 A には「セルB99への参照」が入っている。
したがって、変数 A の中身を見ることは、すなわち、セルB99の中身を見る、ということですね。
結果として数値が見えますが、変数に数値が代入されているわけじゃなかったんですね。

これなら納得です。
回答No.3で書いて頂いたソースも意味が理解できました。

感謝です。
ありがとうございます!!
投稿日時 - 2001-10-24 23:03:13
-PR-
-PR-

その他の回答 (全8件)

  • 回答No.3
レベル12

ベストアンサー率 65% (276/422)

失礼しました。 最近仕事が忙しくて・・・・半分寝てる状態で質問を読んでいたので、質問の意味を間違えて答えました。 april21さんが答えた Range(Range("A10"), Range("B65536").End(xlUp).Address).Select がベストだと思います。 先ほどのぼくの発言は無視してください。 ちなみにv ...続きを読む
失礼しました。
最近仕事が忙しくて・・・・半分寝てる状態で質問を読んでいたので、質問の意味を間違えて答えました。


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

お礼率 93% (45/48)

ありがとうございます。
両方ともうまく動きました。
分かりやすい説明も勉強になります。

一つ分からないのですが、
Set StopCell = Range("B65536").End(xlUp)
としたときに、StopCellには「数値」が代入されています。
これは、ステップインで実行しながら確認しました。

このとき、StopCellは単なる数値なので、
StopCell.Address
は意味をなさないような気がします。(実際は動作するのですが・・)
なぜ「"$B$99"などの文字を返す」のでしょうか。

(2)の方法も、StopCellが数値だとおかしいと思います。
No.4のapril21さんが指摘しているように、
>「セルアドレスを指定しなければいけないのにセルの値になってる」
ように見えますが・・・
正常に動作しますが、いまいち納得できません。
投稿日時 - 2001-10-23 22:05:44


  • 回答No.2
レベル11

ベストアンサー率 42% (91/216)

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

Range("A10").CurrentRegion.Select

含むなら↓
Range(Range("A10"), Range("B65536").End(xlUp).Address).Select
お礼コメント
vdx

お礼率 93% (45/48)

なるほど。
そういえば、CurrentRegionは本にもありました!
これなら短くてすっきりしますね。

Rangeを使う場合は、Rangeの中でRangeを使って指定すればいいんですね。
アドレスを参照するので、Addressを使うと。
Addressの代わりに、ついSelectを使いたくなってしまいます。

ありがとうございました。
投稿日時 - 2001-10-23 22:03:54
  • 回答No.1
レベル12

ベストアンサー率 65% (276/422)

Dim lngStartRow As Long Dim lngEndRow As Long lngStartRow = 10 lngEndRow = 20 Sheets(1).Range("A" & lngStartRow & ":B" & lngEndRow).Select ...続きを読む
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

お礼率 93% (45/48)

お疲れのところ、夜遅くにありがとうございます。
投稿日時 - 2001-10-23 22:02:41
  • 回答No.4
レベル11

ベストアンサー率 42% (91/216)

>このとき、変数StopCellには「セル」ではなく、「セルの値」が代入されているようです。 valueプロパティは省略出来る事になってるので一番下のデータのセルの値が代入されます。 (記述が長くなる場合などに用います) 間違えてるのはセルアドレスを指定しなければいけないのにセルの値になってるからです。 Range("A10 : " & StopCe ...続きを読む
>このとき、変数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

お礼率 93% (45/48)

ありがとうございます。
Valueは省略できるのですね。
気をつけます。

>間違えてるのはセルアドレスを指定しなければいけないのにセルの値になってるからです。

それなら納得できますが、実際にはNo.3TAGOSAKU7さんの回答でも動作しますし・・・

april21さんのソースは両方とも正しく動作しました。
投稿日時 - 2001-10-23 22:06:58
  • 回答No.5
レベル12

ベストアンサー率 65% (276/422)

april21さんの回答に誤りがあります。 >Range("A10 : " & StopCell).Select 又は Range(Range("A10"), StopCell).Select Range("A10 : " & StopCell).Select はOKです。 Range(Range("A10& ...続きを読む
april21さんの回答に誤りがあります。

>Range("A10 : " & StopCell).Select 又は Range(Range("A10"), StopCell).Select
Range("A10 : " & StopCell).Select はOKです。
Range(Range("A10"), StopCell).Select はNGです。
理由は3番の回答の[(1)の方法を説明]内にあります。
お礼コメント
vdx

お礼率 93% (45/48)

ありがとうございます。

>Range(Range("A10"), StopCell).Select はNGです。

これも、正常に動作しました。
このソースは正しいのでしょうか、間違っているのでしょうか。
間違っているけど、動くのでしょうか。

StopCellに数値が代入されているにも関わらず動作することにも疑問を感じます。
[(1)の方法を説明]をもう少し詳しく説明していただけないでしょうか。

あ、でもあまり無理なさらずに。
投稿日時 - 2001-10-23 22:10:12
  • 回答No.8
レベル11

ベストアンサー率 42% (91/216)

>それなら納得できますが、実際にはNo.3TAGOSAKU7さんの回答でも動作しますし・・・ SETステートメントを見逃してました。(>_<) <TAGOSAKU7さん 私の書いたのはSETは使わなかったので混同してました。すみませんm(__)m >Range(Range("A10"), StopCell).Select はNGです。 >理 ...続きを読む
>それなら納得できますが、実際にはNo.3TAGOSAKU7さんの回答でも動作しますし・・・
SETステートメントを見逃してました。(>_<) <TAGOSAKU7さん
私の書いたのはSETは使わなかったので混同してました。すみませんm(__)m

>Range(Range("A10"), StopCell).Select はNGです。
>理由は3番の回答の[(1)の方法を説明]内にあります。
#6の補足要求は↑の事についてなのでしょうか?それとも質問者に対して?

>april21さんのソースは両方とも正しく動作しました。
という事なので・・・。

では、(^^)/~~~
お礼コメント
vdx

お礼率 93% (45/48)

ありがとうございます。

やっと意味が理解できました。
april21さんのソースも勉強になりました。
投稿日時 - 2001-10-24 23:07:30
  • 回答No.6
レベル12

ベストアンサー率 65% (276/422)

ごめんなさい 勘違いです
ごめんなさい
勘違いです
  • 回答No.9
レベル11

ベストアンサー率 42% (91/216)

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

お礼率 93% (45/48)

ありがとうございます。

範囲選択はお陰様でうまくいったのですが、現在グラフで格闘しているところです。

考えても解決しないようならまたお世話になると思いますので、その際はよろしくお願いします。
投稿日時 - 2001-10-24 23:12:13
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ