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

質問なのですが、for文を使っているときの配列の指定はできるのでしょうか?

下記は今のプログラムの1部です。

Dim nyuuryoku as string
Dim e as integer
Dim kakkonakami() as string
Dim kakko() as long

Text1.text = nyuuryoku

Text24.Text = ""
For e = 1 To kakko(e)
If Mid(nyuuryoku, kakko(e) + 2, 1) = Mid(kakkonakami(i), 1, 1) Then
Text24.Text = 'ここに指定した配列をいれたい'
End if
next e

nyuuryokuはテキスト1に自分で入力した括弧"("")"を含んだ文字列だとします。
kakkonakami(i)はそれぞれの括弧の中身の文字列です。
kakko(e)は文字"|"がある場所(変数)です。
そして"|"のある場所に+2した場所がkakkonakami(i)の1文字目だった場合、
そのときのkakkonakami(i)のiの数に対応したkakkonakami(?)の配列変数をテキスト24に表示したいのです。


nyuuryoku = "a(da)|(we)wreasd(ad)|(asd)as(as)as"
とすると
For e = 1 To kakko(e)がFor e = 1 To 2
になります。
そのときの
If Mid(nyuuryoku, kakko(e) + 2, 1) = Mid(kakkonakami(i), 1, 1) Then

Mid(nyuuryoku, kakko(1) + 2, 1) = w
Mid(nyuuryoku, kakko(2) + 2, 1) = a
Mid(kakkonakami(2), 1, 1) = w
Mid(kakkonakami(4), 1, 1) = a
となります。
このとき、Text24にkakkonakami(2),kakkonakami(4)と表示したいのです。
すごいわかりにくいと思いますが、どうか教えてください。
おねがいします。

A 回答 (5件)

#3です。

仕様がよく理解できないです。

#3のプログラムでは、kakko(1)にはnyuuryokuに設定された文字列で1個目の"|"が存在する文字位置であるようにしています。kakko(2)は2個目の"|"が存在する文字位置というふうに続きます。

nyuuryoku="a(f)sdfsd(sdf)|(tyu)a"なら
kakko(1)=15 すなわち15字目が"|"で、"|"は1回しかnyuuryokuにはありませんから、kakko(2)以降は存在しません。
ここで"|"の2文字後ろは、"t"です。"t"は3番目の括弧の中にしか存在しませんので、Text24にkakkonakami(3)と表示する。・・・・・とこのように理解していたのですが、
>本当はkakkonakami(2),kakkonakami(3)と表示したいのです。
kakkonakami(2)の1文字目は"s"なのですが、なぜこれを表示するのでしょうか?
また、わたしの環境ではkakkonakami(3)のみ表示になるのですが、質問者さんでは違う結果であるとすれば、実際に動作させたソースを貼り付けてもらえますか。また当初のデータnyuuryoku = "a(da)|(we)wreasd(ad)|(asd)as(as)as"では、正しい結果が得られていますか?
ロジックの検証はVBAで行っていますが、そのことで違う結果になるような状況ではないように思います。

2番目の例の、nyuuryoku="asd(uhf)|(asda)sdfs(dsf)|(asdas)"ですが、この場合"|"の2文字後ろは両方とも"a"ですのでkakkonakami(2),kakkonakami(4)が得られれば良いように思えますが、
>kakkonakami(1),kakkonakami(2),kakkonakami(3),kakkonakami(4)と表示したいのです。
とのことですので、ちょっとよく分かりません。
また、こちらでは答えは、kakkonakami(2),kakkonakami(4),kakkonakami(2),kakkonakami(4)になっています。"|"の後ろが同じだった場合の考慮をしていなかったため、だぶって表示されていますが、読み取った仕様とおりの結果になっています。


あと頂いた質問の件ですが、
>nyuuryoku = "a(da)|(we)wreasd(ad)|(asd)as(as)as"
>は必ずいれなくてはいけないのですか?
これは、単にテストの都合上初期値をセットしているだけですから、ファイルから読み込むなり、入力させるなり、ご自由にどうぞ。

>k = InStr(k + 1, nyuuryoku, "|")'kに1ずつ加えて開始位置をずらして調べる
Instr関数は、検索する文字列が何文字目にあるかを返すもので、開始時kは0ですから、1文字めから検索し、2回目以降は"|"の次の文字から検索するように設定しています。

