• ベストアンサー

Excel VBAの範囲の取得について

Excel VBAを使い、ある範囲に含まれるセル番号を取得しようとしています。 まず、ある範囲、の指定方法から悩んでいます。 ある範囲を、A1:C5とした場合、 1.A1:C5に同じ文字列を入力し、それを判別して同じ範囲内だと判断させる。 2.A1:C5の範囲に名前を付ける。 3.A1:C5のセルを結合する。 などの方法を思いつきました。 それ以降の処理はA1:C5の範囲だと、『左上はA1,右下はC5』という風に、範囲を作っている左上と右下のセル番号を参照するようにしたいと思っています。 分からなくなってしまっているのは、他に範囲として扱いたい数個のセルが別にも幾つかあって、それを最初に認識した範囲とは別物だと扱いたいと思っています。 たとえば、先ほどA1:C5という範囲を決めましたが、D2:E4という別の範囲があるとします。 A1から順に調べて行って、C5までが同じ範囲と判断されたら、また次のひと塊の範囲はないか調べ、D2:E4が見つかったら処理をする、という感じなのですが、一度調べた範囲はもう調べないとする方法が思いつきません。 ひとくくりにしたい範囲は、毎度変わりますし、範囲に含まれるセルの数もまちまちです。 上記の、範囲を決める3つの方法それぞれによって、その後の方法も変わってきそうな感じがするのですが、どれが一番適当な方法かも決めかねています。 範囲指定しようとしているセルが一つのみだった場合、結合している範囲かどうかを調べる方法は使えない気もします。 分かりづらい質問で申し訳ありません。 よろしくお願いいたします。

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

  • ベストアンサー
  • Randomize
  • ベストアンサー率70% (38/54)
回答No.5

補足情報として以下の3こについて解決案を書きます  1.範囲選択の4個目の手段  2.左上と右下の簡単なアドレスの取得方法  3.一度調べた範囲の重複を調べる方法 ○1.範囲選択の4個目の手段 Excelの内蔵機能を使用してExcelに範囲の判断をしてもらう方法があります。しかし、補足画像に示すような弱点もありますので注意してください。 Excelには空白セルであるか何か入力されているセルかを判断してどこまでのセルの範囲を使用しているかを影で取得しています。(?Sheet1.UsedRange とイミディエイトウィンドウに書き込んでEnterを押してみてください) UsedRangeプロパティーは書き込んだ一番右下のセルまでの範囲を返すのですが、これに似たようなプロパティーでCurrentRegionプロパティーというものがあります。 これは、とある基準のセルから上下左右に探していって完全に空白である行と列に当たるまでの範囲を取得するものです。下の図を参照してくださいね。利点としては、その範囲の中に書いてある文字や数式が何でもあってもOKであることです。空白かそうでないかで判断してますしね。逆に空白かそうでないかで判断しているだけですので、間に1セルでも隣接してしまうと、2つの範囲がくっついて認識されてしまいます。補足の図を参考にしてください。しかし、ループなどの下準備なしで範囲を取得できるので弱点を理解して使うと結構便利であると思います。使い方はこうです。 [シート名].Range([アドレス指定]).CurrentRegion アドレス指定したセルを基準にそのセルを含むかそのセルに隣接する範囲をRangeオブジェクトとして取得するものです。 (例)MsgBox Sheet1.Range("A3").CurrentRegion.Address くらいで実験で試されてみると分かりやすいと思います。 ○2.左上と右下の簡単なアドレスの取得方法 kyboとちょっと回答がかぶるのですが、これも比較的簡単に出すことができます。Cellsプロパティーを使いましょう。 kuboさんは.Cells(行番号,列番号)という呼び出し方をしてますが、Cellsプロパティーはもうちょっと面白い使い方があります。範囲を選択したときにRangeオブジェクトの中にはその範囲の数だけ分の情報が格納されます。そして、1から始まって右へ2・3・4・・・と続き、範囲の右端まで来ると1段下へ移動してその一番左から5・6・7・・・と続くのです。 ですので、左上の場合は.Cells(1)で求められ、右下は.Cells([セル範囲].Count)で求められます。 具体的な例を下に書きますね。(使い方を分かりやすくするためにあえてWithステートメントを使用しません。) Set objRange = Sheet1.Range("A1").CurrentRegion '左上の座標を求める AddrLeftX=objRange.Cells(1).Column AddrTopY=objRange.Cells(1).Row '右下の座標を求める AddrRightX=objRange.Cells(objRange.Count).Column AddrBottomY=objRange.Cells(objRange.Count).Row アドレスの文字が欲しい場合は.Addressプロパティーを使ってね 余談:Cellsの括弧の中の数字をセルの数よりも多い数字を指定すると・・・・・・? ○3.一度調べた範囲の重複を調べる方法 これを解決するにはDictionaryオブジェクトを使用するといいです。具体的には検索をしてもらいたいのですが、なにそれ?って場合は「連想配列」で検索してみてください。 あくまで一例なのですが、範囲を取得したときのアドレスをキーワードにしてリストへ保存していきます。次の範囲が見つかったら、リストを見てもらってこの範囲ってリストにあった?と確認して重複をチェックしようとするのが狙いです。 Dictionaryオブジェクトの作り方などはほかのサイトを参照してください。作った後、objDicAddrListと仮に名前をつけると アドレスをリストへ追加するときは objDicAddrList.Add [アドレス文字],[値] という感じに使ってください。アドレス文字はobjRange.Addressで取得できると思います。値は今回の目的では使用しませんので好きな値を入れるなりして有効に使ってあげてください。 そして、調べようとしているアドレスがリストに存在するかを調べるのが objDicAddrList.Exists([調べたいアドレス文字]) です。リストに存在する場合はこれがTrueに、ない場合はFalseが返ってきます。これをIfで判断すると簡単に重複のチェックができます。 以上が説明になります。質問の内容がはっきりしないため、私なりでどういうことがしたくてその時に問題になりそうな部分のみを補足で説明しました。弱点を克服する範囲を求める方法になると、塗りつぶしアルゴリズムなどの使用も必要になってくるでしょう。ですが、塗りつぶしアルゴリズムは非常に説明が長いのでどうしても必要になった時に調べてみてください。では健闘を祈ります。 添付画像は完成まで少々お待ちくださいね。今からささっと作りますゆえ・・・

