VBAの配列について質問があります。
以下のような配列Aと配列Bがあったとします。
やりたいことは、配列Cを作成して、配列Aと配列Bを結合したいです。
-----------------------------------------
Dim 配列A(3)
配列A(0) = 10
配列A(1) = 11
配列A(2) = 12
Dim 配列B(3)
配列B(0) = 100
配列B(1) = 110
配列B(2) = 120
----------------------------------------
Dim 配列C(6)
配列A(0) = 10
配列A(1) = 11
配列A(2) = 12
配列A(3) = 100
配列A(4) = 110
配列A(5) = 120
----------------------------------------
配列Cを作るために、配列Aを拡張して、配列Bを挿入すれば可能
でありますが、関数のようなもので簡単に表現できないもので
しょうか?
何かご存知でしたが、ご教授願います。
No.3ベストアンサー
- 回答日時:
> 関数のようなもので簡単に表現できないものでしょうか?
PHP なんかだと array_push 関数があるんですけどねー・・
VB6/VBA には同等機能をもった関数はありませんから、
無いものは作るしかないです。
以下のソースを標準モジュールに貼り付けます。全部添え字は
0 から始まる 0 オリジンです。
# もっと短く簡単に書けますけど、なるべく汎用的に
# 使えるようにしてます
' // 各引数の要素を1次元配列化し、引数 args の要素を追加する
'
Public Function Array_Push(ByRef src As Variant, _
ParamArray args() As Variant _
) As Variant
Dim vBuf As Variant
Dim vTmp As Variant
Dim nCnt As Long
Dim arg As Variant
Dim v As Variant
Dim i As Long
vBuf = Array_Convert1DArray(src)
For Each arg In args()
vTmp = Array_Convert1DArray(arg)
nCnt = Array_GetElementCount(vTmp)
i = UBound(vBuf)
ReDim Preserve vBuf(i + nCnt)
i = i + 1
For Each v In vTmp
vBuf(i) = v
i = i + 1
Next
Next
Array_Push = vBuf
End Function
' // 引数 src の値を1次元配列で返す
'
Public Function Array_Convert1DArray(ByRef src As Variant) As Variant
Dim vBuf As Variant
Dim v As Variant
Dim i As Long
If Array_GetDimension(src) = 0 Then
Array_Convert1DArray = Array(src)
Else
ReDim vBuf(Array_GetElementCount(src) - 1)
For Each v In src
vBuf(i) = v
i = i + 1
Next
Array_Convert1DArray = vBuf
End If
End Function
' // 配列の次元数を返す
'
Public Function Array_GetDimension(ByRef src As Variant) As Long
Dim i As Long
Dim j As Long
If IsArray(src) Then
On Error Resume Next
While Err.Number = 0
i = i + 1
j = UBound(src, i)
Wend
On Error GoTo 0
Array_GetDimension = i - 1
Else
Array_GetDimension = 0
End If
End Function
' // 配列の要素数を返す
'
Public Function Array_GetElementCount(ByRef src As Variant) As Long
Dim nDimension As Long
Dim nUpper As Long
Dim nLower As Long
Dim i As Long
Dim j As Long
If IsArray(src) Then
nDimension = Array_GetDimension(src)
Else
nDimension = 1
End If
j = 1
For i = 1 To nDimension
nLower = LBound(src, i)
nUpper = UBound(src, i)
j = j * (nUpper - nLower + 1)
Next i
Array_GetElementCount = j
End Function
一度定義(貼り付け)てしまえば、後はこれを呼び出すだけ。
例えば、こんな感じ。
Sub test()
Dim 配列A(2) ' 通常は 0 オリジンなので添え字は2ですね
配列A(0) = 10
配列A(1) = 11
配列A(2) = 12
Dim 配列B(2)
配列B(0) = 100
配列B(1) = 110
配列B(2) = 120
Dim 配列C
配列C = Array_Push(配列A, 配列B, Array(1, 2, 3), _
"XXX", "YYY", "ZZZ")
' 以下確認用
Dim i As Long
Dim s As String
For i = 0 To UBound(配列C)
s = s & "配列C(" & CStr(i) & ") = " _
& 配列C(i) & vbNewLine
Next
MsgBox s
End Sub
余談になりますが、数値(可変長文字列やオブジェクト以外)
だけを扱うのであれば、CopyMemory API を使った方法もあります。
No.2
- 回答日時:
少し形は変わりますがArray関数を使って、このように結合することが出来ます。
Dim 配列C
配列C = Array(配列A, 配列B)
'結果
配列C(0)(0) '→10
配列C(1)(0) '→100
配列C(1)(2) '→120
No.1
- 回答日時:
スパッとできる良い方法は無いようだ。
VB.NETでは方法があるようだが。
Sub test01()
Dim a(3)
Dim b(4)
a(1) = 10: a(2) = 30: a(3) = 50
b(1) = 10: b(2) = 30: b(3) = 50: b(4) = 40
s1 = Join(a, " ")
s2 = Join(b, " ")
s3 = Trim(s1 & s2)
MsgBox s3
c = Split(s3, " ")
For i = 0 To UBound(c)
MsgBox c(i)
Next
End Sub
しかし上記は、2つの配列をFor Nextで読んで別の新しい配列にデータを順次入れる(再構成する)コード行数と変わらないと思う。
配列にデータが全て埋まってないとさらにややこしくなるようだし。
例 Dim a(10)で上記をやるとおかしくなる。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Vbaで数式をポーランド記法に変換するコードを作って実行しようとするとフリーズします。 1 2022/05/24 17:53
- Microsoft ASP プログラミング関係で質問です。 3 2022/10/11 16:06
- Excel(エクセル) excel vbaの配列なんですが・・・ 1 2022/12/26 18:50
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- Java Java・配列の問題です。 int 「」nums = new int「5」 ⤴︎ この5の事を言葉で 2 2023/06/21 22:30
- Excel(エクセル) ExcelVBAでリストの項目に必要数と同じ手配数を分配していくマクロを作りたいです。 1 2022/07/29 18:36
- 生物学 塩基配列を解析する意味は? 1 2023/02/02 00:51
- Visual Basic(VBA) VBA横データを縦にしたいです 2 2023/08/08 19:38
- Visual Basic(VBA) ExcelVBAで質問です。離れた二次元配列を一つにしたい 4 2022/07/26 19:06
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
応用情報技術者試験の令和元年...
-
EXCEL VBA で、0から?1から?
-
パソコンキーボードで時分秒を...
-
動的配列が存在(要素が有る)か...
-
VBAで配列の計算
-
IF関数でEmpty値を設定する方法。
-
【MFC】GetCount()とGetSize()...
-
VB.net 引数で配列変数を渡す際...
-
変数を動的に作るには?
-
C言語 重複しない4ケタの乱数...
-
10進数を4桁のバイト配列に格納...
-
javaプログラムについて
-
VBで作った乱数を一度も重複さ...
-
ラジオボタンのチェックをEnter...
-
VBでbyte配列型のインスタンス...
-
配列の要素数を超えた参照のコ...
-
[EXCEL VBA] 配列メモリの動的...
-
PowerShell にて、配列の計算を...
-
javaで質問です。 文字列2023/2...
-
[JAVA]try 内の変数を外で!?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
IF関数でEmpty値を設定する方法。
-
パソコンキーボードで時分秒を...
-
VBAで配列の計算
-
EXCEL VBA で、0から?1から?
-
変数を動的に作るには?
-
VB.net 引数で配列変数を渡す際...
-
動的配列が存在(要素が有る)か...
-
VBで作った乱数を一度も重複さ...
-
配列の要素数を超えた参照のコ...
-
複数のテキストボックスに同じ...
-
C言語 重複しない4ケタの乱数...
-
javaプログラムについて
-
C#の質問
-
Visual C++ でコントロールを...
-
排列と配列の漢字の使い分けは
-
Excel VBAで配列の途中から(X)M...
-
遅延バインディングを使用でき...
-
For文と配列
-
VBでbyte配列型のインスタンス...
-
C言語で3次元配列の課題をして...
おすすめ情報