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

ご教授ください。

このQ&Aに関連する最新のQ&A

A 回答 (9件)

まず


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

書き忘れました。

^^;
>グラフを描くための範囲選択をしたいのですが
グラフですから縦横に項目がついてますね?
空白行は存在しないので 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

ごめんなさい


勘違いです
    • 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に関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QRangeクラスのSelectメソッドが失敗しました。

VB5.0でExcel97のファイルを作成するプログラムを作成しています。
今まで順調にエクセルのほうで、コピーしたり移動したりしていたんですが
以下のようなエラーが出るようになってしまいました。
何のタイミングで出てきたかがわからないので困っています・・。

Exsheet1にアクティブシートを設定しています。
(1)の範囲をコピーして(2)の部分を先頭に貼り付けようとしています。

(1)ExSheet1.Range("A6:Z6").Copy
(2)ExSheet1.Range("A7").Select
(3)ExSheet1.Paste

(2)で、「Range クラスの Select メソッドが失敗しました。」
というエラーが出ます。

前後を詳しく書いていないので、わかりにくいと思いますが
こういったエラーが出る場合の対処方法など教えてください。
よろしくお願いいたします!

Aベストアンサー

エクセルのVBA中だけでは下記はコピーをすることを確認しました。
Sub test01()
Set ExSheet1 = Worksheets("sheet1")
ExSheet1.Range("A6:Z6").Copy
ExSheet1.Range("A7").Select
ExSheet1.Paste
' ActiveSheet.Paste
End Sub
私は前からExSheet1.Range("A7").Pasteのようなのが出来ないのに、そう書いてエラーを起こし、なぜSheetに貼りつけなければ行けないのか不思議だったです。ActiveSheet.Pasteでもだめでしょうね。

QEXCELのVBAでRange("A1:C4")を変数にする方法を教え

EXCELのVBAでRange("A1:C4")を変数にする方法を教えて下さい。

Sub Sample1()
Range("A1:C4").Borders.LineStyle = True
End Sub

上のマクロの"A1:C4"を変数にして成立させるにはどのように設定すればいいのでしょうか?
以下の方法ではエラーになってしまうので、宜しくお願いします。

Sub Sample1()

HENSU = Chr(34) & "A1" & ":" & "C4" & Chr(34)
Range(HENSU).Borders.LineStyle = True
End Sub

Aベストアンサー

こんなので好いですか?
下記をモジュールシートへ貼り付けて試行してみて下さい。

Sub Sample2()
Dim HENSU As String '←変数の宣言をします。

HENSU = Chr(34) & "A1" & ":" & "C4" & Chr(34) ' ""A1:C4"" を返します。←NG
HENSU = "A1" & ":" & "C4" ' "A1:C4" を返します。←OK
HENSU = "A1:C4" ' "A1:C4" を返します。←OK
Range(HENSU).Borders.LineStyle = True ' HENSUの範囲に罫線を引きます。
End Sub

Q変数の一括代入

VBをはじめたばかりなんですが、COBOLだと例えば、

01 DATA-AREA.
  03 DATA-1     PIC 9(02).
  03 DATA-2     PIC X(02).
  03 DATA-3     PIC 9(02).
01 WORK-AREA.
  03 WORK-DATA   PIC X(06).
.....
というレコードがあるとすると

  MOVE WORK-DATA  TO DATA-AREA.
で、DATA-1からDATA-3まで代入できると思いますが、VBではこういうことはできるのでしょうか?

Aベストアンサー

VBだけの機能ならInt Longの仕様どおりしか出来ませんが・・・

APIとの併用ならバイト数を指定してのメモリコピーが可能です。
またVarPtr、StrPtr、ObjPtrなどでアドレスを見ることも可能です。

QRange("A" & x) + Range("A" & x+1) +

Range("A" & x) + Range("A" & x+1) + Range("A" & x+2) + ・・・ + Range("A" & x+n)

x:変数(基準点)
n:定数(A列のセルをいくつ足し併せるか、を指定。)


上記プログラムをループ的に行うには、どういう書き方をすれば良いでしょうか?
Do ~ Loop 文 などを使うのでしょうか。

お詳しい方、教えて下さい。
必ずお返事致します。

Aベストアンサー

>上記プログラムをループ的に行うには、どういう書き方をすれば良いでしょうか?
>Do ~ Loop 文 などを使うのでしょうか。
との質問には、#1のuruzさんが言われているように、For Nextが適していると思います。

ただ回す考え自体を除外してもよいのであれば、Sum関数を利用した方が、エリアが広い時は高速に処理を行う事が出来ます。


Option Explicit

Private Const x As Long = 1
Private Const N定数 As Long = 65535

Sub Test()
  Dim dbl1 As Double
  Dim dbl2 As Double
  Dim cur結果

  '----------------
  ' 検証1(回す)
  '----------------
  dbl1 = Now
  cur結果 = サンプル1(N定数)
  dbl2 = Now
  MsgBox "サンプル1(回す):" & cur結果 & vbTab & "計測時間" & dbl2 - dbl1

  '----------------
  ' 検証2(Sum)
  '----------------
  dbl1 = Now
  cur結果 = サンプル2(N定数)
  dbl2 = Now
  MsgBox "サンプル2(Sum):" & cur結果 & vbTab & "計測時間" & dbl2 - dbl1
