• ベストアンサー

for文での配列の指定について(初心者)

質問なのですが、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)と表示したいのです。 すごいわかりにくいと思いますが、どうか教えてください。 おねがいします。

質問者が選んだベストアンサー

  • ベストアンサー
noname#29107
noname#29107
回答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) のように最初の要素の頭にもカンマをついた状態を防いでいます。

gosutero
質問者

お礼

返事が遅れて申し訳ありませんでした。 細かくわかりやすい説明ありがとうございました。 結局それぞれすべて変数に定義してやりました。 50個くらいだったのでまだよかったですが、次からは配列の仕組みについてもっと勉強したいと思います。 答えてくださった方ありがとうございました。

その他の回答 (4)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答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

gosutero
質問者

お礼

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

noname#29107
noname#29107
回答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, "|", "")) のようにすることも出来るでしょう。

gosutero
質問者

お礼

回答ありがとうございます。 あとで隣の家のパソコンからフロッピーにいれて試してみようと思います。 >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でできるのですね。

gosutero
質問者

補足

作動させてみました。 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をカッコの数として指定しなかったからこのようになったのでしょうか?

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答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)のパターンは、市販の解説書などでは見たことがない。)

gosutero
質問者

お礼

回答ありがとうございます。 >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関数を使うと指定文字で区切った文字は表現できるのですね、区切った文字の場所が知りたいと思ったのです(括弧の場所) >こう言うタイプの質問は、いきなり自分のコードを上げるより、文章でしたいことを表現し(多分文章の方が簡単) 申し訳ありません、自分のやっているところを書いたほうが良いと思ったのです。

gosutero
質問者

補足

新しくプログラムを書いたのですが、エラーがでてしまいます。 どこが悪いのでしょうか?どうか教えてください。 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に自分で入力した文字列がはいります。

  • mo_gu
  • ベストアンサー率51% (56/109)
回答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 これでどうでしょうか

gosutero
質問者

お礼

回答ありがとうございます。 kakko=split(nyuuryoku,"|") の"|"は複数あっても対応できるのでしょうか? 最低3つ以上はでてくると思います。 Uboundは配列の指定された次元で使用できる添字の最大値を長整数型の値で返すということですよね。 指定された次元で使用できる添字というのがよくわからないのですが、添字とはkakkoのことなのでしょうか?

gosutero
質問者

補足

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

