アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

ご教授ください。

A 回答 (9件)

書き忘れました。

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

ありがとうございます。

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

考えても解決しないようならまたお世話になると思いますので、その際はよろしくお願いします。

お礼日時:2001/10/24 23:12

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


SETステートメントを見逃してました。(>_<) <TAGOSAKU7さん
私の書いたのはSETは使わなかったので混同してました。すみませんm(__)m

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

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

では、(^^)/~~~
    • good
    • 0
この回答へのお礼

ありがとうございます。

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

お礼日時:2001/10/24 23:07

まず


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の構造を見てみてはいかがでしょう。

すこしイメージがつかめるかも?
    • good
    • 0
この回答へのお礼

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

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

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

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

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

感謝です。
ありがとうございます!!

お礼日時:2001/10/24 23:03

ごめんなさい


勘違いです
    • good
    • 0

april21さんの回答に誤りがあります。



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

ありがとうございます。

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

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

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

あ、でもあまり無理なさらずに。

お礼日時:2001/10/23 22:10

>このとき、変数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

(^^)/~~~
    • good
    • 0
この回答へのお礼

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

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

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

april21さんのソースは両方とも正しく動作しました。

お礼日時:2001/10/23 22:06

失礼しました。


最近仕事が忙しくて・・・・半分寝てる状態で質問を読んでいたので、質問の意味を間違えて答えました。


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
この書式に当てはめただけです。
    • good
    • 0
この回答へのお礼

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

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

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

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

お礼日時:2001/10/23 22:05

データに空白セルを含まなければ↓



Range("A10").CurrentRegion.Select

含むなら↓
Range(Range("A10"), Range("B65536").End(xlUp).Address).Select
    • good
    • 0
この回答へのお礼

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

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

ありがとうございました。

お礼日時:2001/10/23 22:03

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使わなかったかも?
    • good
    • 0
この回答へのお礼

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

お礼日時:2001/10/23 22:02

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