変更を感知する
Private Sub Worksheet_Change(ByVal Target As Range)
Dim changedCell As Range
If changedCell Is Nothing Then Exit Sub
' 変更された各セルに対して処理
For Each changedCell In Target
' 変更された値を取得
Next changedCell
End Sub
テーブルをループ処理する
' 条件に一致する行を検索
Dim tblData As ListObject
Dim foundRow As ListRow
For Each foundRow In tblData.ListRows
ループしている行の指定カラムの値 = foundRow.Range.Cells(1, tblData.ListColumns("カラム名").index).Value
Next foundRow
ループを逆方向で行う
メリット:ループ内でその行を削除してもループが狂わない
Dim i As Integer
For i = tblData.ListRows.Count To 1 Step -1
Set foundRow = tblData.ListRows(i)
' ここで条件に基づいて行を削除する処理
' 例: If foundRow.Range.Cells(1, tblData.ListColumns("カラム名").Index).Value = "何かの条件" Then
' foundRow.Delete
' End If
Next i
VBAでindexmatch(条件1つ)
例:テーブルに番号がある時に、1番の行の商品を取得したい場合
注意:参照元テーブルがフィルターされている場合、そのフィルターされた状態で検索がかかる
検索番号 = 1
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("シート名")
Dim tbl As ListObject
Set tbl = ws.ListObjects("テーブル名")
' 列A、列B、列Cのデータ範囲を設定
Set rngA = tbl.ListColumns("番号").DataBodyRange
' INDEXとMATCHを使用して条件に合致する値を取得
商品 = Application.WorksheetFunction.index(tbl.DataBodyRange, Application.WorksheetFunction.Match(検索番号, rngA, 0), tbl.ListColumns("商品").index)
'最後にカラムを指定すると、そのカラムの値。指定しないと行全体が帰ってくる
エラーハンドリング
Sub 関数()
On Error GoTo ERROR_HANDLER
’呼び出し元の関数のメインの処理を記述
共通関数
Exit Sub 'エラーハンドラに入る前にExitする
ERROR_HANDLER:
’エラーが起きた時に実行したい処理を記述
End Sub
Sub 共通関数()
On Error GoTo ERROR_HANDLER
’ここにメインの処理を記述
Exit Sub
ERROR_HANDLER:
errNumber = Err.Number
On Error GoTo 0
’エラーが起きた時に実行したい処理を記述
MsgBox "共通関数エラー", vbCritical, "エラー"
' 呼び出し元にエラーを伝達します
Call Err.Raise(errNumber)
End Sub
最終行・最終列の取得
ActiveSheetのA列の最終行を取得する例
Dim lastRow As Long
lastRow = ActiveSheet.Cells(ActiveSheet.Rows.Count, 1).End(xlUp).Row
ActiveSheetの1行目の最終列を取得する例
Dim lastCol As Long
' 最終の列を取得
lastCol = ActiveSheet.Cells(1, ActiveSheet.Columns.Count).End(xlToLeft).Column
列の重複エラー
データの入力規則にこの関数を入れます。
名前一覧とあるのは、名前範囲のことです、あらかじめ定義しておいてください。範囲は、重複させたくない範囲を指定します。
=COUNTIF(名前一覧, A2) < 2
変更があったら、特定範囲内と重複するセルをループ処理する
Private Sub Worksheet_Change(ByVal target As Range)
Dim targetTable As ListObject
Set targetTable = Me.ListObjects("テーブル名")
Dim changedCell As Range
For Each changedCell In Intersect(target, targetTable.ListColumns("カラム名").DataBodyRange)
’ここに処理を記述する
Next changedCell
End sub
コメント