Project_OKI’s diary

エンジニアの勉強ブログ

chatGPTを使用してVBAを行うメモ1(他のエクセルへのコピー)

chatGPTを使用してVBAを行う1

 

VBAに触れたことがない私でも、エクセルの操作を簡単に行いたいと思い、chatGPTに相談しながらVBAを使ってやりたいことを実現しました。

chatGPTは非常に有能で、初心者でも使いやすく、おすすめです。

 

・目次

 

1. 行いたいこと

  複数あるエクセルファイルの同じ列のものを、別のエクセルファイルに抽出したい。
 
  流れ:
 ・上記内容のVBAプログラムを書いてもらう。
 ・コメントを付けてもらう。
 ・解説してもらう。
 ・自分様に変更する。
 

2.質問と回答 

 質問:

 複数あるエクセルファイルの同じ列のものを、別のエクセルファイルに抽出するプログラムをVBAで書いて

 答え

Sub ExtractDataFromMultipleFiles()
    Dim sourceFolder As String, destinationFile As String
    Dim sourceWorkbook As String, sourceSheet As String
    Dim destinationWorkbook As String, destinationSheet As String
    Dim lastRow As Long, lastColumn As Long, lastColumnLetter As String
    
    ' フォルダとファイルのパスを指定
    sourceFolder = "C:\Users\UserName\SourceFolder\"
    destinationFile = "C:\Users\UserName\DestinationFile.xlsx"
    
    ' 抽出元のワークブック、ワークシートを指定
    sourceWorkbook = "SourceWorkbook.xlsx"
    sourceSheet = "SourceSheet"
    
    ' 抽出先のワークブック、ワークシートを指定
    destinationWorkbook = "DestinationWorkbook.xlsx"
    destinationSheet = "DestinationSheet"
    
    ' 最終行、最終列の取得
    Workbooks(sourceWorkbook).Activate
    lastRow = Workbooks(sourceWorkbook).Sheets(sourceSheet).Cells(Rows.Count, 1).End(xlUp).Row
    lastColumn = Workbooks(sourceWorkbook).Sheets(sourceSheet).Cells(1, Columns.Count).End(xlToLeft).Column
    lastColumnLetter = Split(Cells(1, lastColumn).Address, "$")(1)
    
    ' データのコピー
    Workbooks(sourceWorkbook).Sheets(sourceSheet).Range("A1:" & lastColumnLetter & lastRow).Copy _
        Destination:=Workbooks(destinationFile).Sheets(destinationSheet).Range("A1")
    
    ' コピーしたい列のヘッダー行を含む行全体をコピー
Workbooks(destinationFile).Sheets(destinationSheet).Range("A1").EntireRow.Insert
    Workbooks(sourceWorkbook).Sheets(sourceSheet).Range("A1:" & lastColumnLetter & "1").Copy _
        Destination:=Workbooks(destinationFile).Sheets(destinationSheet).Range("A1")
End Sub

 

質問:

 コメントをつけて

 

答え

Sub ExtractDataFromMultipleFiles()
    Dim sourceFolder As String, destinationFile As String
    Dim sourceWorkbook As String, sourceSheet As String
    Dim destinationWorkbook As String, destinationSheet As String
    Dim lastRow As Long, lastColumn As Long, lastColumnLetter As String
    
    ' フォルダとファイルのパスを指定
    sourceFolder = "C:\Users\UserName\SourceFolder\" ' 抽出元のフォルダパス
    destinationFile = "C:\Users\UserName\DestinationFile.xlsx" ' 抽出先のファイルパス
    
    ' 抽出元のワークブック、ワークシートを指定
    sourceWorkbook = "SourceWorkbook.xlsx" ' 抽出元のワークブック名
    sourceSheet = "SourceSheet" ' 抽出元のワークシート名
    
    ' 抽出先のワークブック、ワークシートを指定
    destinationWorkbook = "DestinationWorkbook.xlsx" ' 抽出先のワークブック名
    destinationSheet = "DestinationSheet" ' 抽出先のワークシート名
    
    ' 最終行、最終列の取得
    Workbooks(sourceWorkbook).Activate ' 抽出元のワークブックをアクティブにする
    lastRow = Workbooks(sourceWorkbook).Sheets(sourceSheet).Cells(Rows.Count, 1).End(xlUp).Row ' 抽出元のワークシートの最終行を取得
    lastColumn = Workbooks(sourceWorkbook).Sheets(sourceSheet).Cells(1, Columns.Count).End(xlToLeft).Column ' 抽出元のワークシートの最終列を取得
    lastColumnLetter = Split(Cells(1, lastColumn).Address, "$")(1) ' 最終列のアルファベット表記を取得
    
    ' データのコピー
    Workbooks(sourceWorkbook).Sheets(sourceSheet).Range("A1:" & lastColumnLetter & lastRow).Copy _
        Destination:=Workbooks(destinationFile).Sheets(destinationSheet).Range("A1") ' 抽出元のデータを抽出先にコピー
    
    ' コピーしたい列のヘッダー行を含む行全体をコピー
    Workbooks(destinationFile).Sheets(destinationSheet).Range("A1").EntireRow.Insert ' コピーしたい列のヘッダー行を含む行全体を挿入
    Workbooks(sourceWorkbook).Sheets(sourceSheet).Range("A1:" & lastColumnLetter & "1").Copy _
        Destination:=Workbooks(destinationFile).Sheets(destinationSheet).Range("A1") ' 抽出元のヘッダー行を抽出先にコピー
