
こんにちは、
VBAの二次元配列で1つ目の箱を増やしたいのですがどのようにすればよいのでしょうか?
ReDimの代わりになる方法を探してsub_t_expensesというのを作り
そっちに移してから、またt_expensesに移し替える?方法も考えたのですが結局どう組めばいいかわからず。
例
dim t_expenses (1, 1) As String
t_expenses(0, 0) = 2019
t_expenses(0, 1) = 01
t_expenses(1, 0) = 2019
t_expenses(1, 1) = 02
....処理の途中で箱を増やしたい
....Redim t_expenses (2, 1) できないですが・・・
t_expenses(2, 0) = 2020
t_expenses(2, 1) = 01
No.2ベストアンサー
- 回答日時:
こんにちは
通常の多次元配列ではなく、Variant型で「配列の配列」にすれば可能です。
引数の記述が ary(i, j) ではなく ary(i)(j) のようになるのと、取り扱いがそれなりに面倒なのを許容できればですが…
詳しくは「ジャグ配列」などで検索してみてください。
以下でごく簡単なテストをしてみました。
Dim ary()
For i = 0 To 2
ReDim Preserve ary(i)
k = i * 100
ary(i) = Array(k + 0, k + 1, k + 2)
Next i
' 以下は、確認のための出力
For i = 0 To UBound(ary)
For j = 0 To UBound(ary(i))
Cells(i + 1, j + 1).Value = ary(i)(j)
Next j
Next i
No.8
- 回答日時:
個人的な意見ですが No.3 のようにすれば出来ますが、毎回毎回拡張するのではとても非効率です。
起動時にその日の拡張予定分まで一気に広げておいて作業した方が良いと思いますけど…何か問題があるのでしょうか?No.7
- 回答日時:
めぐみん_さんへ
その前の「a_tmp = t_expenses」で「a_tmp」に退避しています。
Variant 型の変数に配列を代入すると要素数など丸々コピーされる事を利用しています。
「ReDim t_expenses(2, 1)」で消されたものを
-------------------------------------------------------
For i = 0 To 1
For j = 0 To 1
t_expenses(i, j) = a_tmp(i, j)
Next
Next
-------------------------------------------------------
で退避していたものだけを代入し直しています。
No.6
- 回答日時:
GooUserラック さんへ
>ReDim t_expenses(2, 1)
こちらですと要素数の範囲は広げられますが、既に入っていたはずの要素にあるデータは初期化されませんでしょうか?
No.5
- 回答日時:
No.3 の補足
「For i = 0 To 1」「For j = 0 To 1」の「1」の意味の説明が無かったですね?
下図のように変更前の「ReDim」の値を入力すれば良いのです。
御存知だとは思いますが「dim t_expenses (1, 1) As String」だと「ReDim」で拡張出来ません。

No.4
- 回答日時:
No.1です。
いえ書き方も理解もキチンと出来てますよ。
ReDim Preserve によって要素数を増やせるのは一番後ろになる(今回は二次)ものですから、増やしたいなら
(0,0)
(1,0)
(0,1)
(1,1)
(0,2)
(1,2)
となるように代入していくと言う事です。(前回省きすぎたかな)
Sub aa()
Dim st() As String
Dim i As Integer
ReDim st(1, 0)
For i = 0 To 5
st(0, i) = CStr(i * 2)
st(1, i) = CStr(i * 5)
ReDim Preserve st(1, 0 To UBound(st, 2) + 1)
Next
For i = 0 To 5
Debug.Print st(0, i) & " : " & st(1, i)
Next
End Sub
0 : 0
2 : 5
4 : 10
6 : 15
8 : 20
10 : 25
書き出す際には、UBound(st,2) を使うと一番後ろは代入してないので、 UBound(st,2) - 1 にした方が良いかもです。
No.3
- 回答日時:
以下みたいな事でしょうか?
Dim t_expenses() As String
Dim a_tmp As Variant
Dim i As Long, j As Long
ReDim t_expenses(1, 1)
t_expenses(0, 0) = "2019"
t_expenses(0, 1) = "01"
t_expenses(1, 0) = "2019"
t_expenses(1, 1) = "02"
a_tmp = t_expenses
ReDim t_expenses(2, 1)
For i = 0 To 1
For j = 0 To 1
t_expenses(i, j) = a_tmp(i, j)
Next
Next
Set a_tmp = Nothing
t_expenses(2, 0) = "2020"
t_expenses(2, 1) = "01"
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
複数の配列の全ての組み合わせ...
-
Excel VBA ユーザーフォームの...
-
重複しない乱数発生
-
隣同士の数字を足し合わせる
-
画面を強制的に再描画させる方法
-
流れ図(フローチャート)が分か...
-
DOSコマンドのループ内のTIMEコ...
-
VBAの変数は何故「i」から始ま...
-
ループ7回目の悪役令嬢は、元敵...
-
範囲指定したセルを1つずつ飛...
-
正しいWebBrowserの使い方(ル...
-
UWSCの終了の仕方
-
Excel VBA For Nextっていらな...
-
WinAPI「MsgWaitForMultipleObj...
-
perlでファイルの拡張子を除い...
-
Escキーを押すと、中断する時と...
-
EXCEL VBA ユーザーフォームの...
-
桁数指定と四捨五入
-
ウィーンブリッジ発進回路
-
ハッシュマーク以降のアドレス取得
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAのautofilter、criteriaの配...
-
エクセルVBAでTransposeの不思議
-
perlで2次元配列をサブルーチ...
-
Strawberry Perl for Windows ...
-
マクロ Publicでの配列定義
-
クラスに配列を渡す方法
-
リストボックスに縦スクロール...
-
二次元配列のインデックスについて
-
Dim flag(4) as boolean で配列...
-
与えられた配列の順にソートす...
-
Excel VBA ユーザーフォームの...
-
VBA 二次元配列の1つ目を増...
-
プログラミング アルゴリズム
-
複数の配列の全ての組み合わせ...
-
二次元配列における要素数のは...
-
VB6で配列の最大値を簡単に求め...
-
バイナリデータの検索(VB.NET2008)
-
VBA 二次元配列 ループの書き方
-
VBA 多次元配列を用いてグルー...
-
VBA 条件
おすすめ情報