😆

Excelの表をパワポにひたすらコピペするだけのマクロ組んだ

2021/05/20に公開

コピペ作業地味めんどい

データの大切さが叫ばれる今日この頃、Excelを扱う機会が増えた方も多いのではないでしょうか。
pythonでの分析も主流になりつつありますが、まだまだExcelは現役。
ただ、データをまとめて何かで発表する場合、Excelからパワポにひたすらコピペするだけみたいなしんどい作業があったりしませんか。

今回はマクロの勉強もかねて、Excelの表をパワポにひたすらコピペする「コピペボット君」作ってみました。
是非ハンズオンしてみてくださいね。

完成イメージ

ファイルを配置

ファイル配置はこんな感じ。
吐き出す先のパワポは予め新規作成しておいてください。

コピペ元のExcelを「材料」フォルダに格納しておきます。
jr05egj00ccmyplnfj2vmkz8dcpe
コピペ元Excelはこんな感じ。
d144x2sxnons3n4lyshs2br8q97h

コピペ情報を記入

マクロを仕込んだExcelの中身はこんな感じ。
結構記入する情報が多いですが、毎週毎週同じ作業するとかルーティンが決まっているなら一回作ってしまえばあとは編集する必要はありません。
ibychz5cdg3oph2t8v3t86ib5jkx

コピペ完了!

マクロを仕込んだコピペGO!!!ボタンを押すとンゴンゴコピペが開始されます。
コピペ元のExcelが開いたり閉じたりするのでせわしないですが、待っているだけで完了です。
パワポの保存はされていないので、確認次第保存を忘れないよう気を付けてくださいね。
dmhn9aow9eieb7hegb8yg5pydpgo
わーい
コピペ完了後のパワポはこんな感じです。
yhnt91x74dsto469brvz0q34c2nl
わーい

実装こまごま

基本のコードはこちらの記事を参考にしました。
ありがとうございましたあああ!!

パワポ用のライブラリをインポート

「ライブラリ」「インポート」という表現があっているのか分かりませんが、私の環境では何もせず実行しようとするとエラーを吐いてしまいました。
どうもパワポ関連のライブラリを使えるようにするよう設定する必要があるとの。
ツールタブの「参照設定」をクリックします。
rceu2or5serz36eroyp84orm4ufv
「Microsoft PowerPoint Object Library」にチェックを入れて「OK」します。これで使えるようになるようです。
ma088aa2cmvlqbd50rcvri8r9yv2
名前をクリックするだけではチェックボックスにチェックが入りませんので、ちゃんとチェックが入っているか確認してください。
私はこれで5分ハマりました。

Excelの各行の情報を拾っていく

コピペ情報をひたすら上からブルドーザーしながらセルの中身を読んでいくだけなのでそこまで難しいことはしていません。
今回の場合For文の終わり値をCells(1, 1).End(xlDown).Rowと定義していますが、これはA1セルからctrl+↓をした際にたどり着くセルを示しています。
なので、間に空白行が挟まっている場合途中で止まってしまうことに注意してください。
この辺りはこちらの記事が参考になります。

Dim i
For i = 3 To Cells(1, 1).End(xlDown).Row
	'ひたすら変数定義
	xlsxName = thisWs.Cells(i, 1)
	pathToXlsx = ThisWorkbook.Path & "\材料\" & xlsxName
	sheetName = thisWs.Cells(i, 2)
	copyRangeHidariue = thisWs.Cells(i, 3)
	copyRangeMigishita = thisWs.Cells(i, 4)
	copyRange = copyRangeHidariue & ":" & copyRangeMigishita
	ppSlideNum = thisWs.Cells(i, 5)
	kotei = thisWs.Cells(i, 6)
	koteiCho = thisWs.Cells(i, 7)
	wasContinuous = thisWs.Cells(i - 1, 8)
	isContinuous = thisWs.Cells(i, 8)

	'色んな処理を
	'ここに
	'かく
Next

Excelを新たに開くか判定

ある行でコピペ後、次行のコピペが同一Excelの場合はExcelを閉じる必要はありませんよね。
コード内で処理中の行と次の行のExcelファイル名を比較してif文の条件分岐をするのが普通な気がします、、、が
実装している時の俺は「とりあえずExcelの関数で判定すればいっか」と思ったようです。
どうした俺。全然楽になってないぞ。
0hqqn6p0o6o6xm2abe80w68ywh54
if文がExcel内に仕込まれています
「続く」とある場合はExcelを閉じず、次のループでもExcelを開かない、という処理を実装しています。
この辺りはFor文の最後に「Excel閉じて次のを開く」処理を書くなど煩雑にならないような工夫は色々しようがありそうですね。
今回は泥臭く書いてみています。

Dim i
For i = 3 To Cells(1, 1).End(xlDown).Row
        '変数定義を
	'いろいろ
	'します
	
	'前と違うファイルを開く場合
	If wasContinuous <> "続く" Then
	  If Dir(pathToXlsx) <> "" Then
	      Set wb = Workbooks.Open(pathToXlsx)
	  Else
	      MsgBox "ファイルが存在しません。", vbExclamation
	  End If
	End If
	Set ws = wb.Worksheets(sheetName)

	'コピペ処理を
	'ここで
	'します
	
	'次のファイルが違うファイルなら閉じる
        If isContinuous <> "続く" Then
		wb.Save
		wb.Close
		Set wb = Nothing
		Set ws = Nothing
        End If
    Next

コード全体

Sub sample()
    'ppt関連
    Dim ppApp As New PowerPoint.Application
    Dim ppPt As Presentation
    Dim ppSlide As Slide
    Dim ppSlideNum As Integer
    Dim ppShape As PowerPoint.Shape
    Dim pptName As String
    
    'コピペボット君Excel関連
    Dim thisWb As Workbook
    Dim thisWs As Worksheet
    Set thisWb = ThisWorkbook
    Set thisWs = thisWb.Sheets("コピペボット君")
    
    '材料になるExcel関連
    Dim xlsxName As String
    Dim pathToXlsx As String
    Dim sheetName As String
    Dim wb As Workbook
    Dim ws As Worksheet
    Dim wasContinuous As String
    Dim isContinuous As String
    
    'コピー関連
    Dim copyRangeHidariue As String
    Dim copyRangeMigishita As String
    Dim copyRange As String
    Dim kotei As String
    Dim koteiCho As Integer
            
   'パワポを開く	    
    pptName = Cells(3, 10)
    'ppApp.Visible = True 'PowerPoint2007以前の場合は有効にしてください。
    Set ppPt = ppApp.Presentations.Open(ThisWorkbook.Path & "\" & pptName)
    
    'Excelを上から一行ずつブルドーザー
    Dim i
    For i = 3 To Cells(1, 1).End(xlDown).Row
        'ひたすら変数定義
        xlsxName = thisWs.Cells(i, 1)
        pathToXlsx = ThisWorkbook.Path & "\材料\" & xlsxName
        sheetName = thisWs.Cells(i, 2)
        copyRangeHidariue = thisWs.Cells(i, 3)
        copyRangeMigishita = thisWs.Cells(i, 4)
        copyRange = copyRangeHidariue & ":" & copyRangeMigishita
        ppSlideNum = thisWs.Cells(i, 5)
        kotei = thisWs.Cells(i, 6)
        koteiCho = thisWs.Cells(i, 7)
        wasContinuous = thisWs.Cells(i - 1, 8)
        isContinuous = thisWs.Cells(i, 8)
         
        '前と違うファイルを開く場合
        If wasContinuous <> "続く" Then
          If Dir(pathToXlsx) <> "" Then
              Set wb = Workbooks.Open(pathToXlsx)
          Else
              MsgBox "ファイルが存在しません。", vbExclamation
          End If
        End If
        
        Set ws = wb.Worksheets(sheetName)
        
        With ws
            .Range(copyRange).Copy
            DoEvents
            
            'スライド番号を指定
            Set ppSlide = ppPt.Slides(ppSlideNum)
            ppSlide.Shapes.PasteSpecial DataType:=ppPasteEnhancedMetafile, Link:=msoFalse
            Set ppShape = ppSlide.Shapes(ppSlide.Shapes.Count)
            '上位置
            ppShape.Top = Application.CentimetersToPoints(1)
            '左位置
            ppShape.Left = Application.CentimetersToPoints(1)
            '縦横比を固定
            ppShape.LockAspectRatio = msoTrue
            
            If kotei = "高さ" Then
                '横幅
                ppShape.Height = Application.CentimetersToPoints(koteiCho)
            ElseIf kotei = "幅" Then
                '横幅
                ppShape.Width = Application.CentimetersToPoints(koteiCho)
            End If
            Application.CutCopyMode = False
        End With
        
        '次のファイルが違うファイルなら閉じる
        If isContinuous <> "続く" Then
          wb.Save
          wb.Close
          Set wb = Nothing
          Set ws = Nothing
        End If
    Next
    MsgBox ("パワポをご確認の上セーブしてください。")
    
    '保存やウィンドウクローズをする場合ここを有効化
    'ppPt.Save
    'ppApp.Quit
    Set ppPt = Nothing
    Set ppApp = Nothing
End Sub

Discussion