【VBAリファレンス】VBAで実現!GoogleスプレッドシートからExcelへのシームレスなデータ移行テクニック

スポンサーリンク

はじめに:なぜGoogleスプレッドシートからExcelへ?

近年、Googleスプレッドシートはその共有機能やリアルタイム共同編集の利便性から、多くのプロジェクトで活用されています。しかし、長年の業務で蓄積されたExcel資産や、特定のExcel機能(高度なVBAマクロ、特定のファイル形式での出力など)が不可欠な場面も依然として存在します。
このような状況で、「GoogleスプレッドシートのデータをExcelで扱いたい」「Googleスプレッドシートで集計した結果をExcelレポートとして出力したい」といったニーズが発生することは珍しくありません。
本記事では、Excel VBAを活用して、Googleスプレッドシートのデータを効率的かつ自動的にExcelへインポートする具体的な方法と、その応用テクニックを、ベテランVBA講師の視点から徹底解説します。

Googleスプレッドシートからデータを取得する基本

Googleスプレッドシートからデータを取得するには、いくつかの方法が考えられます。

1. CSVファイルとしてエクスポート&インポート

最もシンプルで直感的な方法です。GoogleスプレッドシートをCSV形式でダウンロードし、それをExcelで開く、あるいはVBAで読み込む方法です。

* **Googleスプレッドシート側での操作:**
1. 対象のスプレッドシートを開きます。
2. 「ファイル」メニューから「ダウンロード」→「カンマ区切りテキスト(.csv、現在のシート)」を選択します。
* **Excel VBAでの処理:**
CSVファイルをVBAで読み込み、指定したExcelシートに貼り付けるコードを作成します。

2. Google Sheets APIを利用する(高度な方法)

より自動化を進めたい場合や、定期的なデータ連携を行いたい場合は、Google Sheets APIを利用する方法が強力です。この方法では、VBAからHTTPリクエストを送信し、JSON形式でデータを取得します。

* **API利用の概要:**
1. Google Cloud Platformでプロジェクトを作成し、Google Sheets APIを有効化します。
2. サービスアカウントを作成し、APIキー(またはOAuth認証情報)を取得します。
3. VBAから`MSXML2.XMLHTTP6.0`などのオブジェクトを使用して、APIエンドポイントにリクエストを送信します。
4. 返却されたJSONデータを解析し、Excelに反映させます。

このAPIを利用する方法は、設定がやや複雑になるため、本記事ではまず、より手軽に始められるCSVエクスポート&インポートをベースに解説を進め、応用としてAPIの考え方にも触れます。

VBAサンプル集:CSVインポートの実践テクニック

ここでは、GoogleスプレッドシートからCSVファイルとしてエクスポートしたデータを、Excel VBAで自動的にインポートするサンプルコードをいくつかご紹介します。

サンプル1:指定したCSVファイルをExcelシートにインポートする基本コード

このコードは、あらかじめGoogleスプレッドシートをCSVファイルとして保存しておき、そのファイルを指定してExcelシートにインポートする最も基本的な例です。

Sub ImportCsvToExcel()

Dim filePath As String
Dim wsTarget As Worksheet
Dim lastRow As Long
Dim lastCol As Long

‘ — 設定項目 —
filePath = “C:\Users\YourUsername\Documents\google_sheet_data.csv” ‘ ★インポートしたいCSVファイルのフルパスを指定してください
Set wsTarget = ThisWorkbook.Sheets(“Sheet1″) ‘ ★インポート先のExcelシート名を指定してください
‘ —————-

‘ 既存のデータをクリア(必要に応じて)
wsTarget.Cells.ClearContents

