イベントが発生したシートの名前
https://www.relief.jp/docs/018...
' シート内容変更時
Private Sub Worksheet_Change(ByVal Target As Range)
' Targetが存在するシートを取得
sheet_name = Target.Parent.Name
Set target_sheet = Sheets(sheet_name)

イベントが発生したシートの名前
https://www.relief.jp/docs/018...
' シート内容変更時
Private Sub Worksheet_Change(ByVal Target As Range)
' Targetが存在するシートを取得
sheet_name = Target.Parent.Name
Set target_sheet = Sheets(sheet_name)
「実行時エラー'1004'
Intersectメソッドは失敗しました。
'_Global'オブジェクトのエラー」
https://okwave.jp/qa/q2989438....
Intersect( Target, Range(~) )で
異なるシートのセルを比べるとエラーになる。
Targetはイベント発生シート
RangeはActiveSheet
Worksheet_Changeで
セルの更新イベントを拾う場合,
Targetと自分の観察範囲を
IntersectしてからFor Eachにかける。
https://www.moug.net/tech/exvb...
Set rng = Intersect(Target, Range("C1:C10"))
If Not (rng Is Nothing) Then
For Each r In rng …
・行単位
・列単位
・矩形範囲
など,複数のセルが手動で更新された場合
Worksheet_Change内でそれを検知する:
https://jizilog.com/vba-change...
Private Sub Worksheet_Change(ByVal Target As Range)
If InStr(Target.Address, ":") <> 0 Then Exit Sub
表計算ソフト:
#Excel関数を使いこなす
#ExcelVBAマクロを使いこなす
#GAS・GoogleAppsScriptの勉強
他のオフィスソフト:
#Wordの使い方Tips
#メールとメーラーの知識
マルチメディア系:
#AviUtlで動画編集する方法
' セル値更新時
Private Sub Worksheet_Change(ByVal Target As Range)
For Each r In Target
x = r.Column
y = r.Row
MsgBox "変更セルは" & y & "行" & x & "列目"
Next
↑
「行を挿入」すると
行内の全セルが渡され
ループが死ぬ…。
Private Sub Worksheet_Change(ByVal Target As Range)
For Each r In Target
x = r.Column
y = r.Row
MsgBox "変更セルは" & y & "行" & x & "列目"
Next
複数セル範囲が選択・更新された場合,
For Eachで1セルずつ処理できる。
Private Sub Worksheet_Change(ByVal Target As Range)
x = Target.Column
y = Target.Row
…
・Ctrlキーを押しながら
複数セルを選択し一括更新した場合
最初に選択したセルの番地が返る。
・矩形セル領域を選択した場合
左上のセル番地が返る。
セル値の更新イベントを拾う
(1セルのみ更新の場合)
https://ateitexe.com/find-chan...
' シート内容変更時
Private Sub Worksheet_Change(ByVal Target As Range)
x = Target.Column
y = Target.Row
MsgBox "変更セルは" & y & "行" & x & "列目"
End Sub
自動処理:
ThisWorkbookモジュール内に
下記の関数を書く。
' ブックを開いた時に自動的に実行
Private Sub Workbook_Open()
' 現在日時を書き込み
Sheets("Sheet1").Cells(1, 1).Value = Format(Now, "yyyy/mm/dd(aaa)hh:mm:ss")
End Sub
モジュールの先頭・宣言セクションに
モジュール変数を定義し
宣言と同時に値を初期化するには…
・そのモジュール内だけで使う場合はPrivate
・他のモジュールでも使うならPublic
・値が不変の定数ならConst
Private Const a = 1
Public Const b = "hoge"
・SubやFunctionの
内部で宣言された変数を
「プロシージャ変数」(ローカル変数)という.
・複数のプロシージャ間で
共通の変数を使うには,
モジュールの先頭
(全ルーチンの前。宣言セクション)に
「モジュール変数」を宣言する.
VBAコードの置き場は3種類
https://excel-ubara.com/excelv...
(1)標準モジュール:
ここに書いたプロシージャは
(Private指定しなければ)
全シートから呼び出し可能
(2)ブックモジュール:
ブックイベントなど書く
(3)シートモジュール:
シートイベントなど書く
頻出パターン8:
DB接続
Excel VBAから RDBMS を操作する際,
ADODB. Connection を使わない手もある。
・VBAでExcelシート上の記載情報を読み取り
CSVファイルに書き出し。
・その直後にVBAから,Shell関数で
CUIツールからDB操作。
頻出パターン8:
DB接続
Set conn = CreateObject("ADODB. Connection")
conn.Open 接続文字列
' SQL実行
Set rs = CreateObject("ADODB.RecordSet")
rs.Open strSQL, conn
' SELECT結果がセットされる
https://language-and-engineeri...
頻出パターン8:
DB接続
https://language-and-engineeri...
Excelのシート上に
一覧表形式で記載されているデータを,
外部データベースと連携して処理できる。
・RDBMSからExcelへデータ読み込み
・ExcelからRDBMSへデータ書き込み
ファイル名の拡張子に
関連付けられたプログラムで
ファイルを開くには…
https://www.moug.net/tech/exvb...
cmd_str = """" & txt_file_path & """"
Set wsh = CreateObject("Wscript.Shell")
wsh.Run cmd_str, 3
※.Shell関数ではダメ
頻出パターン7:
外部コマンド呼び出し
・Shell 関数で,
Windowsコマンドプロンプトと同じように
コマンドを実行できる。
・デフォルトのカレントディレクトリは
マイドキュメント。
・ChDir / ChDriveは,UNCパスの設定は不可。
頻出パターン7:
外部コマンド呼び出し
Excelのシート上から
外部コマンドを呼び出すことができれば
【実行可能ドキュメント】になる。
「仕様書を書けば,その仕様書自体が動く」。
例
テスト仕様書を書いた
→その書面上から,書いてあるテストを直接実行可
頻出パターン7:
外部コマンド呼び出し
https://language-and-engineeri...
' カレントディレクトリを設定
ChDrive ThisWorkbook.Path
ChDir ThisWorkbook.Path
' コマンド実行
output_path = ThisWorkbook.Path & "\a.txt"
Shell "cmd.exe /c dir > " & output_path