質問なのですが、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)と表示したいのです。
すごいわかりにくいと思いますが、どうか教えてください。
おねがいします。
No.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) のように最初の要素の頭にもカンマをついた状態を防いでいます。
返事が遅れて申し訳ありませんでした。
細かくわかりやすい説明ありがとうございました。
結局それぞれすべて変数に定義してやりました。
50個くらいだったのでまだよかったですが、次からは配列の仕組みについてもっと勉強したいと思います。
答えてくださった方ありがとうございました。
No.4
- 回答日時:
#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
No.3
- 回答日時:
こういう感じのことなのでしょうか?
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をカッコの数として指定しなかったからこのようになったのでしょうか?
回答ありがとうございます。
あとで隣の家のパソコンからフロッピーにいれて試してみようと思います。
>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でできるのですね。
No.2
- 回答日時:
#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に自分で入力した文字列がはいります。
回答ありがとうございます。
>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関数を使うと指定文字で区切った文字は表現できるのですね、区切った文字の場所が知りたいと思ったのです(括弧の場所)
>こう言うタイプの質問は、いきなり自分のコードを上げるより、文章でしたいことを表現し(多分文章の方が簡単)
申し訳ありません、自分のやっているところを書いたほうが良いと思ったのです。
No.1
- 回答日時:
んーと
ちゃんとした回答になってないけど
>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
これでどうでしょうか
回答ありがとうございます。
kakko=split(nyuuryoku,"|")
の"|"は複数あっても対応できるのでしょうか?
最低3つ以上はでてくると思います。
Uboundは配列の指定された次元で使用できる添字の最大値を長整数型の値で返すということですよね。
指定された次元で使用できる添字というのがよくわからないのですが、添字とはkakkoのことなのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) 数字が「0」の列を削除するため、下記のコードを実行しましたが、コンパイルエラーSubまたはFunct 3 2022/12/04 00:00
- Visual Basic(VBA) Vbaで数式をポーランド記法に変換するコードを作って実行しようとするとフリーズします。 1 2022/05/24 17:53
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Excel(エクセル) エクセルVBAでオブジェクトが必要です 2 2022/09/10 16:37
- Visual Basic(VBA) 以下のVBAで該当文字列の前後に付与したい。 例 前に付与 abc ユーザーID 12345 後に付 3 2022/04/19 21:50
- Visual Basic(VBA) 稀に1円合いません? Sheet1から金額と個数を貼り付ける下記コードで、金額を切り上げるコードを何 3 2022/09/05 15:11
- Excel(エクセル) VBAで組み合わせ算出やCOUNTIFSの処理を高速化したいです。 4 2022/04/07 02:38
- Visual Basic(VBA) 【VBA】特定のワードが入っている行全体を塗りつぶしたい 4 2022/04/20 15:22
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
nullと""、\\0とEOFの違いにつ...
-
16進数を2文字ずつ配列に格納し...
-
C#でstringをポインタとして渡す
-
[C++]WCHARの1文字目しか表示で...
-
c#で他のアプリの文字入力フォ...
-
引用符と二重引用符
-
プログラムによく出てくるst...
-
WSH(VBS)でJSONの文字列を読み...
-
C++で入力した文字列から数字を...
-
[C#.net]正規表現による指定文...
-
Excelシートを固定長のテキスト...
-
_tcscpy_s(wcscpy_s)の第二引数...
-
%dなどの違い
-
Shift_JIS(16進)を文字に変換す...
-
セグメントエラー
-
関数から配列を返すには?
-
VBAのプログラムで、DIAG = 1# ...
-
Integer変数をカラにしたいので...
-
init関数の意味
-
C言語にて構造体のメンバがNULL...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C++で入力した文字列から数字を...
-
nullと""、\\0とEOFの違いにつ...
-
プログラムによく出てくるst...
-
%dなどの違い
-
WSH(VBS)でJSONの文字列を読み...
-
TCL言語で文字列検索方法を教え...
-
C#でstringをポインタとして渡す
-
16進数を2文字ずつ配列に格納し...
-
_tcscpy_s(wcscpy_s)の第二引数...
-
C++で文字列の右端から特定の文...
-
シリアル通信で0x00を送信した...
-
VBA-DLLの引数受け渡しについて
-
数字の入った配列をファイルへ...
-
c#で他のアプリの文字入力フォ...
-
構造体→文字列→構造体 をする方法
-
Shift_JIS(16進)を文字に変換す...
-
バイナリファイル中の日本語文...
-
C言語の課題で困っています;
-
[C++]WCHARの1文字目しか表示で...
-
VB6.0でのバイナリデータの扱い...
おすすめ情報