WANKO_P
質問者

お礼

ご回答ありがとうございました。 また、質問の内容が分かりづらく申し訳ありませんでした。 CADとの連携を考えていたため、具体的にすることにより、回答が得られにくいのではと考えてしまいました。すみません。 ぜひ、参考にさせていただこうと思います。

その他の回答 (4)

  • kybo
  • ベストアンサー率53% (349/647)
回答No.4

結局したいのは >それ以降の処理はA1:C5の範囲だと、『左上はA1,右下はC5』という風に、範囲を作っている左上と右下のセル番号を参照するようにしたいと思っています。 この部分のみなのでしょうか? Sub macro1() With Range("A1:C5") MsgBox "範囲の左上は:" & .Cells(1, 1).Address MsgBox "範囲の右下は:" & .Cells(.Rows.Count, .Columns.Count).Address End With End Sub のようにします。 範囲が複数あった場合、以下のようにします。 Sub macro2() Dim C As Range ’複数範囲を選択したと仮定 Range("A1:D10,G5:I15").Select For Each C In Selection.Areas MsgBox "範囲の左上は:" & C.Cells(1, 1).Address  ’黄色で色を付ける C.Cells(1, 1).Interior.ColorIndex = 6 MsgBox "範囲の右下は:" & C.Cells(C.Rows.Count, C.Columns.Count).Address  ’黄色で色を付ける C.Cells(C.Rows.Count, C.Columns.Count).Interior.ColorIndex = 6 Next C End Sub

WANKO_P
質問者

お礼

ご回答ありがとうございました。 また、質問の内容が分かりづらく申し訳ありませんでした。 CADとの連携を考えていたため、具体的にすることにより、回答が得られにくいのではと考えてしまいました。すみません。 ぜひ、参考にさせていただこうと思います。

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.3

なさりたい事をストレートに書いていただいた方が、なけなしの想像力を酷使しないで済むので助かりますが、 Sub test() Dim myRange(2) As Range Dim i As Long Set myRange(1) = Range("A1:C5") Set myRange(2) = Range("D2:E4") For i = 1 To 2 Debug.Print myRange(i).Address Next i End Sub Sub test2() Dim myRange As Range, myArea As Range Set myRange = Range("A1:C5") Set myRange = Union(myRange, Range("D2:E4")) For Each myArea In myRange.Areas Debug.Print myArea.Address Next myArea End Sub といった事でしょうか。

WANKO_P
質問者

お礼

ご回答ありがとうございました。 また、質問の内容が分かりづらく申し訳ありませんでした。 CADとの連携を考えていたため、具体的にすることにより、回答が得られにくいのではと考えてしまいました。すみません。 ぜひ、参考にさせていただこうと思います。

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.2

何がしたいのか良く解りませんが・・・。 選択範囲(複数)のセル範囲アドレスを知りたいと言うことでしょうか? セル選択範囲の取得 http://www.asahi-net.or.jp/~ef2o-inue/vba_k/sub04_040_07.html

WANKO_P
質問者

お礼

ご回答ありがとうございました。 また、質問の内容が分かりづらく申し訳ありませんでした。 ぜひ、参考にさせていただこうと思います。

  • camputer
  • ベストアンサー率64% (22/34)