End Sub

Function サンプル1(n As Long) As Currency
  Dim i As Long
  For i = 0 To n
    サンプル1 = サンプル1 + Range("A" & x + i)
  Next i
End Function

Function サンプル2(n As Long) As Currency
  Dim rng始点 As Range
  Dim rng終点 As Range
  Dim rng範囲 As Range
  
  Set rng始点 = Range("A" & x)
  Set rng終点 = rng始点.Offset(n)
  
  Set rng範囲 = Range(rng始点, rng終点)
  サンプル2 = WorksheetFunction.Sum(rng範囲)
End Function

>上記プログラムをループ的に行うには、どういう書き方をすれば良いでしょうか?
>Do ~ Loop 文 などを使うのでしょうか。
との質問には、#1のuruzさんが言われているように、For Nextが適していると思います。

ただ回す考え自体を除外してもよいのであれば、Sum関数を利用した方が、エリアが広い時は高速に処理を行う事が出来ます。


Option Explicit

Private Const x As Long = 1
Private Const N定数 As Long = 65535

Sub Test()
  Dim dbl1 As Double
  Dim dbl2 As Double
  Dim cur結果

  '...続きを読む

QVB6-標準モジュールとの変数の受け渡し

VB6の初心者です。ごく初歩的な問題でお恥ずかしいのですが困っています。

標準モジュール内にある以下のサブルーチンを行わせるために、

Sub Transform(NumSamples As Long, RealIn() As Double, ImageIn() As Double, RealOut() As Double, ImagOut() As Double, Optional InverseTransform As Boolean = False)

(NumSamples、RealIn()、ImageIn()は入力値)
(RealOut()、ImagOut()は戻り値)
...
...

End Sub

フォームモジュール内で以下のようにコールすると、

Private Sub cmdStart_Click()
Dim A as Long
Dim B(10000) as Double
Dim C(10000) as Double
Dim D(10000) as Double
Dim E(10000) as Double
...
(A,B,Cに数値入力)
...
Call Transform(A, B(), C(), D(), E(), False)
End Sub

で実行すると、変数D()に対して「コンパイルエラー:型が一致しません:配列またはユーザ定義型を指定してください」が出ます。なお、配列は10000まで宣言していますが実際には0~4096を使っています。

変数型は合わせているはずなのになぜエラーになるのでしょうか。D(),E()の型宣言をPublicにして標準モジュール内に入れたり、いろいろやってみたつもりですがうまくいきません。

よろしくお願いします。

VB6の初心者です。ごく初歩的な問題でお恥ずかしいのですが困っています。

標準モジュール内にある以下のサブルーチンを行わせるために、

Sub Transform(NumSamples As Long, RealIn() As Double, ImageIn() As Double, RealOut() As Double, ImagOut() As Double, Optional InverseTransform As Boolean = False)

(NumSamples、RealIn()、ImageIn()は入力値)
(RealOut()、ImagOut()は戻り値)
...
...

End Sub

フォームモジュール内で以下のようにコールすると、

Private Sub cmdStart_...続きを読む

Aベストアンサー

回答ではないのですが、
試しにVB6 SP4で下記のコードを書いて実行してみましたが、正常に動作しました。
このソースでも同じエラーが出ますか?
もしエラーにならなければ、宣言の方法や構造以外の問題だと思います。

== Form1のcmdStartボタンイベント ============-
Private Sub cmdStart_Click()
  Dim A As Long
  Dim B(10000) As Double
  Dim C(10000) As Double
  Dim D(10000) As Double
  Dim E(10000) As Double

  A = 4096

  For i = 0 To (A - 1)
    B(i) = i
    C(i) = i
  Next

  Call Transform(A, B(), C(), D(), E(), False)
 
  For i = 0 To (A - 1)
    Debug.Print D(i)
    Debug.Print E(i)
  Next

End Sub
==============================================


== Module1のTransform()関数 ==================
Sub Transform( _
  NumSamples As Long, _
  RealIn() As Double, ImageIn() As Double, _
  RealOut() As Double, ImagOut() As Double, _
  Optional InverseTransform As Boolean = False)

  For i = 0 To (NumSamples - 1)
    RealOut(i) = RealIn(i)
    ImagOut(i) = ImageIn(i)
  Next

End Sub
==============================================

回答ではないのですが、
試しにVB6 SP4で下記のコードを書いて実行してみましたが、正常に動作しました。
このソースでも同じエラーが出ますか?
もしエラーにならなければ、宣言の方法や構造以外の問題だと思います。

== Form1のcmdStartボタンイベント ============-
Private Sub cmdStart_Click()
  Dim A As Long
  Dim B(10000) As Double
  Dim C(10000) As Double
  Dim D(10000) As Double
  Dim E(10000) As Double

  A = 4096

  For i = 0 To (A - 1)
    B(i) = ...続きを読む


人気Q&Aランキング

おすすめ情報