>ReDim Preserve kakko(j) 'よくわからない'
Dim kakko() as Longと配列の個数が設定されずに定義されていましたので、動的に確保しています。ReDimのヘルプ見てもらった方がいいでしょう。

>If Len(Text24.Text) > 0 Then
>'これはtext1.textの間違いじゃないでしょうか?text24にはなにもはいっていません'
間違いではなく意図的です。こうすることで
,kakkonakami(2),kakkonakami(4) のように最初の要素の頭にもカンマをついた状態を防いでいます。
    • good
    • 0
この回答へのお礼

返事が遅れて申し訳ありませんでした。
細かくわかりやすい説明ありがとうございました。

結局それぞれすべて変数に定義してやりました。
50個くらいだったのでまだよかったですが、次からは配列の仕組みについてもっと勉強したいと思います。

答えてくださった方ありがとうございました。

お礼日時:2004/12/24 15:56

#2です。


短くなるよう、splitに拘って見ました。
( )の中の文字列を見つけてu(k)に入れます。
参考になれば。Msgboxは確認用で、外してください。
Sub test01()
Dim u(100)
a = "a(da)|(we)wreasd(ad)|(asd)as(as)as"
s = Split(a, "|")
k = 1
For i = 0 To UBound(s)
'MsgBox s(i)
t = Split(s(i), "(")
For j = 0 To UBound(t)
'MsgBox t(j)
p = InStr(t(j), ")")
If p = 0 Then
Else
u(k) = Mid(t(j), 1, p - 1)
MsgBox u(k)
k = k + 1
End If
Next j
Next i
End Sub
    • good
    • 0
この回答へのお礼

回答ありがとうございます!
今からやってみます。

お礼日時:2004/12/21 11:31

こういう感じのことなのでしょうか?



Option Base 1
'配列の添字を1から始める
Sub test()
Dim nyuuryoku As String
Dim e As Integer
Dim kakkonakami() As String
Dim kakko() As Long, j As Integer, k As Integer

nyuuryoku = "a(da)|(we)wreasd(ad)|(asd)as(as)as"
'↑入力データのセット
Text1.Text = nyuuryoku
Text24.Text = ""

'kakko()データのセット
j = 1
k = 0
Do
  k = InStr(k + 1, nyuuryoku, "|")
  If k = 0 Then
    Exit Do
  Else
    ReDim Preserve kakko(j)
    kakko(j) = k
    j = j + 1
  End If
Loop

'kakkonakami()データのセット、ただしかなり手抜き、実際のロジックではかっこの対応チェックが必要かも
j = 1
k = 0
Do
  k = InStr(k + 1, nyuuryoku, "(")
  If k = 0 Then
    Exit Do
  Else
    ReDim Preserve kakkonakami(j)
    kakkonakami(j) = Mid(nyuuryoku, k + 1, InStr(k + 1, nyuuryoku, ")") - k - 1)
    j = j + 1
  End If
Loop

For e = 1 To UBound(kakko)
  For i = 1 To UBound(kakkonakami)
'とりあえずkakkonakami(i)のiがどんな値取ることを前提にしているのか、分からないのでとりあえず全件と比較
    If Mid(nyuuryoku, kakko(e) + 2, 1) = Mid(kakkonakami(i), 1, 1) Then
      If Len(Text24.Text) > 0 Then
        Text24.Text = Text24.Text & "," & "kakkonakami(" & i & ")"
      Else
        Text24.Text = "kakkonakami(" & i & ")"
      End If
    End If
  Next i
Next e
End Sub

>For e = 1 To kakko(e)がFor e = 1 To 2
ここは他の回答にもあるように、こういう指定は無理です。kakko()の要素数がいるのなら
For e = 1 To UBound(kakko)
のような方法以外に
For e = 1 To Len(nyuuryoku) - Len(Replace(nyuuryoku, "|", ""))
のようにすることも出来るでしょう。

この回答への補足

作動させてみました。
nyuuryoku = "a(da)|(we)wreasd(ad)|(asd)as(as)as"
'↑入力データのセット
は必ずいれなくてはいけないのですか?
テキスト1の値は毎回変わるのでいれないでやっているのですが、
Text1.Text = nyuuryoku 'text1はnyuuryokuの値'
Text24.Text = "" 'text24はなにもはいっていない'

