• 締切済み

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

cj_moverの回答

  • 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
質問者

補足

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

関連するQ&A

  • 配列の中の位置を求める。

    dim tbl(20) as string として、2桁の数字を保存しています。 この中に、例えば17が在るかを聞きたいのですが、 方法が分からないため、 dim tblb as string として別のテーブルを取り、 tblb = tblb & "." & youso として21個の数字を格納しています。 そして、 p = instr(tblb,youso) として解決しています。 ここで質問です。 ズバリ、1発で tbl(20)を使って解決する方法はないでしょうか。 宜しくお願いします。

  • 配列の要素数について

    下記の記述の場合、配列の要素数っていくつになりますか? Dim strArray() As String ReDim strArray(0) また下記のように、配列の要素数を具体的に書かずに使った場合不具合はでますか? Dim strArray() As String strArray(0) = "aa" strArray(1) = "bb"

  • VBA 乱数と配列

    VBA 乱数と配列 配列(0)~配列(5)の一次元配列の中に、1から6までの数字を重複しないように入れたいのですが、 上手くいきません。 ご指導の程、お願いします。 Sub rndsys() Dim 配列(5) As Integer Dim サイコロ As Integer Dim カウントA As Integer Dim カウントB As Integer Dim フラグ As Integer For カウントA = 0 To 5 Do サイコロ = Int(Rnd(1) * 6) + 1 For カウントB = 0 To 5 If 配列(カウントB) = サイコロ Then フラグ = フラグ + 1 End If Next カウントB Loop Until フラグ > 0 配列(カウントA) = サイコロ Next カウントA MsgBox 配列(0) & vbCrLf & 配列(1) & vbCrLf & 配列(2) & vbCrLf & 配列(3) & vbCrLf & 配列(4) & vbCrLf & 配列(5) End Sub

  • VB 配列

    今,VBでテキストファイルを読込み配列に入れるという作業を書いたのですが,うまくいきません. 初回例外が発生してしまいます.配列は文字列の配列になります. どなたかご教示のほどよろしくお願いいたします. 'ファイルの読込み Dim path1 As String = "C:\Users\aleph_H.S\Desktop\気象台データインポートツール\気象台データインポートツール\" Dim path2 As String = "気象台データリスト.txt" Dim Mypath As String = path1 + path2 ' StreamReader の新しいインスタンスを生成する Dim cReader As New System.IO.StreamReader(Mypath, System.Text.Encoding.Default) ' 読み込んだ結果をすべて格納するための変数を宣言する Dim stResult As String = String.Empty Dim matrix(,) As String Dim ic As Long = 0 Dim icc As Long = 0 ReDim Preserve matrix(80, 3) ' 読み込みできる文字がなくなるまで繰り返す While (cReader.Peek() >= 0) ' ファイルを 1 行ずつ読み込む Dim stBuffer As String = cReader.ReadLine() ' 読み込んだものを追加で格納する stResult &= stBuffer & System.Environment.NewLine ic = ic + 1 'カンマ区切りで分割して配列に格納する Dim stArrayData As String() = stResult.Split(","c) For Each sstData In stArrayData icc = icc + 1 '文字列をInteger型に変換 matrix(ic - 1, icc - 1) = sstData Next End While cReader.Close()

  • 配列の宣言の仕方

    vs2005を使用しています。 配列の宣言の方法はいくつかあるようですが 違いが分かりません。 Dim strDate() As String = New String(1) {} Dim strDate() As String = New String(1) {"",""} Dim strDate As String() = {"", ""} Dim strDate (1) As String Dim strDate As New ArrayList も候補のひとつですが、この違いは分かります。 やりたいことは、要素数2の配列を""で初期化したいというものです。 そしてその配列を返す関数を作成しています。 どれも同じように思うのですが、違いがあれば教えていただきたいと思います。 よろしくお願いします。 でもかまわないのですが、

  • VB.net 引数で配列変数を渡す際の要素数

    VB.net 2010 の質問です。 配列変数を他のプロシージャに引数で渡す際の、配列変数の要素数をあらかじめ宣言していないとエラーになります。 Dim Hairetsu() As String ' ←エラー Dim Hairetsu(100) As String ' ←正常 Public Sub aaa(ByRef Hairetsu() As String) Hairetsu(0) = "Test" '←正常の場合と、エラーの場合 End Sub Hairetsu(100) のように、要素数を宣言していると、エラーにならないのですが、 プログラム中、要素数がどこまで増加するか、分かりません。 Hairetsu()のように、要素数未確定の配列変数を渡すことは出来ないのでしょうか。 ご存知の方がいらっしゃいましたら、なにとぞアドバイスの程、よろしくお願いいたします。

  • 要素数未定の2次元配列について

    【開発環境】VB6_SP5  OS:WinXP 非常に困っています。どうかご教示お願い致します。 コマンドボタンを押す度に、そのフォームのデータ(Text(n).Text)を 2次元配列に格納したいのですが、コマンドボタンを押す度にReDimを 通過するため、前に格納したデーター「配列名(0,0)等」が消えてしまいます。 Publicで使える様に配列HairetsuA~Cについて、何かよい知恵はありませんか? Option Explicit Public Const YousoMax = 10 Public HairetsuA() As String Public HairetsuB() As String Public HairetsuC() As String Public YousoA as Integer -------------------------------------------------- Private Sub Command1_Click() Dim YousoB As Integer ReDim HairetsuA(YousoA, YousoB) As String ReDim HairetsuB(YousoA, YousoB) As String ReDim HairetsuC(YousoA, YousoB) As String    For YousoB = 0 To YousoMax       If Form1.Text1.Text <> "" Then          ReDim Preserve HairetsuA(YousoA, YousoB) As String          ReDim Preserve HairetsuB(YousoA, YousoB) As String          ReDim Preserve HairetsuC(YousoA, YousoB) As String          HairetsuA(YousoA, YousoB) = Form1.Text1.Text          HairetsuB(YousoA, YousoB) = Form1.Text2.Text          HairetsuC(YousoA, YousoB) = Form1.Text3.Text       Else          Exit For       End If    Next    YousoA = YousoA + 1 End Sub 分かり難い説明ですが、HairetsuAだけを取って言葉で説明しますと コマンドボタンを押す度に HairetsuA(0,0)にはアイウエオ HairetsuA(0,1)にはカキクケコ HairetsuA(0,2)にはサシスセソ    ・    ・    ・ HairetsuA(0,n)にはラリルレロ (コマンドボタンを押す) (HairetsuA(0,0)~HairetsuA(0,n)のデータは維持したままで) HairetsuA(1,0)にはABCDE HairetsuA(1,1)にはFGHIJ HairetsuA(1,2)にはKLMNO    ・    ・    ・ HairetsuA(1,n)にはVWXYZ    ・ (途中幾度かコマンドボタンを押下) (HairetsuA(0,0)~HairetsuA(n-1,n-1)のデータは維持したままで)    ・ HairetsuA(n,n)にはチリヌルオ どうか良いお知恵をください。 どうぞ宜しくお願い致します。

  • Generic.Listに1次元配列の配列を格納したい(VB2005)

    VB2005の質問です。 変数ghogeにString型の1次元配列の配列を格納したいと考えています。 ----------------------------------------------- 'a) Dim hoge()() As string = _       {New string() {"a1", "b1", "c1"}, _       New string() {"a2", "b2", "c2"}, _       New string() {"a3", "b3", "c3"}} Dim ghoge As New Generic.List(of )   'b) MessageBox.Show(ghoge(1)(1))      ' "b2"と表示したい ----------------------------------------------- 質問内容は、(a)を(b)の初期値として設定するにはどのようにすればよいか、ということです。 (b)がGeneric.ListでなくArrayListの場合だと、   Dim ghoge As New ArrayList(hoge) でhoge配列を格納できますが、Generic.Listの場合はどのような構文にすればよいでしょうか。 現在は、下記のような処理でghogeに値を格納しています。 ------------------------------------------------------------ Dim ghoge As New Generic.List(Of Generic.List(Of String)) Dim aryhoge1 As New Generic.List(Of String)(New String() {"a1", "b1", "c1"}) Dim aryhoge2 As New Generic.List(Of String)(New String() {"a2", "b2", "c2"}) gary_hoge.Add(ary_hoge1) gary_hoge.Add(ary_hoge2) MessageBox.Show(gary_hoge(1)(1))    ' "b2"と表示される ------------------------------------------------------------ どうぞよろしくお願い致します。

  • 配列について

    配列の要素数をinteger型にいれたいのですがどうしたらいいですか? 例   Dim A() As String   Dim B AS Integer       A = "あ","い","う" Aの要素数3をBに入れたいのです。 この配列の作りかたもあっているか分かりませんがよろしくお願いします。

  • 二次元配列のVBA

    二次元配列のVBAの書き方がよくわからないのですが、 私が作ったサンプルプログラムのSub 二次元()において 二次元配列で表すにはどうすればいいのでしょうか? Sub 二次元()では 配列を格納する変数はtmpしか使っていませんが もう一つ配列を格納する用の変数を作ればいいのでしょうか? 数字とアルファベットは別々に取り出したいです。 ----------------------------------------------------- Sub 一次元() Dim myStr As String Dim tmp As Variant Dim i As Long For i = 1 To 5 myStr = myStr & "," & i Next myStr = Mid(myStr, 2) tmp = Split(myStr, ",") For i = LBound(tmp) To UBound(tmp) Debug.Print tmp(i) Next i End Sub Sub 二次元() Dim myStr As String Dim tmp As Variant Dim i As Long For i = 1 To 5 myStr = myStr & "," & i & "と" & Chr(64 + i) Next myStr = Mid(myStr, 2) tmp = Split(myStr, ",") For i = LBound(tmp) To UBound(tmp) Debug.Print tmp(i) Next i End Sub