初歩的な質問ですが、よろしくお願いします。
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基礎編」および「同 コントロール・関数編」で勉強していますが解決しません。
ご教授ください。
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使わなかったかも?
No.2
- 回答日時:
データに空白セルを含まなければ↓
Range("A10").CurrentRegion.Select
含むなら↓
Range(Range("A10"), Range("B65536").End(xlUp).Address).Select
なるほど。
そういえば、CurrentRegionは本にもありました!
これなら短くてすっきりしますね。
Rangeを使う場合は、Rangeの中でRangeを使って指定すればいいんですね。
アドレスを参照するので、Addressを使うと。
Addressの代わりに、ついSelectを使いたくなってしまいます。
ありがとうございました。
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
この書式に当てはめただけです。
ありがとうございます。
両方ともうまく動きました。
分かりやすい説明も勉強になります。
一つ分からないのですが、
Set StopCell = Range("B65536").End(xlUp)
としたときに、StopCellには「数値」が代入されています。
これは、ステップインで実行しながら確認しました。
このとき、StopCellは単なる数値なので、
StopCell.Address
は意味をなさないような気がします。(実際は動作するのですが・・)
なぜ「"$B$99"などの文字を返す」のでしょうか。
(2)の方法も、StopCellが数値だとおかしいと思います。
No.4のapril21さんが指摘しているように、
>「セルアドレスを指定しなければいけないのにセルの値になってる」
ように見えますが・・・
正常に動作しますが、いまいち納得できません。
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
(^^)/~~~
ありがとうございます。
Valueは省略できるのですね。
気をつけます。
>間違えてるのはセルアドレスを指定しなければいけないのにセルの値になってるからです。
それなら納得できますが、実際にはNo.3TAGOSAKU7さんの回答でも動作しますし・・・
april21さんのソースは両方とも正しく動作しました。
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)の方法を説明]内にあります。
ありがとうございます。
>Range(Range("A10"), StopCell).Select はNGです。
これも、正常に動作しました。
このソースは正しいのでしょうか、間違っているのでしょうか。
間違っているけど、動くのでしょうか。
StopCellに数値が代入されているにも関わらず動作することにも疑問を感じます。
[(1)の方法を説明]をもう少し詳しく説明していただけないでしょうか。
あ、でもあまり無理なさらずに。
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の構造を見てみてはいかがでしょう。
すこしイメージがつかめるかも?
やっとわかりました!!
各宣言による違い、理解しました。
ステップインで確認すると数値が表示されるのは、
Dim A as Range
Set A=Range("$B$99")
としたとき、
変数 A には「セルB99への参照」が入っている。
したがって、変数 A の中身を見ることは、すなわち、セルB99の中身を見る、ということですね。
結果として数値が見えますが、変数に数値が代入されているわけじゃなかったんですね。
これなら納得です。
回答No.3で書いて頂いたソースも意味が理解できました。
感謝です。
ありがとうございます!!
No.8
- 回答日時:
>それなら納得できますが、実際にはNo.3TAGOSAKU7さんの回答でも動作しますし・・・
SETステートメントを見逃してました。(>_<) <TAGOSAKU7さん
私の書いたのはSETは使わなかったので混同してました。すみませんm(__)m
>Range(Range("A10"), StopCell).Select はNGです。
>理由は3番の回答の[(1)の方法を説明]内にあります。
#6の補足要求は↑の事についてなのでしょうか?それとも質問者に対して?
>april21さんのソースは両方とも正しく動作しました。
という事なので・・・。
では、(^^)/~~~
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Web画面の文字をVB6で取得したい
-
Excel 範囲指定スクショについ...
-
VBA 入力箇所指定方法
-
【VBA】カーソルのある行の1行...
-
VBA ユーザーフォーム ボタンク...
-
エクセルVBAにて =A1=B1とすれ...
-
【ExcelVBA】インデックスが有...
-
Excelについて
-
VBA 別ブックからコピペしたい...
-
VBA 別ブックから条件に合うも...
-
配列のペースト出力結果の書式...
-
Excelで画像URLを1つずつセル...
-
Excel VBA 文字列のセルを反映...
-
VBA 指定した回数分、別シート...
-
ExcelVBAのFindFirstエラ...
-
VBA 複数の各シートに行を追加...
-
10行目にフィルターを使用して...
-
Outlookの「受信日時」「件名」...
-
Excel VBAで値を変えながら、pd...
-
メールの件名をデコードしたい
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA 別ブックからコピペしたい...
-
Vba ファイル書き込み時に書き...
-
Excel_VBAについて質疑です。(...
-
VBAの間違い教えて下さい
-
VBA コードどこがおかしいですか?
-
VBA 円グラフ 特定条件に一致し...
-
VBA 別ブックから条件に合うも...
-
pdfファイルの複数添付 引数の型
-
【ExcelVBA】インデックスが有...
-
ExcelVBAマクロで実行した時の疑問
-
Vba UserformからExcelシートの...
-
VBA初心者です。次のVBAコード...
-
Outlookの「受信日時」「件名」...
-
Excel 範囲指定スクショについ...
-
vbs ブック共有を解除
-
配列のペースト出力結果の書式...
-
Excel VBAで値を変えながら、pd...
-
VB.net(VB)で、フォームにExcel...
-
vbaにてseleniumを使用したedge...
-
ExcelVBA シート名を複数セルか...
おすすめ情報