'kakko()データのセット
j = 1 'jは1'
k = 0 'kは0'
Do
  k = InStr(k + 1, nyuuryoku, "|")'kに1ずつ加えて開始位置をずらして調べる'
  If k = 0 Then
    Exit Do 'kが0ならループ終了'
  Else '0以外なら'
    ReDim Preserve kakko(j) 'よくわからない'
    kakko(j) = k 'kakko(j)とkは同じ'
    j = j + 1
  End If
Loop

'kakkonakami()データのセット、ただしかなり手抜き、実際のロジックではかっこの対応チェックが必要かも
「対応チェックはしてありますので大丈夫です^^」
j = 1
k = 0
Do
  k = InStr(k + 1, nyuuryoku, "(") '開始位置を1つずつずらして(の数を調べる'
  If k = 0 Then 'kが0なら終了'
    Exit Do
  Else
    ReDim Preserve kakkonakami(j)'よくわからない'
    kakkonakami(j) = Mid(nyuuryoku, k + 1, InStr(k + 1, nyuuryoku, ")") - k - 1)
')の数を調べる?'
    j = j + 1
  End If
Loop 'ループ終了'

For e = 1 To Len(nyuuryoku) - Len(Replace(nyuuryoku, "|", ""))
'1から|を取り除いたnyuuryokuの文字数までeに加えていく'
  For i = 1 To UBound(kakkonakami)'1から添字の最大値まで?'
'とりあえずkakkonakami(i)のiがどんな値取ることを前提にしているのか、分からないのでとりあえず全件と比較
「kakkonakami(i)のiはnyuuryokuに含まれるカッコの数です」
    If Mid(nyuuryoku, kakko(e) + 2, 1) = Mid(kakkonakami(i), 1, 1) Then
')の位置に+2した場所がkakkonakami(i)(カッコの中身の1文字目だったとき)'
      If Len(Text24.Text) > 0 Then
'これはtext1.textの間違いじゃないでしょうか?text24にはなにもはいっていません'
        Text24.Text = Text24.Text & "," & "kakkonakami(" & i & ")"
'text24にそれぞれkakkonakami(i)を表示していく'
      Else
        Text24.Text = "kakkonakami(" & i & ")"
      End If
    End If
  Next i
Next e
End Sub

1部わからないのですがこのような説明であっているのでしょうか?
先ほどnyuuryoku="a(f)sdfsd(sdf)|(tyu)a"
でやってみたのですが、
text24.text = "kakkonakami(1),kakkonakami(2),kakkonakami(3)"
と表示されてしまいました。
本当はkakkonakami(2),kakkonakami(3)と表示したいのです。
次にnyuuryoku="asd(uhf)|(asda)sdfs(dsf)|(asdas)"
でやってみたところ
text24.text =
"kakkonakami(1),kakkonakami(2),kakkonakami(4),kakkonakami(1),kakkonakami(2),kakkonakami(4)"
と表示されてしまいました。
本当はkakkonakami(1),kakkonakami(2),kakkonakami(3),kakkonakami(4)
と表示したいのです。
やっぱりiをカッコの数として指定しなかったからこのようになったのでしょうか?

補足日時:2004/12/21 10:53
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
あとで隣の家のパソコンからフロッピーにいれて試してみようと思います。

>For e = 1 To kakko(e)がFor e = 1 To 2
ここは他の回答にもあるように、こういう指定は無理です。kakko()の要素数がいるのなら
For e = 1 To UBound(kakko)
のような方法以外に
For e = 1 To Len(nyuuryoku) - Len(Replace(nyuuryoku, "|", ""))
のようにすることも出来るでしょう。

kakko(e)は中身が決まってないから無理なのですね。
UboundのかわりにReplaceでできるのですね。

お礼日時:2004/12/21 02:23

#1のご回答にもでたが、Split関数を使うと、「|」で、文字列を分けられます


