プロが教えるわが家の防犯対策術!

dim tbl(20) as string
として、2桁の数字を保存しています。
(同じ数字は存在しません)
一度フル(21個)に格納したあと、条件を与えて合致する数字を" "で置き換え、消し込んでいきます。
(コレは先ほど教えていただいたので出来ます。)


例えば、
1214152926323338,,,,,, で、「15」を与えた場合、
結果を、
1214 2926323338,,,,,, と。


ここからが質問です。
この配列にあと何個の数字(1個は2桁)が残っているかカウントしたいのです。

例えば、3個消し込みされていれば18となります。
(21-3という計算はやりたくなく、配列の数字部分をカウントしたいのです。)

宜しくお願いします。

A 回答 (2件)

こんにちは。



全体として何をやりたいのか示した方が、
最適な解法を最短手数で獲得できるように思います。
ちょっと想像を働かせて、配列変数の扱い方について
4パターンほど挙げておきます。
それぞれ異なるロケーションで扱うことの比較的多い手法です。
http://oshiete.goo.ne.jp/qa/8773557.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

この回答への補足

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

補足日時:2014/10/01 07:08
    • good
    • 0
この回答へのお礼

早速有り難うございました。

お示しいただいた4個のパタン、
(当然でしょうが)
全て綺麗な結果が出ています。

あとは、これにどのパタンを当てはめるかですが、
問題なくできると思います。

> Application.Substitute() メソッド
> と、受け皿としてのVariant型変数
> Join()関数
> UBound()関数
> Filter()関数
> 動的配列の扱い
>等、自信無さそうな所はお浚いしておいてください。
  ここで知っていたのは、「UBound」位です。

全てのパタンが理解できるよう勉強します。
今回の質問以上のことが学べそうです。
お世話になりました。

お礼日時:2014/10/01 07:04

「前の質問」がわからず、なぜtbl()かが文字列になってるのか疑問ですが。



Joinで文字列で文字列にしている前提で。

Len(またはLenB)で文字数取得しカンマ除いて2で割る?

要素が必ず2桁の数字/空文字なら、JOIN時にセパレータも空文字にしておけば
配素数 = Len( Join( tbl(), ”” ) ) / 2
ですね

この回答への補足

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

補足日時:2014/10/01 07:09
    • good
    • 0
この回答へのお礼

早速有り難うございました。

色々考えさせてしまい申し訳在りませんでしたが、
結果は完璧でした。

お示しいただいた式(コード)で綺麗に獲得できました。
今現在は、とにかくやってみたら出来た、という状況なので
あとで勉強してきます。
お世話になりました。

お礼日時:2014/10/01 06:58

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