End Sub

 

質問:

解説して

 

答え

sourceFolder = "C:\Users\UserName\SourceFolder\"
destinationFile = "C:\Users\UserName\DestinationFile.xlsx"
sourceWorkbook = "SourceWorkbook.xlsx"
sourceSheet = "SourceSheet"
destinationWorkbook = "DestinationWorkbook.xlsx"
destinationSheet = "DestinationSheet"

それぞれ、

 ・抽出元のフォルダのパス、

 ・抽出したデータを保存するファイルのパス、

 ・抽出元のエクセルファイル名、

 ・抽出元のエクセルファイル内の抽出対象のシート名、

 ・抽出したデータを保存するエクセルファイル名、

 ・保存先のエクセルファイル内のシート名

を指定しています。

 

lastRow = Workbooks(sourceWorkbook).Sheets(sourceSheet).Cells(Rows.Count, 1).End(xlUp).Row
lastColumn = Workbooks(sourceWorkbook).Sheets(sourceSheet).Cells(1, Columns.Count).End(xlToLeft).Column
lastColumnLetter = Split(Cells(1, lastColumn).Address, "$")(1)

 ・指定されたエクセルファイル内の指定されたシートの

  最終行と最終列を取得しています。

 

Workbooks(sourceWorkbook).Sheets(sourceSheet).Range("A1:" & lastColumnLetter & lastRow).Copy _
Destination:=Workbooks(destinationFile).Sheets(destinationSheet).Range("A1")

データのコピーを行います。

 ・抽出元のエクセルファイルの指定されたシートのデータを、

  指定された範囲でコピーする。

 ・指定されたエクセルファイルの指定されたシートの指定されたセルに貼り付けています。

 

Workbooks(destinationFile).Sheets(destinationSheet).Range("A1").EntireRow.Insert
Workbooks(sourceWorkbook).Sheets(sourceSheet).Range("A1:" & lastColumnLetter & "1").Copy _

 ・コピーしたい列のヘッダー行を含む行全体をコピーして、

  先頭行に貼り付けています。

 

上記プログラムを使用して、パスなどを編集する。

実際には、これでは複数ファイルの取り込みはできないので、

それを追加して完了。

全く使ったことなかったが、やりたいことが出来て素晴らしかった。

 

質問:

このプログラムをどこに書けばいいの

 

答え:

このプログラムを実行するためには、

以下の手順でVBAエディターを開いてから、

新しいモジュールを作成

そのモジュールにプログラムをコピー&ペーストして保存する必要があります。

 

1. エクセルファイルを開きます。
2. [開発]タブを表示します。
3. [Visual Basic]ボタンをクリックします。
4. [挿入]メニューから[モジュール]をクリックします。
5. 新しいモジュールがエディターウィンドウに表示されます。
6. モジュールにプログラムをコピー&ペーストして保存します。


プログラムを保存したら、エクセルファイルを閉じます。その後、エクセルファイルを再度開き、[開発]タブからマクロを実行することができます。

 
 
質問:
A1に入力されている文字列をVBAで取得する方法をプログラムで書いて
 
答え:
Dim str As String
str = Range("A1").Value
Rangeオブジェクトを使用してセルA1を参照し、Valueプロパティを使ってその値をstr変数に割り当てています。
strには、A1セルに入力された文字列が格納されます。
 

5.関連記事

関連記事一覧: