Toma(とま)のゲーム日記

MHNOW、MHWIB、ELDEN RING、WILD HEARTSなどの役立ち情報をアップしていきます。ツイッターでの懸賞応募、自炊、家庭菜園といろいろ始めました。

記事内に商品プロモーションを含む場合があります。

Geminiでデータ抜き出用のマクロを作成した…あっという間にできた💦

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

 

コード解説

  1. 変数宣言:
    • i, j, cycle: ループ用カウンタ
    • lastRow: データ範囲の最終行
    • recordNo: 各サイクルの開始行
    • Data1Data4: データを格納する2次元配列
  2. 最終行の取得:
    • Cells(Rows.Count, 2).End(xlUp).Row で、列2の最後のデータの行番号を取得します。
  3. サイクルごとの処理:
    • For cycle = 1 To 200 で、サイクル数1から200まで繰り返します。
    • recordNo に、各サイクルの開始行を計算して格納します。
    • For i = 1 To 12 で、各サイクルの12行分のデータを配列に格納します。
  4. データの格納:
    • Cells(recordNo + i - 1, 4).Value のように、セル値を配列に代入します。

使い方

  1. VBEを開く: Excel画面上で、Alt+F11 キーを押してVBE(Visual Basic Editor)を開きます。
  2. モジュール挿入: 挿入メニューから、標準モジュールを挿入します。
  3. コード貼り付け: 上記のコードをモジュールに貼り付けます。
  4. マクロ実行: マクロを実行したいときに、このコードを呼び出します。

注意点

  • データ範囲: 上記のコードは、データがA列から始まっていることを前提としています。データの範囲が異なる場合は、セル参照部分を修正してください。
  • 配列のサイズ: Data1Data4 の配列サイズは、最大サイクル数と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やべぇ…