粗茶でございます日本語 プログラミング 言語 「なでしこ」 大好き 

この記事に含まれるtag :
Excel  VBA  

スポンサーサイト

   ↑  --/--/-- (--)  カテゴリー: スポンサー広告
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

(記事編集) http://nadesocha.blog.fc2.com/?overture" target="_new

--/--/-- | Comment (-) | ホーム | ↑ ページ先頭へ ↑ |

ExcelVBA 二次元配列の行数を動的に変更する

   ↑  2013/01/01 (火)  カテゴリー: Excel
 動的配列を使えば、配列の要素数が増減しても、配列を再定義することで対応できます。
 しかし、二次元配列の場合は少し面倒なことがあります。それは、要素数を変更できるのは2次元目だという点です。

 そこで、二次元配列の1次元目の要素数を変更する関数を作成しました。
 解説は気が向いたらここに追記します。

Option Explicit

Public Sub ArraySample()

Dim myArray As Variant, addArray As Variant
Dim idx_i As Long, idx_j As Long

ReDim myArray(9, 4) '10行5列の2次元配列を宣言
For idx_i = 0 To 9
For idx_j = 0 To 4
'配列に適当なデータを設定
myArray(idx_i, idx_j) = idx_i * 10 + idx_j
Next idx_j
Next idx_i

'5行目にデータを追加
ReDim addArray(4)
For idx_i = 0 To 4
addArray(idx_i) = idx_i + 1000
Next idx_i
Array_Add myArray, addArray, 5

'8行目のデータを削除
Array_Del myArray, 8

'結果をシートに出力
Range(Cells(1, 1), Cells(UBound(myArray, 1) + 1, _
UBound(myArray, 2) + 1)) = myArray

End Sub

Public Sub Array_Add(ByRef inArray As Variant, _
ByVal inValue As Variant, Optional ByVal inRow As Variant)

Dim tmpArray As Variant
Dim idx_tmp As Long
Dim idx_i As Long, idx_j As Long

'inRowは挿入位置
If IsMissing(inRow) Then inRow = UBound(inArray, 1) + 1

'現在の配列内容をコピー
tmpArray = inArray

'配列を再定義
ReDim inArray(UBound(inArray, 1) + 1, UBound(inArray, 2)) '1行追加

'tmpArrayの内容を戻す
idx_tmp = LBound(tmpArray, 1)
For idx_i = LBound(inArray, 1) To UBound(inArray, 1)
If idx_i = inRow Then
'挿入位置にデータを追加
For idx_j = LBound(inValue) To UBound(inValue)
inArray(idx_i, idx_j) = inValue(idx_j)
Next idx_j
Else
'挿入位置でなければそのまま戻す
For idx_j = LBound(tmpArray, 2) To UBound(tmpArray, 2)
inArray(idx_i, idx_j) = tmpArray(idx_tmp, idx_j)
Next idx_j
idx_tmp = idx_tmp + 1
End If
Next idx_i

End Sub

Public Sub Array_Del(ByRef inArray As Variant, _
Optional ByVal inRow As Variant)

Dim tmpArray As Variant
Dim idx_tmp As Long
Dim idx_i As Long, idx_j As Long

'inRowは削除位置
If IsMissing(inRow) Then inRow = UBound(inArray, 1)

'現在の配列内容をコピー
tmpArray = inArray

'配列を再定義
ReDim inArray(UBound(inArray, 1) - 1, UBound(inArray, 2)) '1行削除

'tmpArrayの内容を戻す
idx_tmp = LBound(tmpArray, 1)
For idx_i = LBound(tmpArray, 1) To UBound(tmpArray, 1)
If idx_i <> inRow Then
'削除位置でなければそのまま戻す
For idx_j = LBound(tmpArray, 2) To UBound(tmpArray, 2)
inArray(idx_tmp, idx_j) = tmpArray(idx_i, idx_j)
Next idx_j
idx_tmp = idx_tmp + 1
End If
Next idx_i

End Sub


ArraySampleの実行結果
実行結果


関連記事

この記事に含まれるtag : Excel VBA 

FC2スレッドテーマ : プログラミング (ジャンル : コンピュータ

(記事編集) http://nadesocha.blog.fc2.com/blog-entry-164.html

2013/01/01 | Comment (0) | Trackback (0) | ホーム | ↑ ページ先頭へ ↑ |

Comment

コメント:を投稿する 記事: ExcelVBA 二次元配列の行数を動的に変更する

お気軽にコメント:をぞうぞ。
非公開 (管理人のみ閲覧可能なコメント:) にしたい場合には、ロック にチェックを入れてください。

  任意 : 後から修正や削除ができます。
  非公開コメント:として投稿する。(管理人にのみ公開)

Trackback

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。