‘ CSVファイルをインポート
With wsTarget.QueryTables.Add(Connection:=”TEXT;” & filePath, Destination:=wsTarget.Range(“A1”))
.Name = “ImportedCsvData”
.FieldNames = True ‘ CSVの1行目をヘッダーとして認識させる
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.TextFilePromptOnRefresh = False
.TextFilePlatform = 65001 ‘ UTF-8を指定(環境によって異なる場合があります。Shift_JISなら932)
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = False
.TextFileSemicolonDelimiter = False
.TextFileCommaDelimiter = True ‘ CSVなのでカンマ区切り
.TextFileSpaceDelimiter = False
.TextFileOtherDelimiter = “”
.TextFileColumnDataTypes = Array(xlTextFormat) ‘ 全てテキスト形式で読み込む(数値として誤認識を防ぐため)
.TextFileTrailingMinusNumbers = True
.Refresh BackgroundQuery:=False
End With

MsgBox “CSVファイルのインポートが完了しました。”, vbInformation

End Sub

**コードの解説:**

* `filePath`: GoogleスプレッドシートをCSVとして保存した際のフルパスを指定します。
* `wsTarget`: データを取り込みたいExcelシートを指定します。
* `wsTarget.Cells.ClearContents`: インポート前にシートの内容をクリアします。不要であれば削除してください。
* `wsTarget.QueryTables.Add`: `QueryTable`オブジェクトを使用してCSVファイルをインポートします。これはExcelの「データ」タブにある「テキスト/CSVから」機能に相当し、柔軟な設定が可能です。
* `.TextFilePlatform = 65001`: 文字コードを指定します。GoogleスプレッドシートのCSVエクスポートはUTF-8(65001)であることが多いですが、環境によってはShift_JIS(932)の場合もあります。文字化けする場合はここを変更してみてください。
* `.TextFileCommaDelimiter = True`: CSVファイルはカンマ区切りであるため、これを`True`にします。
* `.TextFileColumnDataTypes = Array(xlTextFormat)`: 各列のデータ型を指定します。`xlTextFormat`とすることで、数値が指数表記になったり、日付として誤認識されたりするのを防ぎ、全てテキストとして読み込みます。必要に応じて、特定の列だけ`xlDMYFormat`(日付)や`xlGeneralFormat`(自動判別)などに変更することも可能です。

サンプル2:複数のCSVファイルをまとめてインポートする

Googleスプレッドシートで複数のシートをCSVエクスポートした場合、それらをまとめてインポートしたいケースもあります。

Sub ImportMultipleCsvFiles()

Dim folderPath As String
Dim fileName As String
Dim wsTarget As Worksheet
Dim nextRow As Long

‘ — 設定項目 —
folderPath = “C:\Users\YourUsername\Documents\csv_files\” ‘ ★CSVファイルが格納されているフォルダのパスを指定してください(末尾に\が必要)
Set wsTarget = ThisWorkbook.Sheets(“ImportData”) ‘ ★インポート先のExcelシート名を指定してください
‘ —————-

‘ 既存のデータをクリア(必要に応じて)
wsTarget.Cells.ClearContents
nextRow = 1 ‘ 書き込み開始行

‘ 指定フォルダ内のCSVファイルを検索
fileName = Dir(folderPath & “*.csv”)

Do While fileName <> “”
‘ CSVファイルパスを生成
Dim fullCsvPath As String
fullCsvPath = folderPath & fileName

‘ CSVファイルをインポート(QueryTableを使用)
With wsTarget.QueryTables.Add(Connection:=”TEXT;” & fullCsvPath, Destination:=wsTarget.Range(“A” & nextRow))
.Name = “ImportedCsv_” & fileName
.FieldNames = True ‘ ヘッダー行を認識させる
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.TextFilePromptOnRefresh = False
.TextFilePlatform = 65001 ‘ UTF-8
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = False
.TextFileSemicolonDelimiter = False
.TextFileCommaDelimiter = True
.TextFileSpaceDelimiter = False
.TextFileOtherDelimiter = “”
‘ ヘッダー行をスキップしたい場合は、Destinationをヘッダー行の次の行に設定するか、インポート後に削除する処理を追加
‘ ここではヘッダー行もインポートし、その下に続けてデータを追加していきます。
.TextFileColumnDataTypes = Array(xlTextFormat) ‘ 全てテキスト形式
.TextFileTrailingMinusNumbers = True
.Refresh BackgroundQuery:=False
End With

