トップ > 資格を活かすには > やってみよう!Excel VBAで業務改善! > 新たなる挑戦編: 第15話「配列変数でセルを書き換えよう!」1/4 :置き換えのヒント

やってみよう!Excel VBAで業務改善! 新たなる挑戦編|第15話 「配列変数でセルを書き換えよう!」

置き換えのヒント

「…とまあ、配列変数による代入に関しては、こんな感じだ。
なにか質問はあるかい?」
八木くんのマンションでは、延々と続いていた解説がやっと終わったところです。

「なるほど、配列変数による代入の仕組みについては、だいたい理解できたよ。
…でもそれを、俺が作ったCSV取り込み処理の中に組み込まなければ意味がないんだろう?
…それは、どうやってやるんだい?」
「それを考えるのが、お前の仕事だろう?」 そっけなく答える八木くんに、星くんは口をパクパクとさせます。

「…とまあ、それではちょっとかわいそうだから、ヒントを教えてやるよ。
まず、バリアント変数に格納するセル範囲は、セルA1から使用されている最終行、最終列までになるよ。
なぜならおまえの作ったCSV取り込み処理は、行番号を格納する変数rや、列番号を格納する変数cなどが、
セルA1を基準に動作するように実装されているからだ」
星くんは手帳を取り出して、カリカリとメモを取ります。

「…あと、バリアント型変数に処理を置き換えるべき箇所は、ここと、ここと…ここになる」 八木くんがVBEの画面を指さします。

Sub CSVデータ取り込み()
        :
                For i = 1 To UBound(v)
                    If v(i) <> "" Then
                        日付 = Mid(v(i), 1, InStr(v(i), ":") - 1)
                        数量 = Mid(v(i), InStr(v(i), ":") + 1)
                        c = 日付列取得(日付)
                        If c <> 0 Then
                            Cells(r, c) = 数量
                        End If
                    End If
                Next i
        :
End Sub

Private Function 製品行取得(ByVal 製品 As String) As Long
  :
    For r = 6 To Cells(Rows.Count, 1).End(xlUp).Row
        If  Cells(r, 1) = 製品 Then
            製品行取得 = r
            Exit Function
        End If
    Next r
  :
End Function

Private Function 日付列取得(ByVal 日付 As String) As Long
  :
    For c = 4 To Cells(4, Columns.Count).End(xlToLeft).Column
        If Format(Cells(4, c), "yyyymmdd") = 日付 Then
            日付列取得 = c
            Exit Function
        End If
    Next c
  :
End Function

「この3つは共にループの中にあり、頻繁にセルの読み書きを行っている箇所だ。
ここを、配列変数に置き換えるだけで、処理は飛躍的に速くなるよ」
「…ちょっとまった!
配列変数はCSVデータ取り込みプロシージャの中に宣言するんだよね?
どうやって製品行取得や、日付列取得プロシージャの中で利用すればいいんだい?」
八木くんはニンマリとしました。

一覧にもどる