GeminiではExcelマクロを作成できるとのことだったので、ちょうど解析したいデータがあったのでデータ抜き出しようのマクロを作成させてみました。
いや、本当にあっという間にできたので…びっくりです。
記録してあるデータ
私がよく遊んでいる「モンスターハンターNOW」について、キャッチコピーを考えてもらいました。
依頼文がこちら
Excelマクロを作ってください。条件は列2にサイクル数1~200が入っており、1サイクル12行のデータが列4~7に記録されています。行数をサイクルの開始時1,終了時12として記録Noとい変数に格納します。そしてサイクル実施時のデータを変数Data1(サイクル数,記録No)、Data2(サイクル数,記録No)、Data3(サイクル数,記録No)、Data4(サイクル数,記録No)に記録する
そして回答案がこちら
Excelマクロ作成のご提案
理解と目標の確認
ご要望をまとめると、以下のようになります。
- データ構造:
- 列2: サイクル数 (1~200)
- 列4~7: 各サイクルのデータ (1サイクル12行)
- 目的:
- 各サイクルの開始行と終了行を記録No変数に格納
- 各サイクルのデータをData1~Data4の変数に格納
マクロコード
Sub データ抽出()
Dim i As Long, j As Long, cycle As Long
Dim lastRow As Long
Dim recordNo As Long
Dim Data1(200, 12) As Variant, Data2(200, 12) As Variant, Data3(200, 12) As Variant, Data4(200, 12) As Variant
' データ範囲の最終行を取得
lastRow = Cells(Rows.Count, 2).End(xlUp).Row
' サイクルごとに処理
For cycle = 1 To 200
' 開始行と終了行を計算
recordNo = 12 * (cycle - 1) + 1
' データを配列に格納
For i = 1 To 12
Data1(cycle, i) = Cells(recordNo + i - 1, 4).Value
Data2(cycle, i) = Cells(recordNo + i - 1, 5).Value
Data3(cycle, i) = Cells(recordNo + i - 1, 6).Value
Data4(cycle, i) = Cells(recordNo + i - 1, 7).Value
Next i
Next cycle
' ※この後、配列Data1~Data4のデータをグラフ化したり、別のシートに転記したりする処理を追加できます
End Sub
コード解説
- 変数宣言:
i
,j
,cycle
: ループ用カウンタlastRow
: データ範囲の最終行recordNo
: 各サイクルの開始行Data1
~Data4
: データを格納する2次元配列
- 最終行の取得:
Cells(Rows.Count, 2).End(xlUp).Row
で、列2の最後のデータの行番号を取得します。
- サイクルごとの処理:
For cycle = 1 To 200
で、サイクル数1から200まで繰り返します。recordNo
に、各サイクルの開始行を計算して格納します。For i = 1 To 12
で、各サイクルの12行分のデータを配列に格納します。
- データの格納:
Cells(recordNo + i - 1, 4).Value
のように、セル値を配列に代入します。
使い方
- VBEを開く: Excel画面上で、Alt+F11 キーを押してVBE(Visual Basic Editor)を開きます。
- モジュール挿入: 挿入メニューから、標準モジュールを挿入します。
- コード貼り付け: 上記のコードをモジュールに貼り付けます。
- マクロ実行: マクロを実行したいときに、このコードを呼び出します。
注意点
- データ範囲: 上記のコードは、データがA列から始まっていることを前提としています。データの範囲が異なる場合は、セル参照部分を修正してください。
- 配列のサイズ:
Data1
~Data4
の配列サイズは、最大サイクル数と1サイクルあたりの行数に合わせて調整してください。 - データの利用: このコードでは、データを配列に格納するまでです。この後、グラフ化したり、別のシートに転記したりする処理を追加する必要があります。
拡張
- エラー処理: データの形式が不正な場合などのエラー処理を追加できます。
- 条件分岐: 特定の条件を満たすデータのみを抽出する処理を追加できます。
- 関数化: この処理を関数化することで、他のマクロから呼び出すことができます。
このコードをベースに、ご自身のデータに合わせてカスタマイズしてください。
数秒で、このマクロを表示してくれました。いつもなら、(゚д゚)(。_。)ウン(゚д゚)(。_。)ウン取頭をひねりながら30分~1時間ぐらいかけて自作していたんですが…こりゃ便利ですわ。
ちなみにCopilotでも同様のことができるか、試してみた結果がこちら。
Sub RecordCycleData()
Dim CycleNum As Long
Dim RecordNo As Long
Dim Data1(1 To 200, 1 To 12) As Double
Dim Data2(1 To 200, 1 To 12) As Double
Dim Data3(1 To 200, 1 To 12) As Double
Dim Data4(1 To 200, 1 To 12) As Double
Dim i As Long, j As Long
' 列2にサイクル数が入っている前提で、シートの最後の行を取得
lastRow = Cells(Rows.Count, 2).End(xlUp).Row
' サイクル数1から200までループ
For CycleNum = 1 To 200
' サイクルの開始時1、終了時12でデータを変数に格納
For i = 1 To lastRow
If Cells(i, 2).Value = CycleNum Then
For j = 1 To 12
RecordNo = j
Data1(CycleNum, RecordNo) = Cells(i + j - 1, 4).Value
Data2(CycleNum, RecordNo) = Cells(i + j - 1, 5).Value
Data3(CycleNum, RecordNo) = Cells(i + j - 1, 6).Value
Data4(CycleNum, RecordNo) = Cells(i + j - 1, 7).Value
Next j
End If
Next i
Next CycleNum
End Sub
コメント付きで、簡単に作ってくれました…本気で生成AIやべぇ…