『配列のFor Next処理について』(ささみ)
自分の中ではほぼ決まっているのですが、他の人の意見も聞きたくて書き込みました
異なる要素数の配列(中身は文字列)が3つあり、それらを1つにまとめたい
1つにまとめた時の要素数は一番少ない要素数に合わせる
あぶれる分はカンマで繋げる
例
Dim A(1),B(2),C(2)
Dim X(1)
X(0)=A(0) & B(0) & C(0)
X(1)=A(1) & B(1) & C(1) & "," & B(2) & C(2)
設定の説明は上記で伝わるといいのですが
お聞きしたいのは、まとめる時にFor Next処理を使うのですがこの時の終了値は
3つの配列の中で要素数が最小かそれとも最大のものですか?
単純に他の人はどうなのか気になったのと、考え方の参考にしたいのでよろしくお願いします
< 使用 Excel:Microsoft365、使用 OS:Windows11 >
最大かと。
Sub sample() Dim a$(1), b$(2), c$(2) Dim temp$(1), i& For i = 0 To 2 Dim buf$ buf = IIf(i > UBound(a), "", a(i)) & IIf(i > UBound(b), "", b(i)) & IIf(i > UBound(c), "", c(i)) If UBound(temp) <= i Then temp(i) = buf Else temp(UBound(temp)) = temp(UBound(temp)) & "," & buf End If Next End Sub
用途が分からないので、例をコード化しただけですが。 用途内容によっては、違ったアプローチがあるかもしれません。 (tkit) 2025/03/10(月) 16:23:08
Option Explicit Sub a() Dim tsx$, app, a(), b(), c(), x(), i&, j&, l&, s&, AA(1), BB(3), cc(2) Set app = Application AA(0) = "A": AA(1) = "B" BB(0) = "C": BB(1) = "D": BB(2) = "E": BB(3) = "SP" cc(0) = "F": cc(1) = "G": cc(2) = "H" a = AA: b = BB: c = cc l = app.Max(UBound(a), UBound(b), UBound(c)) s = app.Min(UBound(a), UBound(b), UBound(c)) ReDim x(s) ReDim Preserve a(l) ReDim Preserve b(l) ReDim Preserve c(l) For i = 0 To UBound(x) x(i) = a(i) & b(i) & c(i) Next For j = i To l tsx = tsx & "," & a(j) & b(j) & c(j) & "," Next x(UBound(x)) = x(UBound(x)) & tsx MsgBox Join(x, Chr(13)) Erase a, b, c, x, AA, BB, cc End Sub (隠居Z) 2025/03/10(月) 16:27:14
私自身はtkitさんとほぼ同じ考えで、終了値は最大にしてます
可読性を考えてiifではなくselect caseを使っているので少し冗長になっていますが…
隠居Zさんのものは全く思いつかなかったやり方だったので参考になりました!
(ささみ) 2025/03/10(月) 17:28:47
参考までですが、 buf = IIf(i > UBound(a), "", a(i)) & IIf(i > UBound(b), "", b(i)) & IIf(i > UBound(c), "", c(i)) の IIf(i > UBound(a), "", a(i)) のところは、iが2のときにエラーになります。 TRUE,FALSEに拘わらず、引数はすべて一旦評価される仕組みですので注意が必要です。
(xyz) 2025/03/12(水) 09:44:14
全然気付いていませんでしたが言われてみると確かにそこでエラーが起きてしまいますね笑
私自身もたまにやってしまうミスなので気を付けたいと思います
(ささみ) 2025/03/12(水) 10:18:53
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.