どうもこんばんは、浅草のダンナこと、ASADANでこざいます。

 

さて、動画を立ち上げようとしてから2ヶ月以上が経過しましたが。

焦らなくてよかったです。

 

ここ、数ヶ月の間に色々ありました。

どの様な動画をアップすれば良いのか思案の日々でしたが、一定の方向性が生まれてきました。

 

わたしは今度「庶民に優しい経済」よりも「庶民に優しい技術」を、伝えていこうと思います。

なんと言っても

・お役立ち

・身近

ですからね^^

 

■とは言え、まだ錯綜中

勿論、この分野でも色々な有識者の方が、既に動画に進出済みです。

基本的に、できるだけ「特定の分野で」「民間の認識する分かりやすいファーストペンギンであるべきである」とまでは結論付いているもの。

どこから(どの程度の難易度からスタートするか)

 

…未だに悩み中ではあります。

 

■今回はすみません。比較的に高い難易度の話題から

 

所謂エクセルのマクロ。

Visual Basic For EXCELって呼ばれるものですが。

 

現時点で気になっていたパフォーマンス(処理速度関係の事)を、しばらく詳しく調べて生きたいと思います。

まずは、以下の表です。

 

上記の表は、私が実測しました。

何度もトライしたのですが、優位関係・比率はほぼ変わりませんでした。

 

■なんでもできるVBAだが、プログラムの組み方次第で速度が全然異なってしまう…。

今回は、テストパターンを9種類作って試してみました。

一番速いのはテスト⑥~⑨ですが…。

一番押したいのはテスト⑤です。

 

明日以降、その理由を語って生きたいと思います。

既に夜遅いので…。

とりあえずソースだけ開放します。

 

以下、ソース

--------------------------------------------------

Option Explicit                                     '変数宣言を強制する

Sub 処理方式の違いによるパフォーマンス差分測定()

    '#------------------------------------------------------------------------
    '# 爆速のおまじない
    '#------------------------------------------------------------------------
    Application.ScreenUpdating = False              '画面更新禁止
    Application.Calculation = xlCalculationManual   '自動計算禁止
    
    '#------------------------------------------------------------------------
    '# 変数・定数宣言・初期設定
    '#------------------------------------------------------------------------
    Const m As Long = 1000                  'ループ回数(1000×1000)
    Const n As Long = 5000                  'ループ回数(5000×1000)
    Const SheetName As String = "Sheet1"    '処理対象シート名
    Dim i As Long                           'ループ処理用カウンター
    Dim j As Long                           'ループ処理用カウンター
    Dim k As Long                           '演算結果格納用変数
    Dim StTime As Date                      '処理開始時刻
    Dim EndTime As Date                     '処理終了時刻
    Dim ProcTime As Long                    '処理時間
    Dim AveTime As Double                   '平均処理時間
    Dim idy1 As Long                        '出力行
    Dim idx1 As Long                        '出力列
    idy1 = 2
    
    '#------------------------------------------------------------------------
    '# テスト①セルへの代入は5000回に1回、を1000回繰り返す=500万回ループ
    '# with指定は一切なし(とは言え、一番速いはず)
    '#------------------------------------------------------------------------
    idx1 = 4                                                        '表示列初期位置=2列目(B列)
    StTime = Now()                                                  '開始時刻の記録
    For i = 1 To m                                                  '1000回ループ
        For j = 1 To n                                              '5000回ループ
            k = i * j                                               'k = i × j
        Next j
        ThisWorkbook.Sheets(SheetName).Cells(idy1 + 2, idx1).Value = k     '演算結果を表示(100回に1回)
    Next i
    EndTime = Now()                                                 '終了時刻の記録
    ProcTime = DateDiff("s", StTime, EndTime)                       '合計処理時間の計算
    AveTime = ProcTime / n                                          '1000回あたり平均処理時間
    ThisWorkbook.Sheets(SheetName).Cells(idy1 + 3, idx1).Value = ProcTime  '合計処理時間の表示
    ThisWorkbook.Sheets(SheetName).Cells(idy1 + 4, idx1).Value = AveTime   '平均処理時間の表示
    
    '#------------------------------------------------------------------------
    '# テスト②セルへの代入は毎回、を500万回繰り返す
    '# with指定は一切なし(一番遅いはず)
    '#------------------------------------------------------------------------
    idx1 = idx1 + 1                                                 '表示列を3列目に変更
    StTime = Now()                                                  '開始時刻の記録
    For i = 1 To m                                                  '1000回ループ
        For j = 1 To n                                              '5000回ループ
            k = i * j                                               'k = i × j
            ThisWorkbook.Sheets(SheetName).Cells(idy1 + 2, idx1).Value = k '演算結果を表示(毎回)
        Next j
    Next i
    EndTime = Now()                                                 '終了時刻の記録
    ProcTime = DateDiff("s", StTime, EndTime)                       '合計処理時間の計算
    AveTime = ProcTime / n                                          '1000回あたり平均処理時間
    ThisWorkbook.Sheets(SheetName).Cells(idy1 + 3, idx1).Value = ProcTime  '合計処理時間の表示
    ThisWorkbook.Sheets(SheetName).Cells(idy1 + 4, idx1).Value = AveTime   '平均処理時間の表示
    
    '#------------------------------------------------------------------------
    '# テスト③セルへの代入は毎回、を500万回繰り返す
    '# bookのwith指定
    '#------------------------------------------------------------------------
    idx1 = idx1 + 1                                                 '表示列を4列目に変更
    StTime = Now()                                                  '開始時刻の記録
    With ThisWorkbook
        For i = 1 To m                                              '1000回ループ
            For j = 1 To n                                          '5000回ループ
                k = i * j                                           'k = i × j
                .Sheets(SheetName).Cells(idy1 + 2, idx1).Value = k         '演算結果を表示(毎回)
            Next j
        Next i
    End With
    EndTime = Now()                                                 '終了時刻の記録
    ProcTime = DateDiff("s", StTime, EndTime)                       '合計処理時間の計算
    AveTime = ProcTime / n                                          '1000回あたり平均処理時間
    ThisWorkbook.Sheets(SheetName).Cells(idy1 + 3, idx1).Value = ProcTime  '合計処理時間の表示
    ThisWorkbook.Sheets(SheetName).Cells(idy1 + 4, idx1).Value = AveTime   '平均処理時間の表示
    
    '#------------------------------------------------------------------------
    '# テスト④セルへの代入は毎回、を500万回繰り返す
    '# book、sheetのwith指定
    '#------------------------------------------------------------------------
    idx1 = idx1 + 1                                                 '表示列を5列目に変更
    StTime = Now()                                                  '開始時刻の記録
    With ThisWorkbook.Sheets(SheetName)
        For i = 1 To m                                              '1000回ループ
            For j = 1 To n                                          '5000回ループ
                k = i * j                                           'k = i × j
                .Cells(idy1 + 2, idx1).Value = k                           '演算結果を表示(毎回)
            Next j
        Next i
    End With
    EndTime = Now()                                                 '終了時刻の記録
    ProcTime = DateDiff("s", StTime, EndTime)                       '合計処理時間の計算
    AveTime = ProcTime / n                                          '1000回あたり平均処理時間
    ThisWorkbook.Sheets(SheetName).Cells(idy1 + 3, idx1).Value = ProcTime  '合計処理時間の表示
    ThisWorkbook.Sheets(SheetName).Cells(idy1 + 4, idx1).Value = AveTime   '平均処理時間の表示
    
    '#------------------------------------------------------------------------
    '# テスト⑤セルへの代入は毎回、を500万回繰り返す
    '# book、sheet、cellsのwith指定
    '#------------------------------------------------------------------------
    idx1 = idx1 + 1                                                 '表示列を6列目に変更
    StTime = Now()                                                  '開始時刻の記録
    With ThisWorkbook.Sheets(SheetName).Cells(idy1 + 2, idx1)
        For i = 1 To m                                              '1000回ループ
            For j = 1 To n                                          '5000回ループ
                k = i * j                                           'k = i × j
                .Offset(0, 0).Value = k                             '演算結果を表示(毎回)
            Next j
        Next i
    End With
    EndTime = Now()                                                 '終了時刻の記録
    ProcTime = DateDiff("s", StTime, EndTime)                       '合計処理時間の計算
    AveTime = ProcTime / n                                          '1000回あたり平均処理時間
    ThisWorkbook.Sheets(SheetName).Cells(idy1 + 3, idx1).Value = ProcTime  '合計処理時間の表示
    ThisWorkbook.Sheets(SheetName).Cells(idy1 + 4, idx1).Value = AveTime   '平均処理時間の表示
    
    '#------------------------------------------------------------------------
    '# テスト⑥(参考)セルへの代入は毎回、を500万回繰り返す
    '# book、sheet、Cells(idy1 + 座標まで指定)のwith指定
    '#------------------------------------------------------------------------
    idx1 = idx1 + 1                                                 '表示列を7列目に変更
    StTime = Now()                                                  '開始時刻の記録
    With ThisWorkbook.Sheets(SheetName).Cells(idy1 + 2, idx1)
        For i = 1 To m                                              '1000回ループ
            For j = 1 To n                                          '5000回ループ
                k = i * j                                           'k = i × j
                .Value = k                                          '演算結果を表示(毎回)
            Next j
        Next i
    End With
    EndTime = Now()                                                 '終了時刻の記録
    ProcTime = DateDiff("s", StTime, EndTime)                       '合計処理時間の計算
    AveTime = ProcTime / n                                          '1000回あたり平均処理時間
    ThisWorkbook.Sheets(SheetName).Cells(idy1 + 3, idx1).Value = ProcTime  '合計処理時間の表示
    ThisWorkbook.Sheets(SheetName).Cells(idy1 + 4, idx1).Value = AveTime   '平均処理時間の表示
    
    '#------------------------------------------------------------------------
    '# テスト⑦(参考)セルへの代入は毎回、を500万回繰り返す
    '# book、sheet、cells、Offsetまでのwith指定
    '#------------------------------------------------------------------------
    idx1 = idx1 + 1                                                 '表示列を8列目に変更
    StTime = Now()                                                  '開始時刻の記録
    With ThisWorkbook.Sheets(SheetName).Cells(idy1 + 2, idx1).Offset(0, 0)
        For i = 1 To m                                              '1000回ループ
            For j = 1 To n                                          '5000回ループ
                k = i * j                                           'k = i × j
                .Value = k                                          '演算結果を表示(毎回)
            Next j
        Next i
    End With
    EndTime = Now()                                                 '終了時刻の記録
    ProcTime = DateDiff("s", StTime, EndTime)                       '合計処理時間の計算
    AveTime = ProcTime / n                                          '1000回あたり平均処理時間
    ThisWorkbook.Sheets(SheetName).Cells(idy1 + 3, idx1).Value = ProcTime  '合計処理時間の表示
    ThisWorkbook.Sheets(SheetName).Cells(idy1 + 4, idx1).Value = AveTime   '平均処理時間の表示
    
    '#------------------------------------------------------------------------
    '# テスト⑧(参考)セルへの代入は毎回、を500万回繰り返す
    '# book、sheet、cells、Offsetまでのwith指定
    '#------------------------------------------------------------------------
    idx1 = 1000                                                     '表示列を1000列離す
    idy1 = 1000                                                     '表示行を1000行離す
    StTime = Now()                                                  '開始時刻の記録
    With ThisWorkbook.Sheets(SheetName).Cells(idy1 + 2, idx1).Offset(0, 0)
        For i = 1 To m                                              '1000回ループ
            For j = 1 To n                                          '5000回ループ
                k = i * j                                           'k = i × j
                .Value = k                                          '演算結果を表示(毎回)
            Next j
        Next i
    End With
    EndTime = Now()                                                 '終了時刻の記録
    ProcTime = DateDiff("s", StTime, EndTime)                       '合計処理時間の計算
    AveTime = ProcTime / n                                          '1000回あたり平均処理時間
    ThisWorkbook.Sheets(SheetName).Cells(idy1 + 3, idx1).Value = ProcTime  '合計処理時間の表示
    ThisWorkbook.Sheets(SheetName).Cells(idy1 + 4, idx1).Value = AveTime   '平均処理時間の表示
    
    '#------------------------------------------------------------------------
    '# テスト⑨(参考)セルへの代入は毎回、を500万回繰り返す
    '# book、sheet、cells、Offsetまでのwith指定
    '#------------------------------------------------------------------------
    idx1 = 1001                                                     '表示列を1001列離す
    idy1 = 1001                                                     '表示行を1001行離す
    StTime = Now()                                                  '開始時刻の記録
    With ThisWorkbook.Sheets(SheetName).Cells(idy1 + 2, idx1).Offset(0, 0)
        For i = 1 To m                                              '1000回ループ
            For j = 1 To n                                          '5000回ループ
                k = i * j                                           'k = i × j
                .Value = k                                          '演算結果を表示(毎回)
            Next j
        Next i
    End With
    EndTime = Now()                                                 '終了時刻の記録
    ProcTime = DateDiff("s", StTime, EndTime)                       '合計処理時間の計算
    AveTime = ProcTime / n                                          '1000回あたり平均処理時間
    ThisWorkbook.Sheets(SheetName).Cells(idy1 + 3, idx1).Value = ProcTime  '合計処理時間の表示
    ThisWorkbook.Sheets(SheetName).Cells(idy1 + 4, idx1).Value = AveTime   '平均処理時間の表示
    
    '#------------------------------------------------------------------------
    '# 爆速のおまじない、おしまい
    '#------------------------------------------------------------------------
    Application.ScreenUpdating = True                   '画面更新許可
    Application.Calculation = xlCalculationAutomatic    '自動計算許可
    
End Sub