1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ChatGPTAdvent Calendar 2024

Day 2

【ExcelVBA】VBAを書いてもらったら高速化もお願いする【ChatGPT】

Posted at

ExcelVBA高速化の手法の一つに、セルに代入する時は1セルずつ代入するのではなく、代入する値を配列に入れて一度に代入するという手法がある。

GPT-4にExcelVBAを書いてもらうと、だいたい初めは1セルずつ代入するマクロを提示してくる。処理する件数が少なければそれでも特に問題はないが、処理が遅いと感じたら「高速化してください」と依頼し配列に書き直してもらおう。

セル範囲A1:E10に、各セルの列番号と行番号を掛けた値を入力するマクロを書いてください。」と依頼すると書いてくれるマクロがこちら。この程度の件数なら何も問題ないが、セルへの書き出しは1セルごとに行っている。

Sub FillMultiplicationTable()
    Dim ws As Worksheet
    Dim rowNum As Long, colNum As Long

    ' 現在のアクティブシートを取得
    Set ws = ActiveSheet

    ' A1:E10の範囲をループ
    For rowNum = 1 To 10
        For colNum = 1 To 5
            ' セルに列番号と行番号の積を設定
            ws.Cells(rowNum, colNum).Value = rowNum * colNum
        Next colNum
    Next rowNum

    ' 完了メッセージ
    MsgBox "A1:E10の範囲に値を入力しました。", vbInformation
End Sub

より高速に動作するように改良できますか?」と要望すると、画面描画の停止に加え、配列で一度に出力するよう書き直してくれる。最初からこちらで書いてほしい気もするが、可読性を優先しているのかもしれない。

Sub FillCellsWithProductOptimized()
    Dim ws As Worksheet
    Dim rowNum As Long
    Dim colNum As Long
    Dim dataArray(1 To 10, 1 To 5) As Long
    
    ' アクティブシートを対象
    Set ws = ActiveSheet
    
    ' 高速化設定
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    
    ' 配列に計算結果を格納
    For rowNum = 1 To 10
        For colNum = 1 To 5
            dataArray(rowNum, colNum) = rowNum * colNum
        Next colNum
    Next rowNum
    
    ' 配列を一括でセルに反映
    ws.Range("A1:E10").Value = dataArray
    
    ' 高速化設定を解除
    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True
End Sub
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?