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 テクニック編資料