VBAトレーニング-03 [ブック&シート操作について-③]-[エクセルファイルの開き方]

このページで学習出来る事

 VBAトレーニング3回目となる今回は、前回に引き続きExcelブックとシートの使い方について説明をしていきたいと思います。

 ただ単純にシートを切り替えたり、削除したりするコードを覚えるのではなくブックやシートオブジェクトを見ながら、実際にシートを操ってみたいと思います。

学習内容

  • オブジェクトを通してのエクセルファイルの開き方

  • 別エクセル間でのデータのやり取り(データを転記)

この学習で使用するエクセルファイルはここからダウンロードできます。

  


準備

 今回は外部の別エクセルを操作しますので、あらかじめ[C:\temp]フォルダにエクセルファイルを用意しておきます。(サンプル用のzipファイルを用意してありますので、それを解凍してCドライブにコピペしてください)
 下記図のようになるよう設置してください。

  


サンプルコード

 先ほど設置したエクセルファイルを開いたり、そのエクセル内のシートオブジェクトを操作するコードです。(zipファイルに含まれる[sample-03.xlsm]をそのまま使用しても構いません)

 また、変数の宣言が多くあり面倒くさく感じる方も居ると思いますが、変数宣言はプログラミングの基本になりますので(このコードの中でこれらの変数を使用するという宣言になります)、しっかりと記述をしていきましょう。

Sub main()
    Dim objXlsApp As New Application
    Dim objWorkbookSource As Workbook
    Dim objWorkbookDest As Workbook
    Dim objWorksheetSource  As Worksheet
    Dim objWorksheetDest  As Worksheet
    Dim i As Integer
    Dim h As Integer
    
    Set objWorkbookSource = objXlsApp.Workbooks.Open("C:\temp\source.xlsx")
    Set objWorkbookDest = objXlsApp.Workbooks.Open("C:\temp\dest.xlsx")
    
    Debug.Print "wait"
    For i = 1 To 3
        Set objWorksheetSource = objWorkbookSource.Worksheets(i)
        Set objWorksheetDest = objWorkbookDest.Worksheets(i)

        For h = 1 To 10
            objWorksheetDest.Cells(h, 1) = objWorksheetSource.Cells(h, 1)
        Next h
    Next i
    Debug.Print "wait"
        
    objWorkbookSource.Close SaveChanges:=False
    objWorkbookDest.Close SaveChanges:=True
End Sub

コードの解説

‘エクセルアプリケーションを使用する宣言をしています。
Dim objXlsApp As New Application

‘アプリケーションから、[source.xlsx]ファイルを開いて、ブックオブジェクトを変数に設定しています。
Set objWorkbookSource = objXlsApp.Workbooks.Open(“C:\temp\source.xlsx”)

‘アプリケーションから、[dest.xlsx]ファイルを開いて、ブックオブジェクトを変数に設定しています。
Set objWorkbookDest = objXlsApp.Workbooks.Open(“C:\temp\dest.xlsx”)

‘開いた[source.xlsx]ブック内のシートを変数に設定しています。
Set objWorksheetSource = objWorkbookSource.Worksheets(i)

‘開いた[dest.xlsx]ブック内のシートを変数に設定しています。
Set objWorksheetDest = objWorkbookDest.Worksheets(i)

‘[dest.xlsx]シートのh行,1列目に、[source.xlsx]シートのh行,1列目を記載しています。
objWorksheetDest.Cells(h, 1) = objWorksheetSource.Cells(h, 1)

objWorkbookSource.Close SaveChanges:=False ’保存せずに閉じる
objWorkbookDest.Close SaveChanges:=True ’保存して閉じる

Debug.Print “wait” ’ブレークポイント用の記述です。

  


ブックとシートオブジェクトの見方

 準備ができたら実行してみましょう。
 実行すると、この様に最初のブレークポイントで一旦止まり、設定した変数に開いたブックオブジェクトが入っているのが分かります。
 ローカルウィンドウの[+]を押して、ブックオブジェクトの中身を確認していきましょう。

 気づいた方も居るかもしれませんが、いま二つのエクセルを開いているのに、エクセルファイルが表示されていないと思います。
 通常エクセルブックを開く場合、[Application.Workbooks.Open(“C:\temp\source.xlsx”)]として、エクセルアプリケーション[コマンド]を実行して開くパターンが多いですが、これを実行するとエクセルファイルが見える形で開きます。

 しかし、今回は事前にエクセルアプリケーションのオブジェクトを宣言(Dim objXlsApp As New Application)し、そのオブジェクトを介して(オブジェクトの中身で処理して)エクセルブックを開いていますので、見た目上エクセルブックが出てこない仕組みとなっています。

 ※バックグラウンドでは動いています。この状態でコードを停止すると、オブジェクトが残ったままになりますので、注意が必要です。

  


シート間での値の代入

 オブジェクトの確認が終わったら、ブレークポイントで止まっている状態から再度動かしてみましょう。
 次のブレークポイントで止まったら、シートオブジェクトを確認してみましょう。For文の処理が完了し[Sheet3]が表示されていると思います。
 すでに[Sheet1],[Sheet2]の処理が終わり[Sheet3]が開かれていることが確認できます。

 各シート間の値の代入(コピー)は[objWorksheetDest.Cells(h, 1) = objWorksheetSource.Cells(h, 1)]の記述にて処理されており、各シートオブジェクトを変数に格納してしまえば、この様な処理を複数のシートに対して実施できることになります。

[For h = 1 To 10]のとこで、ブレークポイントを設定すると、より細かいシートオブジェクトの遷移が確認できます。

  

 最後に、処理が終わるまで実行してみましょう。そして、処理が終わったら[C:\temp\dest.xlsx]を開いて、[C:\temp\source.xlsx]の中身がコピーされているか確認してみましょう。

  


最後に

 オブジェクトを介してエクセルファイルやブック、シートを操作してみてどうでしたか?
 一つのファイルやシートであれば、そんなにメリットに感じないかったでしょうが、数が増えてきた場合、For文を利用した処理が効果的になってきます。
 その場合、個別にコードを呼び出して操作するよりは、オブジェクトとしてブックやシートを扱った方が可読性も上がりますし、効率的な処理が実現できます。  

  

 次回は新規に複数のエクセルファイルやシートを作成する処理を勉強していきましょう。

  

前回-関連記事

このページで学習出来る事  VBAトレーニング2回目となる今回は、前回に引き続きExcelブックとシートの使い方について説明をしていきたいと思います。  ただ単純にシートを切り替えたり、削除したりするコードを覚えるのではなくブック[…]

次回-関連記事

このページで学習出来る事  VBAトレーニング4回目となる今回は、前回に引き続きExcelブックとシートの使い方について説明をしていきたいと思います。  ただ単純にシートを切り替えたり、削除したりするコードを覚えるのではなくブック[…]