SAK 図書館
Excel VBA (その一) 変数、定数、ダイアログ、マクロ
■グローバル変数の定義 ・Excel でグローバル変数を使用する場合は、標準モジュールの General で public 宣言する必要があります。 シートやフォームのモジュールで宣言してもエラーにはなりませんが、グロ ーバルとして扱えません。 また、ブックをまたいでのグローバル変数の宣言と言うのもできません。 【宣言方法】 public 変数名 as 変数タイプ ■グローバル定数の定義 ・グローバル変数に同じです。 【宣言方法】 public const 定数名 = 定数 ■モードレスダイアログ ・Excel で表示可能なダイアログは、モーダルだけです。 従って、他のコードを実行しながら、ダイアログを表示したままにはできま せん。ダイアログを表示したら、そのダイアログを終了するまで他の一切の 処理は選択不能となります。 ・モードレスダイアログに近い処理を行うには、シート上にボタンを配置する デザインしかないようです。 ■マクロと関数 ・Excel のシートからみたマクロとなるのは、標準モジュールに定義されたパ ラメタなし、戻り値なしのパブリック関数だけです。 従って、マクロと呼ばれるものにパラメタを渡すことはできません。 また、標準モジュールの private 宣言以外の関数は、そのブックのどこか らも呼び出すことができます。 【宣言方法】 public sub マクロ名() ... end sub ■他ブックマクロ呼び出し ・通常、他ブックの関数は呼べないが、マクロとしてなら可能である。 残念ながら、パラメタを渡すことはできない。 【補足】 WindowsXP + Excel2003 では、パラメタを渡せるとの情報があります。 「Application.Run "book1.xls!test", para1, para2, para3」 私の調査不足かも... 【呼び出し方法】 Application.Run "book1.xls!test" ** 実行したマクロから返ってくるのを待つようなので注意。 この命令を実行したシートが閉じられると、呼び出しているマクロも強 制キャンセルされる。 例えば、上の例の book1.xls!test の中で、呼び出しもとのシートを閉 じる命令を発行すると、続く処理が打ちきられる。 ** 上記の問題を回避するには、マクロにショートカットキー割り当てを行 い、sendkeys "^A" の様にマクロをキックする。 ■自動実行マクロ ・標準モジュールに sub auto_open() を記述すると、シートオープン時に自 動実行される。オートオープンは止めるのが難しいので、次のような対処を すると良い。(自動起動マクロ) ・シートと同じフォルダに debug.txt があり、その内容が yes のときだけ、 マクロを中止する。 Sub auto_open() Dim ph As String Dim fno As Integer Dim rec As String '** 開発モードチェック ph = ThisWorkbook.path & "\" fno = freefile on error resume next open ph & "debug.txt" for input as fno if err = 0 then if eof(fno) = false then line input #fno, rec rec = lcase(trim(rec)) end if end if close fno on error goto 0 if rec = "yes" then msgbox "開発モードにつき、マクロ中止" exit sub end if '** マクロキック SendKeys "^A" End Sub ・終了時自動実行マクロは、次の関数で記述する。 Sub auto_close() '** 終了時自動処理 End Sub ■Excel 保存、終了 ・Excel の保存は、次のとおり。 exl.ActiveWorkbook.Save ・Excel の保存終了は、次のとおり。 exl.ActiveWorkbook.Save exl.Application.Quit ・Excel の非保存終了は、次のとおり。(Excel 終了) exl.Application.DisplayAlerts = False exl.Application.Quit 尚、ブッククローズや Excel クローズの指示マクロが閉じられるオブェクト で実行されている場合、その次のステップは当然、閉じられて実行されません。 ■シートセル参照方法 ・汎用的には cells を使用すると便利である。 Excel シート上のセルにアクセスするには、次のようにする。 Workbooks("book1.xls").Worksheets("sheet1").Cells(y, x) = "test" a = Workbooks("book1.xls").Worksheets("sheet1").Cells(y, x) ・cells() と cells().value は同じ意味になります。 ・cells().プロパティ でセルの任意プロパティを変更することも可能です。 ・(y, x) の原点は (1, 1) から始まります。0 はないので注意。 ・cells で指定する (y, x) は数学の座標系に基づいています。 x は横方向、つまり、列方向です。 y は縦方向、つまり、行方向です。 .Cells(y, x) | |_ 列 (カラム、col) |_ 行 (ロウ、row) .Cells(行, 列) ・現在のセル選択位置を取得するには、Column と Row を使用する。 ThisWorkbook.Activate Sheets("Sheet1").Select MsgBox Selection.Row MsgBox Selection.Column ■VB6 からの Excel シートセル参照方法 ・VB6 から、Excel シート上のセルにアクセスするには、次のようにする。 dim es as variant Set es = GetObject("g:\tmp\book1.xls") es.Application.Visible = True es.Parent.Windows(1).Visible = True es.Worksheets("sheet1").cells(5, 5) = "sak" Text1 = es.Worksheets("sheet1").cells(1, 1) ・cells() は、Excel の VBA で使うのと一緒です。 次は、セルの値を 2 倍にする関数です。 Excel VBA のマクロとしても使えます。 public sub Nibai(st as wooksheet, y as integer, x as integer) st.cells(y, x) = st.cells(y, x) * 2 end sub ■VB 環境編資料
■VB 入門編資料
■VB 基礎編資料
■VB ビジュアル編資料
■VB テクニック編資料