回答No.1

 こんにちは. >ある範囲、の指定方法 でしたら,Rangeオブジェクトで作れます. Sub For_WANKO_P()  Dim 範囲 As range  Dim セル As range  Set 範囲 = Worksheets("sheet1").range("A1:C5")  For Each セル In 範囲   MsgBox (セル.Column & "-" & セル.Row)      '「範囲」内にあるすべてのセルの行番号と列番号表示  Next End Sub >ある範囲に含まれるセル番号を取得 については,↑のFor~Nextの要領でいかがでしょう. セルの値自体を取りたい際は,ColumnをValueに変えるとできます. これでやりたいことが出来ればいいのですが..

WANKO_P
質問者

お礼

ご回答ありがとうございました。 また、質問の内容が分かりづらく申し訳ありませんでした。 ぜひ、参考にさせていただきます。

関連するQ&A

  • 文字列をアドレスに変換するには・・?

    VLOOKUP(検索値,範囲,列番号,検索の型)の範囲を指定する時、通常はマウス等で範囲を指定しますが、範囲の左上と右下のアドレスが文字列で、どこかのセルに入っている時、その文字列を使って範囲の情報を作るにはどうしたら良いでしょうか? 例えば、下記のような状況の時 A B C D E 1 1 4 7 A1 C3 2 2 5 8 3 3 6 9 =VLOOKUP(2,A1:C3,3) → 8 となるわけですが、「A1:C3」の部分の情報をD1,E1のセルに入っている文字列から生成したいのです。 ご存知の方がいらしたら、お教え下さい。

  • VBA、セルの選択範囲について

    下記のような表を用意し、   A   B  C  D  E 1    1月 2月 3月 合計 2 Aさん 1  2  3  6 3 Bさん 1  2  3  6 4 Cさん 1  2  3  6 5 合 計 3  6  9  18 セルの範囲選択を指定し別シートの任意のセルへコピーをVBAで行いたいのですが、 Aさん、Bさん、Cさんという範囲を選択する為に、合計という文字は含みたくないので、 Range("A2").Select Range(Selection, Selection.End(xlDown).Offset(-1)).Select と記載し、これは出来ました。 同様に、 1月、2月、3月という範囲も同様にxlToRightを使用し選択出来ました。 Range("B1").Select Range(Selection.End(xlToRight).Offset(, -1), Selection).Select しかし、B2:D4の範囲の指定の仕方がわかりませんでした。 データのレコード数は一定ではないのでB2:D4というように範囲を指定する事は出来ません。 そのときに応じてDさん、Eさんと増えたり、4月、5月と増えたりするので。 何か方法があればご指導お願いします。

  • エクセルの範囲セルの範囲セルについて

    ExcelVBAで、ある範囲のセルを基準として、その範囲の中の範囲を表したい のですが、どうすればよいのでしょうか? 以下のセルで、A1:D2の範囲を使ってA2からD2の範囲を表す方法です。 A1 B1 C1 D1 A2 B2 C2 D2 A2のセルはRange("A1:D2").Cells(2,1)で表すように Range("A2:D2")でなく、Range("A1:D2")を使ってA2からD2の範囲を表す方法が知りたいです。

  • エクセルにて結合セルの範囲を参照するには?

       A B C D E F 1 |フォード| 2 |BMW | 3 |ホンダ | 各行A列~C列3つを結合入力 4 |ルノー | 5 |DFR  | 6 |ベンツ |  上記のようなエンジンメーカー表にて、A1~C1,A6~C6間にF1へエンジンを供給しているメーカー名がA~Cの3つのセルを結合して入力されているとします。  このような表を用いて別のワークシートから、このエンジンメーカーの入力セルの文字列を参照したいのですが、  フォードの場合ですと、=’エンジンメーカー表’!A1:C1と表示され、エラー値VAULEが返され、参照したい文字列が返りません。  結合されている3セルに範囲名をつけてINDIRECT関数で参照すれば出来るのですが、結合セルの項目が多過ぎて、いちいち、名前をつけていられないのです。  また、表のセル結合を崩せないのです。(同じフォーマットで作られている表が多数存在のため) このような単一セルでなく、複数のセル範囲を結合して入力されている文字列を簡単に=で参照する方法は無いでしょうか?

  • ExcelのVBAで複数の範囲を指定したいのですが

     ExcelのVBAの全くの初心者です。(PC全般については、多少はわかるつもりですが)  R1C1参照という形式を使って、複数のセル範囲を色付けするため指定するにはどのようにすれば良いのでしょうか?  例えば、アクティブセルにA25が指定されていて、A4~C7とE4~F10とI4~I8までを色付けしたいなどという場合。  色付けなどは、わかるのですが、複数の範囲指定がわからないのです。よろしくお願いします。

  • EXCEL 行と列を指定して、範囲指定する方法

    EXCELの使い方を教えてください。 関数で試みているのですが、以下のような操作を行うことは可能でしょうか? (マクロ(VBA?)は使用したことがないため、抵抗があります。それでも、マクロを組むしかないというのであればその方法も教えてください。) 「表示シート」にて行と列を指定することで、 結合された5行×5列の表を表示させたいのです。 指定するセルも結合させており(「入力シート」)、 結合されたセル(行/列)を指定して、表示する範囲を決めてやりたいのです。 結合を解いて、たくさんの文字を指定する形にしてしまえば楽かもしれないのですが、この2文字だけで他にもたくさん処理させているため、 指定する文字はこの2文字のみで処理させたいです。 自分なりには、「表示シート」のD10セル(F10まで結合されている)に =INDEX(SUMPRODUCT((入力!B3:B27=表示!D4)*(入力!C2:Z2=表示!D3)),1,2) というような関数を組んでみたのですが、うまく表示されません。 なにか、うまく表示させる方法はあるのでしょうか? ちなみに、表内の犬など狐などは便宜的に書いているだけで、 数字が入るセルか、日付が入るセルか、文字列が入るセルかということだけが汲み取っていただければと思います。 入力するセルと表示させるセルの大きさも異なるようにしたいので、 良い方法があれば教えてください。 よろしくお願いいたします。

  • 指定範囲したセルに含まれる数字が何個あるか調べる方法

    指定範囲したセルに含まれる数字が何個あるか調べる方法 (C1:E4)の範囲に 123 234 012 234 345 123 345 456 234 456 567 345 とあるとします。 この(C1:E4)の範囲のセルに "1"を含むセルが何個あるかをA1に表示させる(例だとA1に3と表示)にはどうしたらいいでしょうか? また、(C1:E4)の範囲に"23"を含むセルが何個あるかをA2に表示させる(例だとA2に5と表示)、 (C1:E4)の範囲に"2"と"4"を含むセルが何個あるかをA3に表示させる(例だとA3に3と表示)、 といった方法はありますでしょうか? また、(C1:E4)で範囲を固定するのでなく、 あるActiveCellから(4:3)の範囲のセルで上記のようなこと行うことは出来ますか? 例だと ActiveCellがC1とすると そこから(4:3)の範囲で(C1:E4)を指定 ActiveCellから(0,-2)の位置がA1 ActiveCellから(1,-2)の位置がA2 ActiveCellから(2,-2)の位置がA3 これが、 ActiveCellがE6になったとすると 範囲で(E6:G9)を指定 ActiveCellから(0,-2)の位置がC6 ActiveCellから(1,-2)の位置がC7 ActiveCellから(2,-2)の位置がC8 といった感じで出来るのでしょうか? 是非ともよろしくお願いします。

  • エクセルでの範囲指定の方法

    エクセルでの範囲指定の方法についての質問です ある一部分の離れたセルのみ除いて範囲指定する方法で、 確か、何かいい方法があったと思うのですが、どうにも思い出せません。 例えば B3・E5・D1からD5 以外のセルのみ範囲指定するとして まず全セル選択ボタンで全部選択して その後、確かコントロールキーを押しながら不要なセルをクリックしていくとできたかとおもうのですが 実際やってみても、1つのセルしかできません。 わかる方教えてください。 説明が下手ですみません。

  • EXCELのVBAでやれますか?

    A1~C1のセルが結合しています。このA1~C1セルに L から始まる文字が入っている場合はその文字をD1にコピー、kから始まる文字が入っている場合はその文字をE1にコピー、と言う事をやりたいのですが、「○○から始まる文字」というのをVBAで出来るのでしょうか?ちなみに当方はVBA超初心者ですので、なるべく解りやすい御回答お待ちしております。

  • エクセルVBAで範囲の指定をしたいです(初心者)

    エクセルVBAで範囲の指定をしたいです(初心者) 列AからJがデータが入る範囲です。 列AとBとCには必ず数値等が何かしら入ります。 列Dは常に空白です。 列E以降は何か入ることも入らないこともあります。 7行目までデータがある場合、 A1セルからこの場合はJ7セルまでを範囲指定したいのですが 行数は未定なので、 Range("A1").Select Range(Selection,Selection.End(xlDown)).Select でA列のデータ最終行まで下がり、そこから9つ右の列までを 範囲指定するというのがよくわかりません。 自動記録で絶対参照と相対参照を切り替えてやってみたのですが、 どうしても Range(Selection, Selection.End(xlDown)).Select ActiveCell.Range("A1:J7").Select と常にA1からJ7が指定になってしまいます。 バージョンは2003です。 つたない質問文で申し訳ありませんが、 どなたか宜しくお願いいたします。

専門家に質問してみよう