• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:列、行番号などをDebug.Printするには?.)

Excel VBAでDebug.Printしてセルの情報を取得する方法

MarcoRossiItalyの回答

回答No.2

一度の質疑応答のみで全てを伝え切ることはムリですが、初級者の方の導入として 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 = 値 というふうに、ワークシートというオブジェクトを省略しないで書きます。英単語の単複を間違えないでください。

maamaa
質問者

お礼

深夜にありがとうございます VBAの教科書のようなアドバイスに感謝いたします ご指摘のとおり、オブジェクトとかプロパーティー、メソッド等がまだ頭の中であやふやの常態でして 整理ができていません この基本を理解しないで、サンプルプログラムを探しているという N88とかクイックベーシックの時と同じ手法でやっているので なかなか進歩しません いちいちマクロの変数を変えずに、シートで定義してそれを読み込もうとしているのですが これはこれで、エラー処置等がうまくいきません 「保護しないで削除させない」を夕方からやっているのですが ギブアップしました 教えていただきましたことは私のVB教科書として、またじっくり読ませていただきます ありがとうございました

関連するQ&A

  • SelectionChangeイベント 文字列エラ

    エクセルvbaなのですが セルをクリックしたときに、該当する値ならメッセージを表示させる際に Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Value = 1Then MsgBox "" End If End Sub ならエラーにならずに動くのに Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Value = "運賃" Then MsgBox "" End If End Sub のように文字列にすると、型が一致しません。 と言うエラーになります。 If Target.Value = "運賃" Then の時でも、空白セルや数値が入ったセルをクリックした際はエラーになりません。 どのような型にすればいいのでしょうか? 実際、「運賃」と言う値が入ってるセルをクリックしても同じエラーが発生します。

  • あるセルの値を別のセルを参照する際の行番号や列番号として使用したい

    あるセルに入っている値を別のセルを参照する際の行番号や列番号として使用したいのですが、可能でしょうか? たとえば、A1に10、A2に20と入っていたら、10行目の20列目の値を取得するようなことがしたいです。 マクロを使えばできそうですが、マクロを使わずにできる方法があれば教えてください。

  • VBA 指定値に最も近い値のセルの行番号は?

    A列に数値が昇順で並んでます。指定の値に最も近い値が並んでるセルの行番号を知りたいのです。 WorksheetFunction.vlookupを使うと、値は分っても行番号はわからない筈です。 Cells.Find().Row を使うと、行番号はわかりますが「最も近い」値はわからない筈です。 マクロを組め!との御指摘があるかも知れませんが、便利な関数があるのならそれで済ませたいです。何かありませんか?無ければ諦めます。

  • 行番号と列番号が見えない?

    列番号や行番号の上をクリック(または 全セル選択)して列や行を選択すると「A,B,C・・・」「1,2,3」といった文字や数字が真っ白で見えなくなります。 特に不都合はないのですが、できれば元通りに反転した状態に戻したいのですが・・・。 よろしくお願いしま~す!

  • AccessのDebug.Printで…

    以下のようなことをしています。 condValue = "(Val(Mid(T_テーブル.値,9)) between " & Val(Me!Value_1) & " and " & Val(Me!Value_2) & ")" Debug.Print condValue (テーブルの「値」はテキスト形式) これで、イミディエイトウィンドウに表示されると、 (Val(Mid(T_テーブル.値,9)) between 1 and 9) のような感じです。 Me!Value_1とMe!Value_2のところは、ちゃんと数値に置き換わっているのに、テーブルのところがかわってませんよね。 やっぱりテーブルは値がたくさんあって、ひとつひとつ当てはめていくわけにいかないからこのような表記になるのでしょうか? ちょっと不安になってしまったもので。。。 また上記のcondValueの書き方はあっているでしょうか?

  • 列番号をクリックすると、列番号が凹んで真っ白になる

    Excel2000を使っています。 列番号や行番号をクリックすると、列番号が凹んだ状態になり、真っ白になります。中のセルはいつもどおりですが、列番号だけ、凹んで真っ白な状態です。 A列の列番号をクリックすると、Aという文字は消えて、列番号が凹んで真っ白です。 何か設定でも有るのでしょうか?

  • 他のシートの任意の列に1行おきに表示する

    よろしくお願いします。 下の構文ですと Worksheets("入力")の3列目5行目以降のデーターが Sheet2の同じ列(3列目)5行目以降に1行おきに表示されます。 これを Worksheets("入力")の3列目5行目以降のデーターを Sheet2の7列目5行目以降に1行おきに表示したいのですが どのように書き直せばよいでしょうか。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim i As Long, j As Long j = 5 With Worksheets("入力") For i = 5 To .Cells(Rows.Count, 3).End(xlUp).Row .Rows(i).Copy Worksheets("Sheet2").Cells(j, 1) j = j + 2 Next i End With End Sub

  • Debug.Writeで困っています(VB2008)

    お世話になります。 VB2008ExpressEditionの勉強を始めました。 本を読みながら進めているのですが、 Debug.Write "テスト" でイミディエイトウインドウに"テスト"と表示されるはずですが なにも表示されません。実際のテストコードは以下です。 Private Sub BUTTON1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BUTTON1.Click  Debug.Write("テストWrite")  Debug.Write("")  Debug.Print("Printテスト")  MessageBox.Show("テスト") End Sub メッセージボックスは表示されますが、イミディウィトウインドウにはなにも表示されません。何か特別な設定が必要なのでしょうか? OSはVista HomePremium(64bit)です。 初歩的な質問で恥ずかしいのですがよろしくお願いいたします。

  • awkで項目番号ごとに行を列に並べる

    [入力ファイル] a  10   1 b  10   2 c  10   3 d  10   4 a  20   5 b  20   6 c  20   7 d  20   8 a  30   9 b  30   0 c  30   1 d  30   2 を、2列目の項目番号を行、1列目の記号を列として (エクセルのピボットテーブルのようなイメージです) 以下のように並べ替えたいのです。 [出力ファイル] No.  a  b  c  d 10  1  2  3  4 20  5  6  7  8 30  9  0  1  2 これをawkスクリプトで書きたいのですが、 どのように書けばよいでしょうか? ※下記2点は希望ですが、難しければ非対応でも大丈夫です。  ・入力ファイルの1行目は一応abcdの順番にきれいに並んでいるものですが   順番がabdcなどとずれていても処理できるスクリプトにしたいです。  ・出力後のabcdの列順序は、スクリプトを修正することで   自由に変更できるとさらに助かります。 教えてください。 よろしくお願いいたします。

  • 特定の列が再計算された時に実行するマクロ

    excelで、特定の列に計算式(SUM)が入っています。 その列が再計算され、結果が1より大きくなったら、そのセルと同じ行の、他の列の値を変更するマクロを作りたいと思っております。 Worksheet_Calculateだと、再計算されたセルを特定できないと伺いました。 なので、再計算されたセルと同じ行で、他の列の値を変更することができません。 Worksheet_Changeだと計算式による変化は扱えないようなので・・・。 このような場合、どうすればいいか教えていただけないでしょうか。 よろしくお願いいたします。