【VBA】よく使う構文

エクセル プログラミング

変更を感知する

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

コメント

タイトルとURLをコピーしました