関連するQ&A

  • 括弧が含まれる文字列の括弧の中身の文字列(VB6)

    括弧()の中身の文字列をそれぞれ配列の文字列変数に設定したいと考えているのですが、Replaceを使えばいいのでしょうか? また、Replaceは置き換える文字の検索の開始場所は設定できると思うのですが、置き換える文字の検索の終了の場所は設定できるのでしょうか? 例えば、(asdf)as(asdfe)as(sf)という文字列のasdf,asdfe,sfをそれぞれ配列を使って文字列変数として表したいのです。 nyuuryoku = Text1.Text For i = 1 To Len(nyuuryoku) If Mid(nyuuryoku, i, 1) = "(" Then k = k + "と" + CStr(i) j = j + 1 ElseIf Mid(nyuuryoku, i, 1) = ")" Then m = m + "と" + CStr(i) l = l + 1 End If Next i Text17.Text = "( は" + CStr(j) + "個" + k + "番目、 " + ") は" + CStr(l) + "個" + m + "番目" For i = 1 To Len(nyuuryoku) If Mid(nyuuryoku, i, 1) = "[" Then kk = kk + "と" + CStr(i) jj = jj + 1 ElseIf Mid(nyuuryoku, i, 1) = "]" Then mm = mm + "と" + CStr(i) ll = ll + 1 End If Next i Text2.Text = "[ は" + CStr(jj) + "個" + kk + "番目、" + "] は" + CStr(ll) + "個" + mm + "番目" Dim kakkohajime(50) As Long Dim kakkoowari(50) As Long Dim kakkonakami(50) As String For i = 1 To CStr(j) kakkohajime(0) = 1 kakkohajime(i) = InStr(kakkohajime(i - 1), nyuuryoku, "(") Next For i = 1 To CStr(j) kakkoowari(0) = 1 kakkoowari(i) = InStr(kakkohajime(CStr(j) + 1 - i), nyuuryoku, ")") Next このあとにkakkohajime(i)の場所からkakkoowari(i)の場所までの文字列をそれぞれkakkonakami(i)の配列の文字列にいれたいのです。 最後に、kakkonakami(i)をtextに表示したいと思っています。

  • 配列のセットの仕方

    度々質問してすいません。 英文の単語を抽出して頻度順に並べるプログラムをVBで作りたいと思っております。下記URLのVB版です。 (http://gamp.c.u-tokyo.ac.jp/archive/perl.htm) 以下が作成したソースです。これとQuickSortのソース(http://www.geocities.co.jp/SilkRoad/4511/vb/sort.htm) を繋げて終わりたいと思うのですが、 どうつなげたらいいのかわかりません。 アドバイスをお願いいたします。 Private Sub Command1_Click() Dim strTarget As String Dim strResult As String Dim cha As String Dim chaList() As String Dim word As String Dim wordList() As Long Dim i As Long, j As Long Dim EndFlg As String strTarget = Me.Text1.Text i = 0 EndFlg = "" Do Until EndFlg = "END" i = i + 1 cha = Mid(strTarget, i, 1) If cha <> "" Then ReDim Preserve chaList(i) chaList(i - 1) = cha Else EndFlg = "END" End If Loop For i = 0 To UBound(chaList) - 1 If chaList(i) = "." Then chaList(i) = " " End If Next Text2 = "" For i = 0 To UBound(chaList) - 1 Text2 = Text2 & chaList(i) Next Text3 = "" word = "" For i = 0 To UBound(chaList) - 1 If chaList(i) = " " Then If i = 0 Then Else If chaList(i - 1) = " " Then Else Text3 = Text3 & Chr(13) & Chr(10) & word word = "" End If End If Else word = word & chaList(i) End If Next If word <> "" Then Text3 = Text3 & Chr(13) & Chr(10) & word End If

  • For文と配列

    下のFor文でセルに0から9999の数字を入力しようとしたのですが 「forで指定された変数は既に使用されています」というエラーがでます。 Dim i As Integer Dim Num(3) As Integer For Num(0) = 0 To 9 For Num(1) = 0 To 9 For Num(2) = 0 To 9 For Num(3) = 0 To 9 Cells(i, 1) = Num(3) + Num(2) * 10 + Num(1) * 100 + Num(0) * 1000 i = i + 1 Next Num(3) Next Num(2) Next Num(1) Next Num(0) 他には何にも書いていないマクロなので他所で使用しているとも思えないですが うまくゆきません。 続きの作業でNum()を配列として作業したいのでこの形を変えたくありません。 何がいけないのでしょう?

  • 二次元配列の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

  • ヤマ括弧でくくられたテキストを抽出(入れ子)

    いつもお世話になっています。VBA学習者です(手短に説明するため文章がぶっきらぼうになることをご容赦ください)。 以下のようなテキストがあったとします。 サンプルテキストA: test <sample_1> test <sample_2> test. このテキストから括弧で括られた部分(ここでは「ユニット」と呼びます)を取り出すのは比較的容易です。 しかし、「サンプルテキストB」のように「ユニット」が入れ子になっている場合にも対応する必要があるため以下のコードを書きました。 これでとりあえず、入れ子の一番外殻のユニットを抽出することができました(「結果A」がシートに書き出されます)。 ここから更に、入れ子になっている内側のユニットも取り出したいのですが、これが意外とうまくいきません。 「結果B」のような結果を得るには、どのようにしたらよいでしょうか。 必ずしも、下に示した処理方法にこだわるものではないので、もっと良いアイデアがあれば大歓迎です! ※ここに示したサンプルは1行のみですが、実際には数千行(ユニットがない行も含む)からなるファイルをいくつも連続して処理するので、出来るだけシンプルに高速で処理できるようにしたいと思っています。 サンプルテキストB: Test <if([control],<if([control],<if([test],a,b)>,c)>,<if([control],d,e)>> test <if([control],<if([control],f,g)>,<if([control],h,i)>><if([control],j,k)>. 結果A: <if([control],<if([control],<if([test],a,b)>,c)>,<if([control],d,e)>> <if([control],<if([control],f,g)>,<if([control],h,i)>> <if([control],j,k)> 結果B: <if([control],<if([control],<if([test],a,b)>,c)>,<if([control],d,e)>> <if([control],<if([control],f,g)>,<if([control],h,i)>> <if([control],j,k)> <if([control],<if([test],a,b)>,c)> <if([test],a,b)> <if([control],d,e)> <if([control],f,g)> <if([control],h,i)> Sub テスト() Dim i As Long Dim j As Long 'テキストファイル内の行を格納する変数 Dim textLine As String 'テキストの文字数を格納 Dim letterCount As Integer 'ヤマ括弧の数を数えるカウンタ用 Dim bracketCounter1 As Integer Dim bracketCounter2 As Integer '括弧の位置を格納する変数 Dim bracketPosition1 As Integer Dim bracketPosition2 As Integer '「<」から「>」までのテキストを格納 Dim textFromToBracket As String '括弧の見つかった位置を格納する配列 Dim unitArray() As String 'bracketArray1()の要素数のカウンタ Dim inArrayCounter As Integer 'textLineにテスト用テキストを格納 textLine = "Test <if([control],<if([control],<if([test],a,b)>,c)>,<if([control],d,e)>> test <if([control],<if([control],f,g)>,<if([control],h,i)>><if([control],j,k)>." letterCount = Len(textLine) '先頭から「< 」と「>」 をカウントし、の数が一致したところが1ユニット For i = 1 To letterCount 'Midで1文字ずつとりだしつつ「<」を検索 If Mid(textLine, i, 1) = "<" Then bracketCounter1 = bracketCounter1 + 1 '1つ目の「<」の位置を格納 If bracketCounter1 = 1 Then bracketPosition1 = i End If End If 'Midで1文字ずつとりだしつつ「>」を検索 If Mid(textLine, i, 1) = ">" Then bracketCounter2 = bracketCounter2 + 1 End If 'ヤマ括弧の数が0以外で、括弧始め/閉じの数が一致したら If bracketCounter1 + bracketCounter2 > 0 And bracketCounter1 = bracketCounter2 Then 'その時点の「>」の位置を格納 bracketPosition2 = i 'bracketPosition1からbracketPosition2までのテキストを切り出し textFromToBracket = Mid(textLine, bracketPosition1, bracketPosition2 - bracketPosition1 + 1) '配列の要素数を1つずつ増やしながらユニットを格納 inArrayCounter = inArrayCounter + 1 ReDim Preserve unitArray(inArrayCounter) unitArray(inArrayCounter) = textFromToBracket 'bracketCounter1とbracketCounter2を初期化 bracketCounter1 = 0 bracketCounter2 = 0 End If Next '以下配列に格納したユニットを書き込み For j = 1 To UBound(unitArray) Cells(j, 1).Value = unitArray(j) Next j End Sub

  • 文字列の括弧について(初心者)2

    文字列の括弧について(初心者) http://oshiete1.goo.ne.jp/kotaeru.php3?q=1110818 の質問の続きなのですが、 文字列の中で( )を1セットで使う方法を教えてもらったので自分の使用するプログラムに少し直したのですが、やはり2つ以上の括弧(カッコ)にも対応しなければならなくなりました。 どのようなプログラムになるのでしょうか? 私はInstrは文字列を左からよんでいって最初にある指定した文字(下記の例だと"("など)の場所を何文字目か示してくれるだけなので1つの括弧にしか対応できないと考えています。 なので文字列の中に指定した文字が何個含まれているか調べて、それぞれ何文字目か示してくれるプログラムが あればできると考えています。 どうか教えてください、おねがいします。 ↓今のプログラム Dim bucketL as Long Dim bucketR as Long Dim a as String Dim b as String a=Text1.text bucketL = InStr(a, "(") bucketR = InStr(a, ")") If bucketL < bucketR And bucketL * bucketR <> 0 Then Text2.text = "OK" End If

  • VBAでのfor文について

    5行のデータがあるとして、先頭の文字がaで始まる行を削除して 上に詰めたいと考えています。 しかし、Range("i:i")のところに可変の数字iをうまく指定できて いないようで、うまく実行されません。 どこがまずいのでしょうか? Sub sample() Dim i As Integer For i = 1 To 5 activeworksheet.Cells(i, 2) = Mid(Cells(i, 1), 1, 1) If Cells(i, 2) = "a" Then ActiveSheet.Range("i:i").Delete shift:=xlshiftUp End If Next End Sub

  • VB6で、指定バイト数を超えた場合はその直前に。

    VB6で、最高文字数を指定するとともに、そのバイト数を超えた場合、超える直前の状態を出力する文字列とする、という処理を考えています。 最大のバイト数を116とすると、全角なら58文字までですが、 57文字まで全角で入力し、次の一文字を半角にする。 そして最後に全角を1文字打つと、116バイトを超えてしまうので、 出力文字は半角のところまでとする。 という形です。 Public Function GetStrForLimitByte(cs As String, size As Long) Dim i As Long Dim p As Long Dim limitStr As String Dim temp As String Dim parts() As String limitStr = "" ' 文字列のバイト数が指定バイト数以下は文字列をそのまま返す If (LenB(cs) <= size) Then cs = cs Else p = Len(cs) For i = 1 To p parts(i) = Mid(cs, i, 1) '1文字ずつ連結 temp = limitStr + parts(i) If (LenB(temp) > size) Then limitStr = limitStr Else limitStr = limitStr + parts(i) End If Next End If End Function すると、parts(i) = Mid(cs, i, 1)のところで「インデックスが有効範囲でありません。」 というメッセが出てしまいます。 なぜでしょうか? ご回答お待ちします、お願いします。

  • vb 配列の再検索について

    こんばんは、 vbで悩んでいます。  配列の検索で、みつかったら、行と位置を出力する でた結果の次の行から 再検索する ということをしたいのですが。 一回目の検索はできるのですが、ボタンをおしたら つづいて 検索できるようにしたいのです。 できたら、アドバイス等おねがいいたいします。 Dim i,r,j As Integer Dim a1() As String Dim a2 As String a2 = Text.Text For j = LBound(a1) To UBound(a1) r = r + 1 i = a1(j).IndexOf(a2, 0) Do Until i <> 0 text1.Text = Val(i + 1)  i = a1(j).IndexOf(a2, i + 1) text2.Text = r  text3.Text = a1(j) If i <> 0 Then Exit For End If Loop Next a1に以下の内容があった時 a1(0) = "例1" a1(1) = "例2" a1(2) = "例3" ”例”と検索をかけると、 text1.Textには 1と出力。(位置表す) text2.Textには 1と出力。(行表す) text3.Textには 例1と出力。 exit for でループをぬけているのですが。 これを、検索ボタンを押すたびに、行と位置 が表示されるようにしたいのですが、 アドバイスおねがいします。

  • VBAのループ

    初めて質問させていただきます。 今VBAでプログラムを組んでいるのですが たとえば dim a as string dim b as string result = mid(text,i,1) text="あいうえお1234あいうえお" Count = len(text) For i = 1 to Count  if mid(text,i,1) like "[0-9]" then a = result else b = result end if next というソースを書くと aやbの変数の中には もちろんのことながら文字と数字が交代で1文字ずつしか格納されてくれません。 result = mid(text,i,1)っていうのが悪いというのはわかるのですがどういじればいいかわからなくて・・ どうしたらaやbの中に続けて格納されてくれるでしょうか。 知恵をお貸しくださいm(_ _)m もしも足りない情報があればいってください。 なにぶんはじめたばかりなのでわからないことだらけでご迷惑をおかけしますがよろしくお願いします。

専門家に質問してみよう