• 締切済み

配列内の数字要素数をカウントしたい。

dim tbl(20) as string として、2桁の数字を保存しています。 (同じ数字は存在しません) 一度フル(21個)に格納したあと、条件を与えて合致する数字を" "で置き換え、消し込んでいきます。 (コレは先ほど教えていただいたので出来ます。) 例えば、 1214152926323338,,,,,, で、「15」を与えた場合、 結果を、 1214 2926323338,,,,,, と。 ここからが質問です。 この配列にあと何個の数字(1個は2桁)が残っているかカウントしたいのです。 例えば、3個消し込みされていれば18となります。 (21-3という計算はやりたくなく、配列の数字部分をカウントしたいのです。) 宜しくお願いします。

みんなの回答

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.2

こんにちは。 全体として何をやりたいのか示した方が、 最適な解法を最短手数で獲得できるように思います。 ちょっと想像を働かせて、配列変数の扱い方について 4パターンほど挙げておきます。 それぞれ異なるロケーションで扱うことの比較的多い手法です。 http://okwave.jp/qa/q8773557.html と、ここと、2つ並べて質問を読む限り、 どれもありそうで、どれでもないのかも、といった感じですが、、、。  Application.Substitute() メソッド  と、受け皿としてのVariant型変数  Join()関数  UBound()関数  Filter()関数  動的配列の扱い 等、自信無さそうな所はお浚いしておいてください。 特に解説はしませんが、そのまま動作を確認し易いように書いてます。 一段だけインデントしてある行が今回の主題に関わる部分です。 (他の行は殆どテスト用のダミーです) ' /// 「必ず2桁」の数字文字列なら、、、 Sub Re8774264_()   Dim vRtn ' ★ 検索した文字列を消去した配列を格納するVariant型変数 Dim arrS(20) As String Dim msg As String Dim i As Long     For i = 0 To 20       arrS(i) = CStr(Int(13 + 5 * Rnd))     Next i     msg = "配列{" & Join(arrS(), ",") & "}" & vbLf     msg = msg & " 要素数: " & UBound(arrS) + 1 & vbLf & vbLf     msg = msg & "消す文字: """ & "15" & """" & vbLf & vbLf   vRtn = Application.Substitute(arrS(), "15", "") ' ★ 検索した文字列を消去した配列をVariant型変数に格納     msg = msg & "配列{" & Join(vRtn, ",") & "}" & vbLf     msg = msg & " 要素数: " & UBound(arrS) + 1 & vbLf & vbLf   msg = msg & "空白を除いた要素の数: " & Len(Join(vRtn, "")) / 2 ' ★ 連結した文字列の長さで数を求める     MsgBox msg End Sub ' /// Sub Re8774264_2() Dim arrS(20) As String Dim msg As String Dim i As Long     For i = 0 To 20       arrS(i) = CStr(Int(13 + 5 * Rnd))     Next i     msg = "配列{" & Join(arrS(), ",") & "}" & vbLf     msg = msg & " 要素数: " & UBound(arrS) + 1 & vbLf & vbLf     msg = msg & "消す文字: """ & "15" & """" & vbLf & vbLf   msg = msg & "残り要素数: " & UBound(Filter(arrS(), "15", False)) + 1 ' ★ 要素ごと消した場合をシュミレートした ★ 数     MsgBox msg End Sub ' /// Sub Re8774264_3()   Dim arrS() As String ' ★ 動的配列 Dim msg As String Dim i As Long   ReDim arrS(20) As String ' ★ 動的配列をリサイズ     For i = 0 To 20       arrS(i) = CStr(Int(13 + 5 * Rnd))     Next i     msg = "配列{" & Join(arrS(), ",") & "}" & vbLf     msg = msg & " 要素数: " & UBound(arrS) + 1 & vbLf & vbLf     msg = msg & "消す文字: """ & "15" & """" & vbLf & vbLf   arrS() = Filter(arrS(), "15", False) ' ★ 要素ごと消した(配列リサイズした)ものを元の変数に格納     msg = msg & "配列{" & Join(arrS(), ",") & "}" & vbLf   msg = msg & " 要素数: " & UBound(arrS()) + 1 ' ★ 数     MsgBox msg End Sub ' /// Sub Re8774264_4() Dim arrS(20) As String   Dim arrD() As String ' ★ 要素ごと消した(リサイズした)配列を格納する動的配列変数 Dim msg As String Dim i As Long     For i = 0 To 20       arrS(i) = CStr(Int(13 + 5 * Rnd))     Next i     msg = "配列{" & Join(arrS(), ",") & "}" & vbLf     msg = msg & " 要素数: " & UBound(arrS) + 1 & vbLf & vbLf     msg = msg & "消す文字: """ & "15" & """" & vbLf & vbLf   arrD() = Filter(arrS(), "15", False) ' ★ 要素ごと消した(配列リサイズした)ものを動的配列変数に格納     msg = msg & "配列{" & Join(arrD, ",") & "}" & vbLf   msg = msg & " 要素数: " & UBound(arrD) + 1 ' ★ 数     MsgBox msg End Sub

nagahaha
質問者

お礼

早速有り難うございました。 お示しいただいた4個のパタン、 (当然でしょうが) 全て綺麗な結果が出ています。 あとは、これにどのパタンを当てはめるかですが、 問題なくできると思います。 > Application.Substitute() メソッド > と、受け皿としてのVariant型変数 > Join()関数 > UBound()関数 > Filter()関数 > 動的配列の扱い >等、自信無さそうな所はお浚いしておいてください。   ここで知っていたのは、「UBound」位です。 全てのパタンが理解できるよう勉強します。 今回の質問以上のことが学べそうです。 お世話になりました。

nagahaha
質問者

補足

お二方にベストを差し上げないといけないのですが、 それがかなわないので、 ベストアンサーは無しとさせてください。 申し訳在りません。 大変お世話になりました。

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

「前の質問」がわからず、なぜtbl()かが文字列になってるのか疑問ですが。 Joinで文字列で文字列にしている前提で。 Len(またはLenB)で文字数取得しカンマ除いて2で割る? 要素が必ず2桁の数字/空文字なら、JOIN時にセパレータも空文字にしておけば 配素数 = Len( Join( tbl(), ”” ) ) / 2 ですね

nagahaha
質問者

お礼

早速有り難うございました。 色々考えさせてしまい申し訳在りませんでしたが、 結果は完璧でした。 お示しいただいた式(コード)で綺麗に獲得できました。 今現在は、とにかくやってみたら出来た、という状況なので あとで勉強してきます。 お世話になりました。

nagahaha
質問者

補足

お二方にベストを差し上げないといけないのですが、 それがかなわないので、 ベストアンサーは無しとさせてください。 申し訳在りません。 大変お世話になりました。