初歩的な質問ですが、よろしくお願いします。
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と関連する良く見られている質問

Q「試験範囲」は英語でなんといいますか?

「試験範囲」は英語でなんといいますか?

どの辞書を調べてもthis test covers pages 30-42 のようにしかのっていません。

学校で試験範囲が書かれたプリントのタイトル部分は、一体どのような表現となるのが、英語圏で一般的なのでしょうか。お教えください。

Aベストアンサー

「範囲」とはちょっとニュアンスが違うのだけれど、試験に出る項目のリストには、"exam objectives" とか"Study guide"等と書かれています。
 
学期を通しての試験範囲や試験の日程が書かれたものは"exam schedule" とか "test schedule" と書かれています。
 
黒板の板書や口頭でテスト範囲を発表する場合は、"Test #3 will cover from chapter 5 to chapter 10."等です。 

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でもだめでしょうね。

Q一般に「英語」というときの言葉の概念の範囲について

一般に「英語」というときの言葉の概念の範囲について

日常生活において、「英語」というとき
いわゆる「英語」の他に
慣用的にフランス語やドイツ語などの外国語(特にヨーロッパ圏の言語)のことも含めて
「英語」と呼び慣わす場合があるような気がするのですが。。。

自分の思い過ごしでしょうか?

Aベストアンサー

・・・というよりは、白人が外国語を話していたら、「英語」ときめつけてしまう
風潮がある、ということでしょう。本当はフランス語やドイツ語かもしらないのに。
あるいは、白人が道にまよっていて親切心がある人がつい「英語」で話しかけて
しまうかもしれません。本当は英語は片言で、スペイン語やイタリア語が
自分のことばかもしれないのに。

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「実行時エラー 9 インデックスが有効範囲にありません」を英語で連絡したい

VBで作ったソフトで良く出る、
実行時エラー 9 インデックスが有効範囲にありません
というエラーを、開発元に伝えたいのですが、

くだんのソフトがアメリカ製英語ソフトになっています。

アメリカの開発元へ、エラーを伝えてあげたいのですが、
MS日本で翻訳した「実行時エラー 9 インデックスが有効範囲にありません」
というエラーメッセージの、本国英語版メッセージが、どういう文面なのか
わからず困っています。

一応、Microsoft Technetも探してみたのですが、私の力量ではお手上げです。

どなたか英語版の原文エラーメッセージをご存知の方、
または、日本語エラーメッセージの原文対訳サイトをご存知の方、
などいらしてましたら、どうか助けてください。

Aベストアンサー

No.4です。
目的がVisual Basicで
>「実行時エラー 9 インデックスが有効範囲にありません」を英語で連絡したい
なら、どのバージョンでも
Run-time error 9 Subscript out of range
だと思います。

ランタイムがインストールされていなければ、Visual Basicは実行できないと思います。
そのプログラムのインストール時かそれ以前にインストールされていると思います。

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などでアドレスを見ることも可能です。

Q英語とスペイン語は現在完了形の守備範囲が違いますか?

たった今話し相手が言ったことを聞き取れなかったとき、What did you say? と[過去形で]聞き返すのが、英語。
Que has dicho? と[現在完了形]で聞き返すのが、スペイン語。このように観察しました。もっとアカデミックな?言い方で説明すると、どんな風に言えますか?英語とスペイン語では現在完了形の守備範囲が違うのでしょうか?

Aベストアンサー

守備範囲は基本的には同じで、どちらも完了、結果、経験、継続を表すのに現在完了形を使います。
スペイン語の方が、過去形、現在完了形の区別を話し手の感情に依存しており、英語よりも用法がフレキシブルです。

例えばスペイン語では極端な話、5年前に起こった出来事を描写する文に現在完了を用いても間違いにはなりません。
分かり易い例を挙げると
Mi abuelo ha muerto hace cinco anos.
など。話し手が今でもおじいさんが亡くなった事を引きずっているんですね。
単純に事実を描写する場合は Mi abuelo murio hace cinco anos. です。

余談ですが、スペインのガリシア地方ではガリシア語に現在完了形が存在しないため
他の地域で完了形を用いる文にも過去形を用いる傾向が強いです。

それに比べると英語の完了形は時を表す副詞(句)によって過去形、現在完了形が明確に分かれています。
現在完了形は明確に過去を表す語句、Yesterdayとか、five years ago等と一緒には使えません。
現在を含む副詞(句)、today、this morning 等は現在完了形を使います。
但し、最近の過去の一時点を表す場合には過去形を用います。

ご質問の What did you say? が What have you said? とならないのは上記の「最近の過去の一時点を表す」場合にあたるのではないでしょうか。

守備範囲は基本的には同じで、どちらも完了、結果、経験、継続を表すのに現在完了形を使います。
スペイン語の方が、過去形、現在完了形の区別を話し手の感情に依存しており、英語よりも用法がフレキシブルです。

例えばスペイン語では極端な話、5年前に起こった出来事を描写する文に現在完了を用いても間違いにはなりません。
分かり易い例を挙げると
Mi abuelo ha muerto hace cinco anos.
など。話し手が今でもおじいさんが亡くなった事を引きずっているんですね。
単純に事実を描写する場合は Mi a...続きを読む

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結果

  '...続きを読む

Q「できる範囲でお手伝いします」を英語で

こんにちは。

「私のできる範囲で助けます」
「私の知ってる範囲で助けます」
みたいな言い方は、英語ではどういいますか?
I do help you as I can. とかでいいんでしょうか?
よろしくお願いします。

Aベストアンサー

I'll help you as much as I can.

<参考>
http://tatoeba.org/eng/sentences/show/464753

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ランキング