Sub test01()
nyuuryoku = "a(da)|(we)wreasd(ad)|(asd)as(as)as"
s = Split(nyuuryoku, "|")
For i = 0 To UBound(s) '0から始めること
MsgBox s(i)
Next i
End Sub
を実行すると、a(da)、(we)wreasd(ad)、(asd)as(as)as
が表示される。
これでFor e = 1 To kakko(e)を回避(使わなくて済む)出来たとおもう。
●この後に、分離したそれぞれの文字列に対し何をしたいのでしょうか?
可変位置の文字列やその文字列中での組み合わせを扱うのは難しいことは経験ずみですが、後がよく理解できなかった。
>指定した配列をいれたい
テキストボックスのテキストに配列は入れられないでしょう。文字列でしょう。
>kakko(e)は文字"|"がある場所(変数)です
これはどのようにして求めましたか。結構面倒と思いますが。Instr関数を利用ですか。Split関数を使うと、この考えは不要になるのでは?
こう言うタイプの質問は、いきなり自分のコードを上げるより、文章でしたいことを表現し(多分文章の方が簡単)
回答の中の優れたコーディング法を学ぶ方が良いと思う。
(For e = 1 To kakko(e)のパターンは、市販の解説書などでは見たことがない。)

この回答への補足

新しくプログラムを書いたのですが、エラーがでてしまいます。
どこが悪いのでしょうか?どうか教えてください。
iとjがintegerだからだめなのでしょうか?

Dim nyuuryoku as string
Dim j as integer
Dim i as integer
Dim kakkohajime() as long

Text1.text = nyuuryoku
i=0
j=0

For j = 1 to 4
For i = 1 to Len(nyuuryoku)
If Mid(nyuuryoku,i,1)="(" Then
kakkohajime(j) = i 'この場所がエラー インデックスが有効範囲内にありません'
Text2.text = Text2.text & kakkohajime(j)
End if
Next i
Next j

nyuuryokuはテキスト1に自分で入力した文字列がはいります。

補足日時:2004/12/21 09:17
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
>For i = 0 To UBound(s) '0から始めること
1ではなく0からはじめるのですね、わかりました。

>●この後に、分離したそれぞれの文字列に対し何をしたいのでしょうか?

この後に"|"の横についている括弧の中の文字列をテキストなどで表示したいのです。
a(da)|(we)wreasd(ad)|(asd)as(as)as この場合だと
da we ad asdを表示したいです。
ここには書いていないのですが、この前のプログラムでkakkonakami()にそれぞれの括弧の中身の文字列をいれているので、
テキストに
kakkonakami(1),kakkonakami(2),kakkonakami(3),kakkonakami(4)
と表示する形でもよいと思っています。

>指定した配列をいれたい
申し訳ありません。上にもあるとおり、配列文字列です。

>kakko(e)は文字"|"がある場所(変数)です
これはどのようにして求めましたか。
これは
Mid(nyuuryoku,i,1)="|"
を使って求めました。
split関数を使うと指定文字で区切った文字は表現できるのですね、区切った文字の場所が知りたいと思ったのです(括弧の場所)

>こう言うタイプの質問は、いきなり自分のコードを上げるより、文章でしたいことを表現し(多分文章の方が簡単)
申し訳ありません、自分のやっているところを書いたほうが良いと思ったのです。

お礼日時:2004/12/21 01:19

んーと


ちゃんとした回答になってないけど

>For e = 1 To kakko(e)
これは
最初Forに来たときにeが0ですのでForの中に入りません。

For e = 1 To kakko(e)
これはFor e = 1 To kakko(e)
kakko(e)はkakko(0)の文字列 ということになります。

kakkoにデータを入れてるところがないので

kakko=split(nyuuryoku,"|")

For e=1 to ubound(kakko)
If Mid(nyuuryoku, kakko(e) + 2, 1) = Mid(kakkonakami(i), 1, 1) Then
Text24.Text = 'ここに指定した配列をいれたい'
End if
next

これでどうでしょうか

この回答への補足

splitは何個でも対応できるみたいですね。
ありがとうございます。

補足日時:2004/12/21 01:00
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
kakko=split(nyuuryoku,"|")
の"|"は複数あっても対応できるのでしょうか?
最低3つ以上はでてくると思います。

Uboundは配列の指定された次元で使用できる添字の最大値を長整数型の値で返すということですよね。
指定された次元で使用できる添字というのがよくわからないのですが、添字とはkakkoのことなのでしょうか?

お礼日時:2004/12/21 00:59

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