‘ 次のCSVの開始行を更新(インポートした行数を数える)
‘ QueryTableは自動的にデータを追加するので、基本的には次行へ進むだけで良い
‘ ただし、QueryTableのインポート範囲を正確に知るには追加の処理が必要になる場合がある
‘ ここでは単純に、次にインポートする際に、前のデータの下に配置されると仮定します。
‘ より正確には、インポート後の最終行を求めて nextRow を更新します。
On Error Resume Next ‘ エラーが発生する可能性(シートが空の場合など)を考慮
nextRow = wsTarget.Cells(Rows.Count, “A”).End(xlUp).Row + 1
On Error GoTo 0

‘ 次のファイルへ
fileName = Dir
Loop

MsgBox “指定フォルダ内のCSVファイルのインポートが完了しました。”, vbInformation

End Sub

**コードの解説:**

* `folderPath`: CSVファイルが保存されているフォルダのパスを指定します。
* `Dir(folderPath & “*.csv”)`: 指定したフォルダ内の`.csv`拡張子を持つ最初のファイル名を取得します。
* `Do While fileName <> “” … Loop`: `Dir`関数でファイルが見つからなくなるまで(`fileName`が空になるまで)ループを続けます。
* `wsTarget.Range(“A” & nextRow)`: 各CSVファイルを、一つ前のCSVファイルのデータの下に順番に配置していきます。`nextRow`は、前のCSVのインポートが終わった時点での最終行+1に更新されます。
* **注意点:** このコードでは、各CSVファイルのヘッダー行もそのままインポートされます。もし、最初のCSVファイルのみヘッダーをインポートし、それ以降はヘッダーなしでデータだけを結合したい場合は、`Destination`の指定や、インポート後のデータ削除処理などを追加する必要があります。

サンプル3:URLから直接CSVデータを取得してインポートする

Googleスプレッドシートは、特定のURL(エクスポートURL)を生成することで、CSVデータを直接取得できます。これを利用すれば、ローカルにファイルを保存する手間が省けます。

Googleスプレッドシートで、対象シートをCSVとしてエクスポートするURLは、以下の形式になります。

`https://docs.google.com/spreadsheets/d/SPREADSHEET_ID/export?format=csv&gid=SHEET_ID`

* `SPREADSHEET_ID`: GoogleスプレッドシートのURLに含まれる、長い英数字のIDです。
* `SHEET_ID`: CSVとしてエクスポートしたいシートのIDです。通常、シート名の後に表示される数値です。`gid=0`は最初のシートを指します。

このURLをVBAから直接指定してインポートします。

Sub ImportCsvFromGoogleSheetsUrl()

Dim exportUrl As String
Dim wsTarget As Worksheet

‘ — 設定項目 —
‘ ★GoogleスプレッドシートのCSVエクスポートURLを正確に指定してください
‘ 例: “https://docs.google.com/spreadsheets/d/123ABCDEFG456HIJKL789MNO/export?format=csv&gid=0”
exportUrl = “ここにGoogleスプレッドシートのCSVエクスポートURLを入力”
Set wsTarget = ThisWorkbook.Sheets(“Sheet2″) ‘ ★インポート先のExcelシート名を指定してください
‘ —————-

‘ 既存のデータをクリア(必要に応じて)
wsTarget.Cells.ClearContents

‘ URLからCSVデータをインポート
With wsTarget.QueryTables.Add(Connection:=”URL;” & exportUrl, Destination:=wsTarget.Range(“A1”))
.Name = “GoogleSheetsData”
.FieldNames = True ‘ ヘッダー行を認識させる
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.TextFilePromptOnRefresh = False
.TextFilePlatform = 65001 ‘ UTF-8
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = False
.TextFileSemicolonDelimiter = False
.TextFileCommaDelimiter = True
.TextFileSpaceDelimiter = False
.TextFileOtherDelimiter = “”
.TextFileColumnDataTypes = Array(xlTextFormat) ‘ 全てテキスト形式
.TextFileTrailingMinusNumbers = True
.Refresh BackgroundQuery:=False
End With

