Excel VBA|コード備忘録 コピペ用
基本
・最終行、最終列の取得
Dim LastRow as Long
Dim LastCol as Long
LastRow = Cells(Rows.Count, 1).End(xlUp).Row '1列目の最終行
LastCol = Cells(1, Columns.Count).End(xlToLeft).Column '1行目の最終列
Integer型で定義するとオーバーフローするのでLong型にする。
・セルのクリア
Range("C5:M23").ClearContents 'C5からM23の範囲のセルのデータのみクリア
Range(Cells(1,1),Cells(3,5)).ClearContents '指定の範囲のデータのみクリア
Cells.ClearContents 'シート全体のデータのみクリア
Range("C5:M23").Clear 'すべてクリア
Range("C5:M23").ClearFormats 'フォーマットのみクリア
Range("C5:M23").ClearNotes 'コメントやメモをクリア
Range("C5:M23").ClearHyperlinks 'ハイパーリンクをクリア
Range("C5:M23").ClearOutline 'アウトライン(グループ化)をクリア
・セルのコピー
'コピペ
Range(“A1”).Copy Range(“C5”)
'値のみコピペ
Range(“A1”).Copy
Range(“C5”).PasteSpecial xlPasteValues
Application.CutCopyMode = False '囲まれるコピー箇所を解除
'値のみコピペ 別バージョン
Range("C5").Value = Range("A1").Value
・シートのコピー、移動
'シートAを前(後)にコピー
Worksheets("シートA").Copy Before:=Worksheets("シートA") '前にコピー Afterにすると後ろにコピー
ActiveSheet.Name = "シートB" 'シート名変更
'シートAを先頭にコピー
Worksheets("シートA").Copy Before:=Worksheets(1)
'シートAを一番後ろにコピー
Worksheets("シートA").Copy After:=Worksheets(Worksheets.Count)
'複数シートをコピー
Worksheets(Array("シートA","シートB")).Copy Before:=Worksheets(1)
'シートAを一番後ろに移動
Worksheets("シートA").Move After:=Worksheets(Worksheets.Count)
・シートの削除、クリア
'シートA削除
Worksheets("シートA").Delete
'シートAの中身全てをクリア
Worksheets("シートA").Cells.Clear
'シートAの書式をクリア
Worksheets("シートA").Cells.ClearFormats
'シートAの数値と値をクリア
Worksheets("シートA").Cells.ClearContents
'シートAのハイパーリンクをクリア
Worksheets("シートA").Cells.ClearHyperlinks
・改行
'メッセージボックス内の改行
Msgbox "1行目" & vbCrLf & "2行目"
'エクセルのセル内の改行
Cells(1,1).Value = "上" & vbLf & "真ん中" & vbLf & "下"
・高速化|画面の更新を停止
Application.ScreenUpdating = False
'メインプログラム
Application.ScreenUpdating = True '最後に忘れずに戻す
・警告メッセージの非表示
Application.DisplayAlerts = False 'メッセージを非表示
Application.DisplayAlerts = True 'メッセージを表示
・メッセージボックスによる分岐選択
Dim rc as long
rc = MsgBox("メッセージ" & vbCrLf & "2行目メッセージ", vbYesNoCancel + vbQuestion, "タイトル")
If rc = vbYes Then
'「はい」時の処理
ElseIf rc = vbNo Then
'「いいえ」時の処理
Else
'「キャンセル」時の処理
End If
・ファイル選択ダイアログ(ファイルを指定して開く)
Sub OpenFile() 'ファイルを指定して開く
Dim FileName As Variant
'ファイル選択ダイアログを表示 すべてのエクセルファイルを開く
FileName = Application.GetOpenFilename(FileFilter:="Excelファイル,*.xls*,CSVファイル,*.csv")
'キャンセルの場合
If FileName = False Then
MsgBox "キャンセルされました"
Exit Sub
End If
'CSVファイルをopen
Workbooks.Open FileName
End Sub
・検索してセル情報を取得(結果が1つ)
Dim ChkObj As Range
Dim ChkRange As Range
Dim ChkWord As String
Dim ChkCol As Long '検索した文字の列番号
Dim ChkRow As Long '検索した文字の行番号
Set ChkRange = Rows(1) '1列目を探す
Set ChkWord = "探すキーワード"
Set ChkObj = Worksheets("シートA").ChkRange.Find(ChkWord, LookAt:=xlWhole)
'もしデータがなかったら
If ChkObj Is Nothing Then
MsgBox "'" & ChkWord & "'はありませんでした"
Exit Sub
End If
ChkCol = ChkObj.Column
ChkRow = ChkObj.Row
End If
findは処理速度が遅いため、以下の方法で検索するのも可
Dim chkObj As Range
'完全一致
Set chkObj = Cells(WorksheetFunction.Match("探すキーワード", Range("A:A"), 0), 1)
'部分一致
Set chkObj = Cells(WorksheetFunction.Match("*探すキーワード*", Range("A:A"), 0), 1)
・検索してセル情報を取得(結果が複数)
'検索が1列の場合
Dim chkRng As Range '検索範囲
Dim i As Long
Dim chkAry As Variant '配列
Set chkRng = Range(Cells(1, 1), Cells(Rows.Count, 1).End(xlUp))
chkAry = chkRng 'セル範囲を配列変換
For i = LBound(chkAry) To UBound(chkAry)
If chkAry(i, 1) Like "*キーワード*" Then
Cells(i, 1).Interior.Color = vbBlue
End If
Next
'検索が複数列の場合
Dim chkRng As Range '検索範囲
Dim i As Long
Dim t As Long
Dim chkAry As Variant '配列
Set chkRng = Range(Cells(1, 1), Cells(Rows.Count, 3).End(xlUp))
chkAry = chkRng 'セル範囲を配列変換
For t = LBound(chkAry, 2) To UBound(chkAry, 2) '列の下限から上限まで
For i = LBound(chkAry, 1) To UBound(chkAry, 1) '行の下限から上限まで
If chkAry(i, t) Like "*キーワード*" Then
Cells(i, t).Interior.Color = vbBlue
End If
Next
Next
・エラー処理
'処理のスキップ------------------------------------
On Error GoTo Err1
'(エラーが発生し得る処理)
Exit Sub
Err1:
'(エラー発生時の処理)
'エラー発生箇所に戻り処理の継続 ループの場合のエラー処理はこれ--
On Error GoTo Err1
'(エラーが発生し得る処理)
Exit Sub
Err1:
'(エラー発生時の処理)
Resume Next
'エラーの種類で処理を変える----------------------
On Error GoTo ErrLabel
'(エラーが発生し得る処理)
Exit Sub
ErrLabel:
Select Case Err.Number
Case 9
MsgBox "インデックスが有効範囲にありません" & vbCrLf & Err.Description
Case 1004
MsgBox "実行できませんでした" & vbCrLf & Err.Description
Case Else
MsgBox "予期せぬエラーが発生しました" & vbCrLf & Err.Number & ":" & Err.Description
End Select
Resume Next
繰り返し・条件分岐処理
・Do〜Loop
'条件が真の間は処理を行う
Do While '条件
'処理
Loop
'条件が真になるまで処理を行う
Do Until '条件
'処理
Loop
'一度処理を実行した後、条件が真の間は処理を行う。
Do
'処理
Loop While '条件
'一度処理を実行した後、条件が真になるまで処理を行う
Do
'処理
Loop Until '条件
・For〜Next
'1づつ加算
Dim i
For i = 1 To 20
Cells(i, 1).Value = i
Next
'Step分加算
Dim i
For i = 1 To 20 Step 2
Cells(i, 1).Value = i
Next
・Select Case
'数字のパターン
Dim Num As Integer
Num = 5
Select Case Num
Case 1,2
'処理1
Case 3 To 5
'処理2
Case Is >= 6, Is < 10 '6以上10未満
'処理3
Case Else
'どの条件にも一致しなかった場合の処理
End Select
'文字列のパターン
Dim Str As Integer
Str = "1年生"
Select Case Str
Case "1年生"
'処理1
Case "2年生","3年生"
'処理2
Case Like "*年生" '*は任意の文字列、#は任意の数字、?は任意の1文字
'処理3
Case Else
'どの条件にも一致しなかった場合の処理
End Select
複数の条件に当てはまる場合、最初に合致した条件に適応されるため注意!
ピボット関連
・ピボットテーブル作成、フィルター(統計用)
Sub PivCreate() 'ピボットテーブルの作成
Dim wsNameC As String 'csv等の元データのシート名
Dim wsNameP As String 'ピボット作成先のシート名
wsNameC = "データシート名"
wsNameP = "ピボットシート名"
'シートのクリア
ThisWorkbook.Worksheets(wsNameP).Cells.Clear
'元データ取得
Set dataRng = ThisWorkbook.Worksheets(wsNameC).Range("A1").CurrentRegion
'ピボット作成して名前設定(シートと同じ名前にした。A3を起点に作成)
ThisWorkbook.PivotCaches.Create(xlDatabase, dataRng).CreatePivotTable ThisWorkbook.Worksheets(wsNameP).Range("A3")
ThisWorkbook.Worksheets(wsNameP).PivotTables(ThisWorkbook.Worksheets(wsNameP).PivotTables.Count).Name = wsNameP
'フィールドの設定
With ThisWorkbook.Worksheets(wsNameP).PivotTables(wsNameP)
.PivotFields("フィールド1").Orientation = xlRowField '行フィールド設定
.PivotFields("フィールド2").Orientation = xlRowField '行フィールド設定
.PivotFields("フィールド3").Orientation = xlRowField '行フィールド設定
.PivotFields("フィールド4").Orientation = xlColumnField '列フィールド設定
.PivotFields("フィールド5").Orientation = xlPageField 'フィルターフィールド設定
.RowAxisLayout xlTabularRow 'この時点でピボット作成
'フィルターフィールド作成
.PivotFields("フィールド5").ClearAllFilters 'フィルターフィールドのクリア
.PivotFields("フィールド5").CurrentPage = "フィルターフィールド条件" 'フィルターフィールドの条件
'集計方法の設定
.PivotFields("値フィールド").Orientation = xlDataField
.PivotFields("値フィールド").Function = xlCount '集計方法をデータの個数に設定
'空白を0で埋める
.NullString = "0"
'フィルターをかける
.PivotFields("フィールド1").PivotFilters.Add2 xlCaptionIsGreaterThanOrEqualTo, , 50
End With
End Sub
・ピボットのデータ取得(統計用)
Dim pvName As String 'ピボットテーブル名
Dim wsName As String 'ワークシート名
Dim pvData As long 'データ格納
Dim field(1 to 10) As String '集計条件の変数
Dim field2(1 to 10) As String '集計条件の変数
Dim m As Integer '変数
wsName = "ピボットシート名"
pvName = "ピボットテーブル名"
'フィールド1の総数
pvData = Worksheets(wsName).PivotTables(pvName).GetData("フィールドのラベル名")
'個別条件で値を取得
pvData = Worksheets(wsName).PivotTables(pvName).GetData("行フィールドのラベル名" "列フィールドのラベル名")
'個別条件で値を取得(3つ)順番大事!行フィールドの後に列フィールド
pvData = Worksheets(wsName).PivotTables(pvName).GetData("行フィールドのラベル名1" "行フィールドのラベル名2" "列フィールドのラベル名")
'総計を取得
pvData = Worksheets(wsName).PivotTables(pvName).GetData("")
'変数を使用する場合の値を取得
pvData = Worksheets(wsName).PivotTables(pvName).GetData("フィールドのラベル名" & " " & field(m))
'行フィールドと列フィールドの検索条件の名前がかぶっている場合の値の取得方法
'ex)フィールドが違うけれど、同じラベル名の「検索条件1」を抽出する場合
pvData = Worksheets(wsName).PivotTables(pvName).GetData("フィールド名1[ラベル名1]" "フィールド名2[ラベル名1]")
'行フィールドと列フィールドの検索条件の名前がかぶっている場合の値の取得方法(変数)
field2(m) = "フィールド名1[" & field(m) & "]"
pvData = Worksheets(wsName).PivotTables(pvName).GetData("フィールドのラベル名" & " " & field2(m))
・ピボットのソート
Dim pvName As String 'ピボットテーブル名
Dim wsName As String 'ワークシート名
wsName = "ピボットシート名"
pvName = "ピボットテーブル名"
'「フィールド1」ラベルを「昇順」にする
Worksheets(wsName).PivotTables(pvName).PivotFields("フィールド1").AutoSort xlAscending, "フィールド1"
'「商品」ラベルを「降順」にする
Worksheets(wsName).PivotTables(pvName).PivotFields("フィールド1").AutoSort xlDescending, "フィールド1"
いいなと思ったら応援しよう!
よろしければサポートおねがいします!