VBAで配列に日付を格納する方法|配列初期化の問題と解決策

Office系ソフトウェア

VBAを使用して日付を配列に格納する際、配列の初期化がうまくいかない問題に直面することがあります。この記事では、配列に日付を格納する際によくある問題と、その解決策について詳しく解説します。

VBAでの日付の配列格納の基本

VBAでは、配列を使用して複数の値を格納することができます。日付データも例外ではなく、配列に格納して処理を行うことができます。しかし、配列を動的に変更する際に注意しなければならない点がいくつかあります。

以下のコード例では、配列に日付データを格納しようとしているシナリオを示しています。

Private Sub cmdSum_Click() 
Dim a As Variant 
Dim s() As Date 
For i = 2 To Cells(Rows.Count, 5).End(xlUp).Row 
 a = Cells(i, 5).Value 
 ReDim s(a) 
Next 
End Sub

このコードは、シートのセルから日付データを取得して配列に格納しようとしていますが、実行時に配列が初期化されてしまう問題があります。この問題の原因とその解決方法を見ていきましょう。

ReDimを使用した配列の初期化問題

問題となっているのは、配列に新たなデータを追加する際に使っている`ReDim`ステートメントです。`ReDim`は、配列のサイズを動的に変更する際に使用しますが、通常、配列を再初期化してしまうため、配列内の元々格納されていたデータが失われてしまいます。

配列のサイズを変更したい場合でも、既存のデータを保持したい場合には、`ReDim Preserve`を使用する必要があります。この方法を使うことで、配列の内容を保ちながらサイズを変更できます。

解決策:ReDim Preserveの使用

上記の問題を解決するためには、`ReDim Preserve`を使って配列を再サイズする必要があります。これにより、既存のデータを保持したまま、配列のサイズを変更できます。以下は修正されたコード例です。

Private Sub cmdSum_Click() 
Dim a As Variant 
Dim s() As Date 
Dim i As Integer 
For i = 2 To Cells(Rows.Count, 5).End(xlUp).Row 
 a = Cells(i, 5).Value 
 If i = 2 Then 
  ReDim s(1) 
 End If 
 ReDim Preserve s(i - 2) 
 s(i - 2) = a 
Next 
End Sub

この修正では、配列`s`に日付を格納する際に`ReDim Preserve`を使用して、配列のサイズを変更しています。`i – 2`とすることで、配列のインデックスが0から始まるように調整しています。

配列に日付を格納する際のポイント

日付を配列に格納する際のポイントは、以下の通りです。

  • 配列の初期化: 初めて配列にデータを格納する際には、`ReDim`で配列のサイズを設定します。
  • 既存データの保持: 配列に新しい要素を追加する際は、`ReDim Preserve`を使用して既存のデータを保持します。
  • 日付型の配列: 配列の型を`Date`に設定して、日付データを格納できるようにします。

これらのポイントを守ることで、VBAでの配列操作がスムーズに行えます。

まとめ

VBAで日付を配列に格納する際の問題は、`ReDim`を使った配列の再初期化に起因していることが多いです。`ReDim Preserve`を使用することで、配列のデータを保持したままサイズを変更できます。これを適切に使用することで、配列操作がうまくいくようになります。

もしさらに効率的な方法や他の質問があれば、ぜひ試してみてください。VBAを使いこなすことで、作業が格段に効率化されるでしょう。

コメント

タイトルとURLをコピーしました