・ROWNDDOWN関数を用いた丸め計算と剰余計算.
・ExcelVB注意点.
・多項式近似曲線の係数の値を取得する方法.
・他のアプリケーションを起動,アクティブ化する.
・他のアプリケーションを起動,アクティブ化後,元のシートをアクティブ化する.
・他のアプリ起動させて文字入力する方法.
・ショートカットキーやキーストロークで他のアプリを操作する方法.
・指定した時間プログラムの処理を停止する.
・マクロで自動処理中にキーボードの入力を禁止する方法.
・マクロで自動処理中に中断する方法.
・Win32APIを用いる方法.
・PostMessageでボタンをクリックする方法.
・Mouse_eventでクリックおよびダブルクリックする方法.
・REM文について.
・ファイルの存在の有無を確認してファイルが存在したら削除する方法.
・フォームを表示・非表示させる方法.
・印刷時にファイル名とシート名を自動で印刷させる方法.
・文字列をスペースの区切り毎にセルに分割する方法.
・グラフのY軸の向きを反転させる方法.
・インターネットのホームページのデータをExcelに取込む(97).
・文字列の数値化,数値の文字列化(97).
・エクセル起動時にマクロ実行させる方法(2000).
・ROWNDDOWN関数を用いた丸め計算と剰余計算
Excel2000のINT関数は説明では0に近い整数に丸めると記述されているが
実際には,数値がマイナスの場合は0から遠い整数に丸められてしまう.
そこで0に近い整数に丸めたい場合はINT関数を用いずにROUNDDOWN関数を用いて
ROUNDDOWN(数値,0)
として求めればよい.
同様に割算(A1/A2)の剰余を求める場合はROUNDDOWN関数を用いて
A1/A2-ROUNDDOWN(A1/A2,0)
として求めればよい.
ROUNDDOWN関数はVB上ではWorksheetFunction.RoundDown(*,*)として用いる.
・ExcelVB注意点
@保存するときに「Microsoft Excel ブック」以外,例えば
「Microsoft Excel 97および5.0/95ブック」等の形式で保存すると
エラー発生する場合がある.
ASendKeysとSendKeysの間で書き込み違反?のエラー発生したら
Application.Wait Time + TimeValue("00:00:01")
で少し時間待ちするとエラー発生しなくなることがある.
Application.SendKeys ("w"), True
のようにTrueを付け足すと送信が完了するまで待機するので
これでも回避できるかも.
Bエクセルのワークシート関数のLenBとエクセルVBAのLenBは異なるので注意.
・多項式近似曲線の係数の値を取得する方法
LINEST関数とINDEX関数を利用する.
例)下記のようなデータ(元データはA列(X)とB列(Y))がある場合
A B C D
1 0 1 0 0
2 1 6 1 1
3 2 17 2 4
4 3 34 3 9
5 4 57 4 16
6 5 86 5 25
C列にA列(X)をコピーし,D列にA列の2乗(X^2)をコピーする.
係数を求めたいセルに
INDEX(LINEST($B$1:$B$6,$C$1:$D$6),1)
と入力すると多項式近似曲線の最高時の次数(2次の係数)が求められる.
同様に
INDEX(LINEST($B$1:$B$6,$C$1:$D$6),2)
INDEX(LINEST($B$1:$B$6,$C$1:$D$6),3)
として1次の係数,定数項(0次の係数)を求めることができる.
INDEX(LINEST($B$1:$B$6,$C$1:$D$6,False),1)
のようにLINESTの3番目にFalseを指定すると定数項を0とした場合の
近似式の係数を求めることができる.
エクセルのグラフでの近似曲線の追加は最高6次までだが
LINEST関数はもっと高次も可.
R^2値は
INDEX(LINEST($B$1:$B$6,$C$1:$D$6,TRUE,TRUE),3,1)
とすれば求められる.
・他のアプリケーションを起動,アクティブ化する.
まだ起動されていないアプリケーションは
Shell ("Notepad.exe") '←メモ帳起動
のようにすれば起動できる.
ただし実行ファイルのみだとファイルがみつからず起動できない場合があるので
Shell ("D:\MKEditor\MKEditor.exe")
のようにディレクトリ付で指定しておいたほうが良い.
上記を実行しても起動したアプリケーションがアクティブ化されないときは
Dim myAppID
myAppID = Shell("D:\gnuplot\bin\wgnuplot.exe", 1)
とすればうまくいく場合がある.
これでも正常に起動できない場合,起動したいアプリケーションを起動させる
batchファイルを作成し,そのbatchファイルをshell関数を用いて起動すると
正常に動作させることができる場合がある.
また,batchファイルをつくらなくても
ChDir ("C:\Program Files\SHI\PS-100\EXE")
Shell ("PS100.exe",1)
のように,そのアプリケーションのあるディレクトリに移動してから
Shell関数を用いると正常に起動できる場合がある.
これでうまく行かない場合でもChDriveを用いて
ChDrive ("C")
ChDir ("C:\Program Files\SHI\PS-100\EXE")
Call Shell("PS100.exe",1)
とすれば起動できる場合がある.
既に起動されているアプリケーションは
AppActivate ("ウィンドウのタイトル名")
でアクティブ化できる.
ときどき失敗する場合は
AppActivate ("ウィンドウのタイトル名") , True
としてみると失敗しにくくなる場合がある.
・他のアプリケーションを起動,アクティブ化後,元のシートをアクティブ化する.
AppActivate Application.Caption
で元のシートをアクティブ化する.
・他のアプリ起動させて文字入力する方法.
Sendkeysを用いる.例えば
Dim myAppID
myAppID = Shell("C:\WINNT\system32\notepad.exe", 1) 'メモ帳を起動
Application.SendKeys ("abc")
とするとメモ帳にabcと記述される.
Application.SendKeys ("abc"), True
のようにTrueを付け足すと送信が完了するまで待機する.
改行は
Application.SendKeys ("abc" + Chr(13)), True
のように指定する.ただし,セルの中の改行は
Range("A10").Value = "abc" + Chr(10) + "def"
のように行う.
ファンクションキーは例えばF4の場合
Application.SendKeys ("{F4}"), True
のように行う.
10 は vbLf (UNIX系での改行コード)
13 は vbCr(復帰コード)
ただし,全角文字は文字化けする.
そこでワークシートのどこかのセル(例えばA1)に値を記述しておいて
Range("A1").Copy
Application.SendKeys ("^v"), True '←貼付け
とすれば全角文字も他のアプリに受け渡すことができる.
・ショートカットキーやキーストロークで他のアプリを操作する方法.
ショートカットキーで他のアプリ操作する方法
Application.SendKeys ("^f"), True
のようにすると,コントロールキー押しながらfキー押したときと同じ動作を実行できる.
キーストロークで他のアプリを操作する方法
Application.SendKeys ("%f"), True
のようにするとALTキーを押しながらfキーを押したときと同じ動作を実行できる.
Application.SendKeys ("+f"), True
のようにするとSHIFTキーを押しながらfキーを押したときと同じ動作を実行できる.
他のアプリのボタンをクリックするとき
ENTER送信の場合
Application.SendKeys ("{ENTER}"), True
もしくは
Application.SendKeys ("{~}"), True
これでうまくいかないときは
Application.SendKeys (Chr(13)), True
カーソルキーの→,←,↑,↓はそれぞれ
Application.SendKeys ("{RIGHT}"), True
Application.SendKeys ("{LEFT}"), True
Application.SendKeys ("{UP}"), True
Application.SendKeys ("{DOWN}"), True
でOK
タブは
Application.SendKeys (Chr(9)), True
もしくは
Application.SendKeys ("{TAB}"), True
のように指定する.
Application.SendKeys ("{TAB 4}"), True
とするとタブキーを4回送信できる.
SHIFT+TABの送信は
Application.SendKeys ("+{TAB}"), True
CTRL+ALT+DELの送信は
Application.SendKeys ("^(%{DEL})"), True
スペースキーは
Application.SendKeys (" "), True
バックスペースキーは
Application.SendKeys ("{BS}"), True
エスケープキーは
Application.SendKeys ("{ESC}"), True
・指定した時間プログラムの処理を停止する.
Application.Wait Time + TimeValue("00:00:05")
とすると5[sec]間の待ちとなる.
・マクロで自動処理中にキーボードの入力を禁止する方法.
Application.InteRactive = False 'キーボード入力禁止
Application.InteRactive = True 'キーボード入力禁止解除
True の場合、Excel が対話モードになる.既定値は True です.
False が設定されるとキーボードやマウスからの入力を受け付けなく
なるが,表示されたダイアログボックスへの入力は可能.
マクロの終了前に必ず設定をTrueに戻すこと.
True に戻すのを忘れるとマクロが終了しても
Excelに入力することができなくなる.
・マクロで自動処理中に中断する方法.
CTRLキー+BREAKキー
・Win32APIを用いる方法.
標準モジュールでプロシージャを記述する前に
Public Declare Function SetCursorPos Lib "USER32" (ByVal x As Long, ByVal y As Long) As Long
のようにWin32APIを呼出す文を記述する.(上述はSetCursorPosを呼出す場合.)
・PostMessageでボタンをクリックする方法.
あらかじめ,クリックしたいボタンのキャプションとクラス名を調べておく.
また,クリックしたいボタンの親,親の親,親の親の親・・・のハンドルと
キャプションとクラス名をフォアグラウンドウィンドウまでたどって調べておく.
それらが調査済であれば,GetForegroundWindowを用いてフォアグラウンドウィンドウの
ハンドルを取得し,キャプションとクラス名に基づきFindWindowExを繰返し用いて
クリックしたいボタンまで,子,孫,ひ孫,・・・のハンドルを取得していき
クリックしたいボタンのハンドルを取得できたら
Call PostMessage(クリックしたいボタンのハンドル, WM_LBUTTONDOWN, 0, 0)
Call PostMessage(クリックしたいボタンのハンドル, WM_LBUTTONUP, 0, 0)
でクリック動作を送信することができる.
ただし,標準モジュールのプロシージャ前であらかじめ
Const WM_LBUTTONDOWN = &H201
Const WM_LBUTTONUP = &H202
を定義しておくことが必要.
・Mouse_eventでクリックおよびダブルクリックする方法.
先ず以下の宣言を定義する.
'マウスの左と右の機能を入れ替える
Declare Function SwapMouseButton Lib "user32.dll" _
(ByVal fSwap As Long) As Long
'マウスを擬似的に動作させる
Declare Sub mouse_event Lib "user32.dll" _
(ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, _
ByVal dwData As Long, ByVal dwExtraInfo As Long)
Const MOUSEEVENTF_LEFTDOWN = &H2
Const MOUSEEVENTF_LEFTUP = &H4
その後,標準モジュール内のプロシージャの中で以下のように記述すると
ダブルクリックさせることができる.
'左利き用の場合も考えて,マウスの左ボタンと右ボタンの設定を本来の機能に戻す
MouseSetting = SwapMouseButton(0)
'ダブルクリック
Call mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
Call mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
Call mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
Call mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
'マウスを元々設定してあった機能に戻す
Call SwapMouseButton(MouseSetting)
クリックの場合は
Call mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
Call mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
のみでよい.
・REM文について
'もしくはREMで一行REM化.
複数行の範囲をREM化する命令文はないので
Dim RemTmp As Long
RemTmp = 0
If RemTmp = 1 Then
REM化したい範囲
End If 'RemTmp
のようにIf文を用いるのもひとつの方法.
・ファイルの存在の有無を確認してファイルが存在したら削除する方法.
CheckExitFile = Dir("ディレクトリ付のファイル名")
If CheckExitFile <> "" Then
Kill ("ディレクトリ付のファイル名")
End If
・フォームを表示・非表示させる方法.
[ツール]−[マクロ]−[Visual Basic Editor]
の手順でVisualBasicEditorを開いてフォームを作成後
プロシージャ内で
フォーム名.Show
で表示.
フォーム名.Hide
で非表示.
・印刷時にファイル名とシート名を自動で印刷させる方法.
メニューから[表示]−[ヘッダとフッタ]を選択しヘッダの編集orフッタの編集において
ファイル名のボタンとシート名のボタンをクリックし&[ファイル名]&[シート名]と入力する.
・文字列をスペースの区切り毎にセルに分割する方法.
分割したいデータが入っているセル範囲を選択し,メニューの [データ] から
「区切り位置」を選択.
・グラフのY軸の向きを反転させる方法.
先ず,グラフのY軸を選択し逆クリックして「軸の書式設定」を選択し
目盛タブの中の「軸を反転する」,「最大値でX/数値軸と交差する」の
チェックボックスをチェックする.
また,X軸を選択し逆クリックして「軸の書式設定」を選択し
パターンタブの中の「目盛ラベル」の「上端/右端」のラジオボタンを選択する.
・インターネットのホームページのデータをExcelに取込む(97).
例えば
Workbooks.Open ("http://www007.upp.so-net.ne.jp/tmh_ogaw/")
のようにする.
閉じるときは
Workbooks("http://www007.upp.so-net.ne.jp/tmh_ogaw/").close
のようにする.
・文字列の数値化,数値の文字列化(97).
例えば
FIXED(12345,2,1)
とすると12345.00という文字列になる.VBAでは
Application.WorksheetFunction.Fixed(12345,2,1)
のようにする.
VALUE("12345")
とすると"12345"という文字列が12345という数値になる.
VBAではVal関数を用いて
Val("12345")
とするとDouble型に変換される.
・エクセル起動時にマクロ実行させる方法(2000).
VBAでThisWorkbookにて
Private Sub Workbook_Open()
実行させたいマクロの記述
End Sub
と記述して保存.
| |