トップ > 資格を活かすには > やってみよう!Excel VBAで業務改善! > 新たなる挑戦編: 第15話「配列変数でセルを書き換えよう!」2/4 :引数で渡せばいいじゃないか

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

引数で渡せばいいじゃないか

「配列変数を引数で渡せばいいじゃないか、星。
ほかの変数と同じだよ。
ただこのとき、頭にByValをつけないで引数を渡すんだ。
いいかい?もう一度言うよ。ByValをつけずに引数を渡すんだ。
…なぜそうするのかは、お前のVBAスキルがもう少し上達したら教えてやる」
星くんは、カリカリと必死になってメモを取っています。

「…こんなところかな?
処理の最後に、配列変数からセルへの書き戻しを忘れないようにな。
…じゃあ、明日!会社でがんばってくれ!!」
八木くんは、星くんの背中をバーンと叩きました。




次の日の会社、星くんはPCの画面とにらめっこをしています。
少し離れたところから、岬さんがチラチラと星くんの様子をうかがっています。

「…よし!昨日、八木から教えてもらった内容を、早速コードに実装するか。
まずはバリアント型変数を宣言しなくちゃ…」
星くんはバリアント型変数wrkを、宣言しました。

  :
    Dim Counter As Long
    Dim wrk As Variant
  :

「…次にセル範囲を変数wrkに代入する。
八木はセルA1から使用されている最終行、最終列までを格納しろといってたな…」

  :
    wrk = Range(Cells(1, 1), Cells(Cells(Rows.Count, 1).End(xlUp).Row, _
          Cells(4, Columns.Count).End(xlToLeft).Column))
  :

「これでよし…と。
Cells(1, 1)からCells(最終行, 最終列)までをRangeオブジェクトに指定して…変数wrkに代入だ。
これで変数wrkには、現在使用されているセル範囲が格納されているはずだ。
…ついでに処理の最後に書き戻すところも書いておくか…」
星くんはCSVデータ取り込みプロシージャの最後に、次のコードを記述しました。

  :
    Range(Cells(1, 1), Cells(Cells(Rows.Count, 1).End(xlUp).Row, _
          Cells(4, Columns.Count).End(xlToLeft).Column)) = wrk
  :

「よし!書き戻しは、セル範囲に変数wrkの内容を代入すればいいから、
さっきのコードの右辺と左辺を入れ替えるだけでオッケーだ」
星くんは目を閉じ、八木くんが昨日いったセリフを思い出します。

「…あとは、Cellsプロパティでセルの読み書きを行っている3か所を、
変数wrkに置き換えればいいんだっけ…
置き換えるのは、こことここと…ここだったな…」
カタカタと星くんが、該当箇所を修正していきます。

「…よし!製品行取得と日付列取得プロシージャには、引数を渡してあげなきゃ…。
あっと、このときはByValをつけちゃだめだっていってたな…」

Private Function 製品行取得(ByVal 製品 As String, wrk As Variant) As Long

Private Function 日付列取得(ByVal 日付 As String, wrk As Variant) As Long
一覧にもどる