- ベストアンサー
Excel VBAでDebug.Printしてセルの情報を取得する方法
- Excel VBAのDebug.Printを使用してセルの情報を取得する方法を教えてください。
- Debug.Printを使用することで、セルの行番号や列番号を取得することができます。
- また、マウスで選択したセル範囲の情報も取得することができます。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
○何をしたいのか →何かを「選択した」ときに、その選択した(された)モノの情報を調べたい ⇒どうしたら良いのか (方法1:セル範囲等) 選択されたモノに紐づいている「イベントプロシジャ」(自動起動マクロ)が存在している場合は、それを使って「選択されたモノ」それ自体を取得、情報を取り出す (方法2:たとえば図形等) 選択されたモノにイベントが紐づいていない場合、手動マクロを起動し、「今選択されているモノ」の情報を取り出す ○方法1の具体的な展開の基本 例えばセル範囲の場合: 選択される可能性のあるセル範囲としては、次の状況が考えられます 一個のセルを選択した場合 ヒトカタマリの(矩形の)セル範囲 とびとびのセル範囲 列を1列あるいは複数列(カタマリ・とびとび) 行を1行あるいは複数行(カタマリ・とびとび) これらのケースは、いずれもWorksheet_SelectionChange(あるいはWorkbook_SheetSelectionChange)イベントによって取得できます。具体的に何を選択した時、イベントが何を取得しているのかケースごとに調べたり、あるいは具体的なマクロでどう処理を進めるのか漏れなく考えなければいけません。 手順: シート名タブを右クリック、コードの表示を選ぶ 現れたシートに下記をコピー貼り付ける private sub Worksheet_SelectionChange(byval Target as excel.range) msgbox target.address end sub 上述したようなさまざまな「セルの選び方」に応じて、具体的に何が(どのようなタイミングで)targetに取得されたか、(回答をフンフン読んで分かった気になるんじゃなくて)実際にあなたの手を動かして確認してください。 ○ご質問の具体的な回答 練習用のイベントプロシジャを消去、改めて下記をコピー貼り付ける private sub Worksheet_SelectionChange(byval Target as excel.range) debug.print target.address, debug.print target.areas.count, debug.print target.row, debug.print target.rows.count, debug.print target.column, debug.print target.columns.count end sub
その他の回答 (1)
- MarcoRossiItaly
- ベストアンサー率40% (454/1128)
一度の質疑応答のみで全てを伝え切ることはムリですが、初級者の方の導入として No.1 さんが、こうしてみたらどうですか?というのを掲載されているので、そのとおりに実行してみてください。 質問 1 ~ 4 などに関連してお役に立つかもしれない情報を提供します。ベストアンサーは辞退します。 マクロなり VBA について学び始めるに当たり、まずは「オブジェクト」と「プロパティ」という概念について調べてください。オブジェクトは「(画面に表示されるとは限らない概念的な)物」を意味します。アプリケーション、ウィンドウ、ワークシート、セル範囲、Debug などはオブジェクトの例です。プロパティはオブジェクトが持つ値であり、属性とも和訳されます。値というのは例えば数値とか文字列ですが、他にも、オブジェクト(への参照)を返すプロパティもあります。つまりそうした例において、親オブジェクトが持つあるプロパティは、子オブジェクトを返すことになります。 初級者がプロパティと混同しやすいものとして「メソッド」がありますが、これはオブジェクトの操作を意味します。Debug オブジェクトに Print メソッドを指示すると、イミディエイトウィンドウ内にデータを出力します。 プロパティは名詞や形容詞である英単語になっていることが多いです。メソッドは、動詞が多いです。どちらも絶対ではありませんが。 オブジェクト.プロパティ オブジェクト.メソッド という書き方をすることになっています。オブジェクト.プロパティはオブジェクトを返すことがあるという話でしたから、 オブジェクト.プロパティ.プロパティ という形になることも考えられます。ただ特に指定する必要がない場合、オブジェクト.(オブジェクト修飾子)は省略できることもあります。このことは、質問文にある「前に何か付いたり」という疑問への解答になると思います。指定する必要がない場合とは、現在アクティブになっているオブジェクトが指定されているものとして自動的に扱われる場合とか、単に書いても書かなくても許されるという VBA の文法における一部の例外などの場合です。 学習における基本的な心構えとしては、分からないことがあったら、ヘルプでイチイチ調べるようにしてください。その積み重ねにより、「次第に」理解が深まっていきます。最初は多分、読んでいても分からない情報のほうが多いかもしれません。インターネットでの検索も補助的に使っていいと思います。 >質問1 マクロは Private Sub Worksheet_SelectionChange(ByVal Target As Range) に書けばいいのでしょうか? その書き出しはイベントドリブンなプロシージャであり、ワークシートというオブジェクトにおいて発生するイベントに関して記述します。そのシートにおける SelectionChange(セルなどの選択範囲の変更)というイベントに反応して自動的に動き出します。要するに、他のシートなどにおいては働かない機能を開発するということです。シートモジュールとも呼ばれる画面に書きます。この画面は、ワークシートのタブ(シート見出し)を右クリックすることでも表示できます。 「マクロ」ダイアログから実行する、あるいはボタンなどを押したときに実行されるプロシージャの場合は、VBE(Visual Basic Editor)画面の左端に表示されるプロジェクトエクスプローラに右クリックから「標準モジュール」などを作製し、そこに記述します。 >質問2 知りたいのは、シート左端の行番号をクリックしたときに得られる値で行番号とか他に分かる値すべて知りたいです(Debug.Printしたいです) 質問3 同じく、列のABCD等をクリックした時に得られる値で列番号とか、他に得られるすべての数値をDebug.Printしたいです 質問4 あるセル範囲をマウスで選択した時も同様に得られる数値を知りたいです Debug.Print 値 と記述します。ここで指定する値としては、オブジェクトのプロパティが数値、文字列などであれば、それを持ってくることができます。No.1 さんの例で言えば、target.address(オブジェクト変数 Target に格納されているセル範囲であるオブジェクトの Address プロパティである文字列)などが該当します。 このメソッドをイミディエイトウィンドウで実行し、イミディエイトウィンドウに出力するという場合は、上のコードを書いてももちろん機能しますが、次のように書くこともできます。 ?値 いずれを書く場合も、イミディエイトウィンドウ内では Sub とか End Sub は不要で、これらの 1 行だけを書いて Enter すれば実行されます。 全部ヘルプに書いてありますが、Range オブジェクトは、セル範囲を表すオブジェクト。Worksheet.Rows あるいは Range.Rows プロパティは、その Worksheet あるいは Range に属する全ての行の集合であるオブジェクトであり、これも Range オブジェクトの一種です。Worksheet. あるいは Range. を省略して単に Rows と書くと、ActiveSheet.Rows と同等となり、そのシート内の全ての行を表します。Rows("2:6") は、そのシートの 2 ~ 6 行目という行の集合であるオブジェクト。Rows("2:6")(4) は、そのシートの 2 ~ 6 行目のうち上から 4 番目である行、すなわちそのシートの 5 行目というオブジェクト(英単語は複数形で書きますが、単数のオブジェクト)。Range.Row プロパティは、その Range に属する最初の行の行番号(したがって整数)である数値。 オブジェクトとプロパティの区別が重要であるということがお分かりいただけたでしょうか。Rows はオブジェクトで、Range.Row は数値であるプロパティです。全部ヘルプに書いてあります。数値ということは、プロシージャ内で、各種の計算に使うこともできることになりますね。 ちなみにイミディエイトウィンドウではなく、シートに値を書き出していきたいという場合は、 Range("a1").Value = 値 あるいは Cells(3, 2).Value = 値 というふうに、セルの Value プロパティに代入することで実現します。これをループの構文と組み合わせれば、何千行も記入していくこともできますね。ActiveSheet 以外のシートに記入したければ、 Worksheets("シート名").Range("a1").Value = 値 というふうに、ワークシートというオブジェクトを省略しないで書きます。英単語の単複を間違えないでください。
お礼
深夜にありがとうございます VBAの教科書のようなアドバイスに感謝いたします ご指摘のとおり、オブジェクトとかプロパーティー、メソッド等がまだ頭の中であやふやの常態でして 整理ができていません この基本を理解しないで、サンプルプログラムを探しているという N88とかクイックベーシックの時と同じ手法でやっているので なかなか進歩しません いちいちマクロの変数を変えずに、シートで定義してそれを読み込もうとしているのですが これはこれで、エラー処置等がうまくいきません 「保護しないで削除させない」を夕方からやっているのですが ギブアップしました 教えていただきましたことは私のVB教科書として、またじっくり読ませていただきます ありがとうございました
お礼
ありがとうございます いつもマクロそのものを教えてもらっていては進歩しないので Debug.printで得られる値を見ながらIF文を書いてみようと思い 質問しました 確かに、必要なときに教えてもらったマクロを少し手直しするという 私のやり方では進歩しません 反省しています
補足
早速やってみました 目的の値がすべて取得出きています 貴重な時間に、長文で教えていただいて恐縮です 親切に教えていただきありがとうございました