アプリ版:「スタンプのみでお礼する」機能のリリースについて

こんにちは、
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

A 回答 (9件)

こんにちは



通常の多次元配列ではなく、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
    • good
    • 0

GooUserラック さんへ



退避されてた部分のコードを見落としてました。
すみません。

回答の方としては私もジャグ配列の方が良いのかな?って思います。
    • good
    • 0

個人的な意見ですが No.3 のようにすれば出来ますが、毎回毎回拡張するのではとても非効率です。

起動時にその日の拡張予定分まで一気に広げておいて作業した方が良いと思いますけど…何か問題があるのでしょうか?
    • good
    • 0

めぐみん_さんへ



その前の「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
-------------------------------------------------------
で退避していたものだけを代入し直しています。
    • good
    • 0

GooUserラック さんへ



>ReDim t_expenses(2, 1)

こちらですと要素数の範囲は広げられますが、既に入っていたはずの要素にあるデータは初期化されませんでしょうか?
    • good
    • 0

No.3 の補足



「For i = 0 To 1」「For j = 0 To 1」の「1」の意味の説明が無かったですね?
下図のように変更前の「ReDim」の値を入力すれば良いのです。
御存知だとは思いますが「dim t_expenses (1, 1) As String」だと「ReDim」で拡張出来ません。
「VBA 二次元配列の1つ目を増やしたい」の回答画像5
    • good
    • 0

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 にした方が良いかもです。
    • good
    • 0

以下みたいな事でしょうか?



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"
    • good
    • 0

二次側が0と1の固定であるなら一次と二次を逆にすれば良いのでは?

    • good
    • 0
この回答へのお礼

ごめんなさい、書き方が悪かったです。
Redim t_expenses (2, 1) と固定してますが実際は
(5, 1)
(6, 1)
(7, 1) と都度加算されていくため
Redim t_expenses (UBound(t_expenses, 1) + 1, 1)
みたいな感じになります。

お礼日時:2020/01/23 15:41

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!