MsgBox “Googleスプレッドシートからのデータインポートが完了しました。”, vbInformation

End Sub

**コードの解説:**

* `exportUrl`: GoogleスプレッドシートのCSVエクスポートURLを指定します。このURLは、Googleスプレッドシートの共有設定で「リンクを知っている全員」が「閲覧者」以上になっている必要があります。
* `Connection:=”URL;” & exportUrl`: `QueryTable`の接続文字列で、`TEXT;`の代わりに`URL;`を使用します。
* この方法の利点は、ローカルにCSVファイルを保存するステップを省略できることです。Googleスプレッドシート側のデータが更新されれば、このVBAを実行するだけで最新のデータを取得できます。

実務アドバイスと応用テクニック

1. エラーハンドリングの強化

上記サンプルコードは基本的なものです。実務で利用する際は、ファイルが存在しない、URLが無効、シート名が間違っているなどのエラーに備えて、`On Error Resume Next`や`On Error GoTo`を使ったエラーハンドリングを実装することを強く推奨します。

Sub ImportCsvWithErrorHandler()

Dim filePath As String
Dim wsTarget As Worksheet
Dim qt As QueryTable ‘ QueryTableオブジェクトを宣言

‘ — 設定項目 —
filePath = “C:\Users\YourUsername\Documents\google_sheet_data.csv”
On Error Resume Next ‘ エラー発生時に処理を続行
Set wsTarget = ThisWorkbook.Sheets(“Sheet1”)
On Error GoTo 0 ‘ エラーハンドリングを解除

If wsTarget Is Nothing Then
MsgBox “指定されたシートが見つかりません。”, vbCritical
Exit Sub
End If

‘ 既存のデータをクリア
wsTarget.Cells.ClearContents

‘ CSVファイルをインポート
On Error Resume Next ‘ QueryTable実行中のエラーを捕捉
Set qt = wsTarget.QueryTables.Add(Connection:=”TEXT;” & filePath, Destination:=wsTarget.Range(“A1”))
If Err.Number <> 0 Then
MsgBox “CSVファイルのインポート中にエラーが発生しました。” & vbCrLf & _
“ファイルパスを確認してください: ” & filePath & vbCrLf & _
“エラーコード: ” & Err.Number, vbCritical
Set qt = Nothing ‘ オブジェクトを解放
Exit Sub
End If
On Error GoTo 0 ‘ エラーハンドリングを解除

‘ QueryTableの設定
With qt
.Name = “ImportedCsvData”
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.TextFilePromptOnRefresh = False
.TextFilePlatform = 65001 ‘ UTF-8
.TextFileParseType = xlDelimited
.TextFileTextQualifier = xlTextQualifierDoubleQuote
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = False
.TextFileSemicolonDelimiter = False
.TextFileCommaDelimiter = True
.TextFileSpaceDelimiter = False
.TextFileOtherDelimiter = “”
.TextFileColumnDataTypes = Array(xlTextFormat)
.TextFileTrailingMinusNumbers = True
.Refresh BackgroundQuery:=False
End With

‘ QueryTable実行後のエラーチェック(Refreshでエラーが発生した場合など)
If Err.Number <> 0 Then
MsgBox “CSVファイルのインポート処理中にエラーが発生しました。” & vbCrLf & _
“エラーコード: ” & Err.Number, vbCritical
Set qt = Nothing
Exit Sub
End If

Set qt = Nothing ‘ オブジェクトを解放
MsgBox “CSVファイルのインポートが完了しました。”, vbInformation

End Sub

2. データ形式の調整

