エクセルVBA備忘録。

生成AI・プログラミング

シートの操作

データの範囲を取得 最終行と列を見つける

Sub GetDataRange()
Dim ws As Worksheet
Dim lastRow As Long
Dim lastCol As Long
Dim dataRange As Range

' シートを指定(現在アクティブなシートを対象に)
Set ws = ActiveSheet

' 最終行の取得(A列で空白じゃない最終行を探す)
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

' 最終列の取得(2行目の最終列を探す)
lastCol = ws.Cells(2, ws.Columns.Count).End(xlToLeft).Column

' データ範囲を取得
Set dataRange = ws.Range(ws.Cells(2, 1), ws.Cells(lastRow, lastCol))

' 範囲を表示
MsgBox "データ範囲は " & dataRange.Address & " です。"

End Sub

シートの削除

シート1が存在するときは削除、ないときは何もしない

Sub DeleteSheetIfExists()
Dim ws As Worksheet
Dim sheetName As String
sheetName = "シート1"

On Error Resume Next
Set ws = ThisWorkbook.Sheets(sheetName)
On Error GoTo 0

If Not ws Is Nothing Then
    Application.DisplayAlerts = False
    ws.Delete
    Application.DisplayAlerts = True
End If

End Sub

「シート1」と「シート2」の2つのシートを削除する。ない時は何もしない

Sub DeleteSheetsIfExists()
Dim ws As Worksheet
Dim sheetNames As Variant
Dim i As Integer

sheetNames = Array("シート1", "シート2")

Application.DisplayAlerts = False  '画面を固定するコード。

For i = LBound(sheetNames) To UBound(sheetNames)
    On Error Resume Next
    Set ws = ThisWorkbook.Sheets(sheetNames(i))
    On Error GoTo 0

    If Not ws Is Nothing Then
        ws.Delete
    End If
Next i

Application.DisplayAlerts = True

End Sub

シート名の変更

Sub RenameSheet()
Dim ws As Worksheet
Dim oldName As String
Dim newName As String

oldName = "シート1" ' 変更前のシート名
newName = "新しいシート名" ' 変更後のシート名

On Error Resume Next
Set ws = ThisWorkbook.Sheets(oldName)
On Error GoTo 0

If Not ws Is Nothing Then
    ws.Name = newName
End If

End Sub

複数のシートの名前を変更したい 1

Sub RenameMultipleSheets()
Dim ws As Worksheet
Dim oldNames As Variant
Dim newNames As Variant
Dim i As Integer

oldNames = Array("シート1", "シート2")
newNames = Array("新しいシート名1", "新しいシート名2")

For i = LBound(oldNames) To UBound(oldNames)
    On Error Resume Next
    Set ws = ThisWorkbook.Sheets(oldNames(i))
    On Error GoTo 0

    If Not ws Is Nothing Then
        ws.Name = newNames(i)
    End If
Next i

End Sub

複数のシートの名前を変更したい 2

Sub RenameMultipleSheets()
Dim ws As Worksheet
Dim oldNames As Variant
Dim newNames As Variant
Dim i As Integer

' 変更前のシート名と変更後のシート名のリストを作成
oldNames = Array("シート1", "シート2", "シート3")
newNames = Array("新しいシート名1", "新しいシート名2", "新しいシート名3")

' 配列の要素数が一致するか確認
If UBound(oldNames) <> UBound(newNames) Then
    MsgBox "古い名前と新しい名前のリストの数が一致しません。", vbExclamation
    Exit Sub
End If

Application.DisplayAlerts = False

For i = LBound(oldNames) To UBound(oldNames)
    On Error Resume Next
    Set ws = ThisWorkbook.Sheets(oldNames(i))
    On Error GoTo 0

    If Not ws Is Nothing Then
        ws.Name = newNames(i)
    End If
Next i

Application.DisplayAlerts = True

End Sub

シートのコピー

シート1をコピーしてシート名をシート2にしたい

Sub CopyAndRenameSheet()
Dim ws As Worksheet
' Sheet1をコピー
Set ws = ThisWorkbook.Sheets("Sheet1")
ws.Copy Before:=ws    ’wsの前に置く。後ろに置く場合はafter
' コピーしたシートをSheet2にリネーム
ws.Previous.Name = "Sheet2" ’wsの前のシートの名前を変更。後ろを変更する場合はnext
End Sub

シートの操作 その他

画面を固定したい。プログラム実行中にシートが変わらないように。

' 画面の更新を停止
Application.ScreenUpdating = False

' シートを「判定シート」に固定
ThisWorkbook.Sheets("判定シート").Activate
 ・
 ・
 ・
' 画面の更新を再開
Application.ScreenUpdating = True

列の操作

列の並び替え

並び替えたい順に別の列にコピーして、最初の列を削除

' 残したい列名の設定
keepColumns = Array("シート1, "シート2", "シート3, "シート4", "シート5", _
"シート6", "シート7", "シート8", "シート9", "シート10")

' 指定された列をL列以降にコピー
For j = LBound(keepColumns) To UBound(keepColumns)
 colIndex = Application.Match(keepColumns(j), wsSource.Rows(1), 0)
 If Not IsError(colIndex) Then
 wsSource.Columns(colIndex).Copy Destination:=wsSource.Columns(12 + j)
 End If
Next j

' A~K列を削除
wsSource.Range("A:K").Delete

列の削除

目的の列以外を削除

aaaとbbb以外の列を削除

Sub DeleteColumnsExceptAAAAndBBB()
Dim ws As Worksheet
Dim lastColumn As Long
Dim i As Long

' シートを指定します
Set ws = ThisWorkbook.Sheets("Sheet1")

' 最終列を取得します
lastColumn = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column

' 右から左に向かってループを行い、"aaa" か "bbb" でない列を削除します
For i = lastColumn To 1 Step -1
    With ws.Cells(1, i)
        If .Value <> "aaa" And .Value <> "bbb" Then
            .EntireColumn.Delete
        End If
    End With
Next i

End Sub

セル値の操作

文字列を数値に変換

' 列「番号」のデータを数値に変換
Set rng = targetWs.Range("A2:A" & lastRow)
For Each cell In rng
    If IsNumeric(cell.Value) Then
        cell.Value = Val(cell.Value)
    End If
Next cell

複数のセルで数式を数値に変換する場合

Sub ConvertRangeToValues()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("シート") ' シート名を適宜変更してください

With ws.Range("A1:B10") ' A1からB10の範囲を指定
    .Value = .Value ' 範囲内の全てのセルの数式を数値に変換
End With

End Sub

セルに数式を入力して最終行までコピー

セルに数式を入力して最終行までコピーする。“0”などは””0””となることに注意!

    ' J3に数式を入力して最終行までコピー
    wsTarget.Cells(3, "J").Formula = "=IF(MID(C3,8,1)=""0"","""","""")"
    wsTarget.Range("J3:J" & lastRow).FillDown

値の操作 その他

前の月の年月を自動入力

Sub InsertPreviousMonth()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets("シート") ' シート名を適宜変更してください
ws.Range("A1").Value = Format(DateSerial(Year(Date), Month(Date) - 1, 1), "yyyy/mm")
End Sub

多彩な講座から自分に合った講座を探そう!
タイトルとURLをコピーしました