2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

DXにはオールドテクといわれるExcelも必須だお? - 実践編

Posted at

1. はじめに

どうも、趣味でデータ分析している猫背なエンジニアです。
本日もAdvent Calendar 2025の記事を書いていきます!
前回の記事ではマクロのセットアップについて書きましたが、
今回は実践編と題して書いていきたいと思います。

2. マクロの作成事例

本記事では、業務で使いやすいようにボタンでマクロを起動する方法を説明します。私もよくこの方法で業務効率化をしているので、参考にしてみてください。

■ ボタン操作の事前準備
1.開発タブ → 挿入 → ボタン(フォーム)
2.任意の位置に配置
3.実行するマクロを紐づける
4.これだけで「1クリックExcel」が完成します。

説明としてはこんな感じで書いていますが、簡単に言うと
「好きなボタンを挿入して、右クリックして"マクロの登録"でマクロを作る」という感じです。

■ ボタン操作(フォームコントロール)の例
以下にボタンを使用した例を書いています。
実際に実行するとメッセージボックスに"ボタンがクリックされました!"と表示されます

Sub ButtonClickSample()
    MsgBox "ボタンがクリックされました!"
End Sub

■ シートの一覧を取得してメッセージで表示
ブック内に存在するシートをメッセージボックスで表示してくれます。
仕様書や設計書など、いっぱいシートがある際にどんなドキュメントがあるか確認したいときに使えます。

Sub ShowSheetList()
    Dim s As Worksheet
    Dim list As String
    
    For Each s In ThisWorkbook.Worksheets
        list = list & s.Name & vbCrLf
    Next s
    
    MsgBox list
End Sub

■ シートを指定して、コピーを作成&日付入りで保存する
以下のソースコードはブック内のシートを選択してReport_日付でコピーしてくれる機能になっています。

Sub CopySheetWithDate_Popup()
    Dim targetSheet As String
    Dim newName As String
    
    ' ポップアップでシート名を入力
    targetSheet = InputBox("コピーしたいシート名を入力してください", "シート選択")
    
    ' キャンセル・空白対応
    If targetSheet = "" Then
        MsgBox "シート名が入力されませんでした。処理を中断します。"
        Exit Sub
    End If
    
    ' シートが存在するかチェック
    On Error Resume Next
    Worksheets(targetSheet).Activate
    If Err.Number <> 0 Then
        MsgBox "指定されたシート """ & targetSheet & """ は存在しません。"
        Exit Sub
    End If
    On Error GoTo 0

    ' 新しいシート名
    newName = "Report_" & Format(Date, "yyyymmdd")

    ' シートコピー処理
    Sheets(targetSheet).Copy After:=Sheets(Sheets.Count)
    ActiveSheet.Name = newName

    MsgBox "シート """ & targetSheet & """ をコピーし、" & newName & " として作成しました!"
End Sub

■ フォルダ内のExcelを全部読み込んで集計
指定のフォルダ内にあるExcelシートをすべて読み込んで、Summaryというシートに集計するマクロ。

今回は以下の表をサンプルに集計するようにしています。
実際にはその場にあったマクロに変更してください。

image.png

Sub ImportFromFolder_Dialog()
    Dim fd As FileDialog
    Dim folderPath As String
    Dim f As String
    Dim wb As Workbook
    Dim lastRow As Long
    Dim pasteRow As Long

    ' --- フォルダ選択ダイアログ ---
    Set fd = Application.FileDialog(msoFileDialogFolderPicker)
    fd.Title = "Excelファイルが入ったフォルダを選択してください"
    
    If fd.Show <> -1 Then
        MsgBox "フォルダが選択されませんでした。"
        Exit Sub
    End If
    
    folderPath = fd.SelectedItems(1) & "\"

    ' --- フォルダ内の XLSX を取得 ---
    f = Dir(folderPath & "*.xlsx")
    pasteRow = 2

    Do While f <> ""
        ' --- ファイルを開く ---
        Set wb = Workbooks.Open(folderPath & f)
        
        ' --- 最終行を取得 ---
        lastRow = wb.Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row
        
        ' --- A2:C 最終行 を Summary に貼り付け ---
        wb.Sheets(1).Range("A2:C" & lastRow).Copy _
            ThisWorkbook.Sheets("Summary").Range("A" & pasteRow)
        
        pasteRow = pasteRow + (lastRow - 1)
        
        wb.Close SaveChanges:=False
        
        f = Dir
    Loop

    MsgBox "インポートが完了しました!"
End Sub

■ 指定シートをPDFに出力

Sub ExportToPDF_Popup()
    Dim targetSheetName As String
    Dim targetSheet As Worksheet
    Dim path As String
    
    '▼ シート名をポップアップで指定
    targetSheetName = Application.InputBox( _
        Prompt:="PDF出力するシート名を入力してください。" & vbCrLf & _
                "(例:Report、Sheet1 など)", _
        Title:="シート選択", _
        Type:=2) 'Type:=2 は文字列入力

    'キャンセル時
    If targetSheetName = "False" Then
        MsgBox "処理をキャンセルしました。"
        Exit Sub
    End If
    
    '▼ 指定したシートが存在するか確認
    On Error Resume Next
    Set targetSheet = ThisWorkbook.Sheets(targetSheetName)
    On Error GoTo 0
    
    If targetSheet Is Nothing Then
        MsgBox "指定されたシートが存在しません。"
        Exit Sub
    End If
    
    '▼ 保存先の PDF パス作成
    path = ThisWorkbook.Path & "\" & targetSheetName & "_" & Format(Date, "yyyymmdd") & ".pdf"
    
    '▼ PDF 出力
    targetSheet.ExportAsFixedFormat _
        Type:=xlTypePDF, _
        Filename:=path

    MsgBox "PDF を出力しました:" & vbCrLf & path
End Sub

■ Excelからメールを送る(Outlook classic使用)
送信も自動で実施できる。
実際の現場ではこれで書類を作って送信まで自動化できる

Sub SendMail()
    Dim ol As Object
    Dim mail As Object
    
    Set ol = CreateObject("Outlook.Application")
    Set mail = ol.CreateItem(0)
    
    With mail
        .To = "XXXXXXXXXXXXX@outlook.com"
        .Subject = "今日のレポート"
        .Body = "レポートを添付します。"
        .Attachments.Add ThisWorkbook.Path & "\Summary.pdf"
        .Send
    End With
End Sub

7. おわりに

VBAで業務系をするためのサンプルを列記していきました。残念ながらOutlookはClassicしか動かないことがわかり残念でした。
Googleも連携できるみたいですので、個人で使用する場合はGoogleを推奨します。
あ~残念だ...。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?