インポート時に`TextFileColumnDataTypes`でデータ型を指定しましたが、インポート後にさらにデータ形式を整形する必要がある場合もあります。例えば、日付形式の文字列をExcelの実際の日付型に変換したり、数値形式の文字列を数値型に変換したりするなどです。

‘ インポート後に実行するデータ整形例(サンプル1の後に追記)
Sub FormatImportedData()
Dim ws As Worksheet
Dim lastRow As Long
Dim colDate As Long ‘ 日付列の番号
Dim colNumber As Long ‘ 数値列の番号

Set ws = ThisWorkbook.Sheets(“Sheet1”) ‘ インポート先のシート
lastRow = ws.Cells(Rows.Count, “A”).End(xlUp).Row

‘ — 設定項目 —
colDate = 3 ‘ 例:3列目を日付として整形
colNumber = 5 ‘ 例:5列目を数値として整形
‘ —————-

‘ 日付列の整形 (例: “2023/10/27” -> Excel日付型)
On Error Resume Next ‘ エラーがあっても続行
ws.Range(ws.Cells(2, colDate), ws.Cells(lastRow, colDate)).TextToColumns _
Destination:=ws.Cells(2, colDate), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, _
Tab:=False, Semicolon:=False, Comma:=False, Space:=False, Other:=False, _
FieldInfo:=Array(1, 4), TrailingMinusNumbers:=True ‘ 4は日付形式を指定
On Error GoTo 0

‘ 数値列の整形 (例: “1,234” -> 1234)
On Error Resume Next
ws.Range(ws.Cells(2, colNumber), ws.Cells(lastRow, colNumber)).Value = _
Evaluate(“INDEX(VALUE(” & ws.Range(ws.Cells(2, colNumber), ws.Cells(lastRow, colNumber)).Address & “),0,1)”)
On Error GoTo 0

‘ 必要に応じて、セルの書式設定も変更
ws.Range(ws.Cells(2, colDate), ws.Cells(lastRow, colDate)).NumberFormat = “yyyy/mm/dd”
ws.Range(ws.Cells(2, colNumber), ws.Cells(lastRow, colNumber)).NumberFormat = “#,##0”

MsgBox “データの整形が完了しました。”, vbInformation
End Sub

3. Google Sheets API連携の検討

CSVエクスポート&インポートは手軽ですが、API連携はより高度で、リアルタイム性や柔軟なデータ取得が可能です。例えば、特定の範囲だけを取得したり、Googleスプレッドシート側で複雑な計算を行った結果だけを取得したりできます。

VBAからGoogle Sheets APIを利用するには、`MSXML2.XMLHTTP6.0`オブジェクトでAPIエンドポイントにHTTP GETリクエストを送信し、返ってきたJSONデータを解析する必要があります。JSON解析には、外部ライブラリ(例: `VBA-JSON`)を利用するか、VBA標準機能で文字列操作によって解析する(複雑ですが可能)方法があります。

API連携のメリットは以下の通りです。

* **ファイル不要:** CSVファイルをローカルに保存する手間が省けます。
* **リアルタイム性:** APIを叩けば、最新のデータを即座に取得できます。
* **柔軟性:** 特定のセル範囲、シート、フィルタリングされたデータなど、取得したいデータを細かく指定できます。
* **自動化:** 定期実行タスク(Windowsタスクスケジューラなど)と組み合わせることで、完全に自動化されたデータ連携が可能です。

ただし、API連携には、Google Cloud Platformでの設定、APIキーの管理、認証処理(OAuth 2.0など)が必要となり、実装の難易度は上がります。

4. 共有設定の重要性

URLから直接インポートする場合、Googleスプレッドシートの共有設定が「リンクを知っている全員」が「閲覧者」以上になっている必要があります。組織によっては、セキュリティポリシーでこのような共有設定が許可されていない場合もあります。その際は、CSVエクスポート&インポートの手法を選択する必要があります。

まとめ:VBAによるデータ連携の

タイトルとURLをコピーしました