文字列の括弧について(初心者)
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
No.9ベストアンサー
- 回答日時:
折角ですので訂正します。
問題は(や)がある時どのように削除するかですね。
Private Sub Command1_Click()
Dim a As String
Dim i As Integer
Dim j As Integer
Dim k As String
Dim l As Integer
Dim m As String
j = 0
l = 0
a = Text1.Text
For i = 1 To Len(a)
If Mid(a, i, 1) = "(" Then
k = k + "と" + CStr(i)
j = j + 1
ElseIf Mid(a, i, 1) = ")" Then
m = m + "と" + CStr(i)
l = l + 1
End If
Next i
Text2.Text = CStr(j) + "個" + k + "番目"
Text3.Text = CStr(l) + "個" + m + "番目"
End Sub
回答ありがとうございます。
使わせてもらいました、ありがとうございます。
下記が今のプログラムなのですが、kakkohajime(i) = InStr(kakkohajime(i - 1), nyuuryoku, "(")のところでエラーがでてしまいます。
私はなぜエラーになったのかよくわかりません。
どうか原因を教えてください。
おねがいします。
Dim a As String
Dim i As Integer
Dim j As Integer
Dim k As String
Dim l As Integer
Dim m As String
a = nyuuryoku
j = 0
l = 0
nyuuryoku = Text1.Text
k = ""
m = ""
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
Text2.Text = "( は" + CStr(j) + "個" + k + "番目、 " + ") は" + CStr(l) + "個" + m + "番目"
jj = 0
ll = 0
kk = ""
mm = ""
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
Text3.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) = 0
kakkohajime(i) = InStr(kakkohajime(i - 1), nyuuryoku, "(")
Next
For i = 1 To CStr(j)
kakkoowari(0) = 0
kakkoowari(i) = InStr(kakkohajime(CStr(j) + 1 - i), nyuuryoku, ")")
Next
For i = 1 To CStr(j)
kakkonakami(i) = Mid(nyuuryoku, kakkohajime(CStr(j) + 1 - i), kakkoowari(i))
Next
For i = 1 To CStr(j)
Text4.Text = Text4.Text & "、" & kakkonakami(i)
Next
End Sub
No.8
- 回答日時:
>ヘルプはインターネットにつないでいないと見れないんですよね?
>間違ってたらすいません。
MSDNライブラリをインストールしてください。
そうしたら、調べたい単語にカーソルをあわせてF1でページが開きます。
>Instr([検索の開始位置, ]検索対象となる文字列式,検索する文字列式[, 文字比較のモードを指定する番号])
>と本に書いてあったのですが、これで正しいのでしょうか?
はい、あってます。
>検索の開始位置の部分を変数にしてもよろしいのでしょうか?
かまいません。
No.7
- 回答日時:
VBのバージョンは何でしょう?
VB5.0以前だと、Split,Replaceは使えないかも...
VB6.0なら、下記のような感じでどうでしょう?
Dim intKakkoNum1 As Integer
Dim intKakkoNum2 As Integer
Dim strText1 As String
Dim strText2 As String
strText1 = "abc"
intKakkoNum1 = UBound(Split(Text1.Text, "("))
intKakkoNum2 = UBound(Split(Text1.Text, ")"))
If intKakkoNum1 <> intKakkoNum2 Then
Text2.Text = "NG!"
Exit Sub
Else
strText2 = Replace(Text1.Text, "(", "")
strText2 = Replace(strText2, ")", "")
If strText1 <> strText2 Then
Text2.Text ="NG!"
Exit Sub
End If
End If
Text2.Text = "OK!"
#上手く関数化すれば、"[","]"等にも対応可能です。
No.6
- 回答日時:
#2様の方針でペアチェックする関数を作りました
-------------------------------------------
Public Function pairCheck(str As String) As Boolean
Dim i, n
n = 0
For i = 1 To Len(str)
Select Case Mid(str, i, 1)
Case "("
n = n + 1
Case ")"
n = n - 1
If n < 0 Then
pairCheck = False
Exit Function
End If
End Select
Next
pairCheck = (n = 0)
End Function
---------------------------------
[]も同様にできますし、同時にやってもいいですね。
使い方
If pairCheck("(a)bc)((((def)))") then
MsgBox "ペアになってますよん"
Else
MsgBox "ペアになってませんよん"
End If
No.5
- 回答日時:
>文字列の中に指定した文字が何個含まれているか調べて、それぞれ何文字目か示してくれるプログラム
'検査する文字が含まれる文字位置を配列で返す
Public Function charPos(str As String, c As String)
Dim a()
Dim count, i
ReDim a(Len(str))
count = 0
For i = 1 To Len(str)
If c = Mid(str, i, 1) Then
a(count) = i
count = count + 1
End If
Next
ReDim Preserve a(count)
charPos = a
End Function
--------------------------------------
使い方
dim posL,posR,i
posL =charPos("A(BC(DEF(G)))","(")
posR =charPos("A(BC(DEF(G)))",")")
for i=0 to UBOUND(posL) 'UBOUNDで個数がわかる
debug.print posL(i)
next
結果
2
5
9
----------------------------
こういうのより、もともとの目的からすると
#2の方の方法がいいと思います
No.4
- 回答日時:
Private Sub Command1_Click()
Dim a As String
Dim i As Integer
Dim j As Integer
Dim k As String
j = 0
a = Text1.Text
For i = 1 To Len(a)
If Mid(a, i, 1) = ")" Then
Exit For
End If
If Mid(a, i, 1) = "(" Then
k = k + "と" + CStr(i)
j = j + 1
End If
Next i
Text2.Text = CStr(j) + "個" + k + "番目"
End Sub
左かっこだけですが右かっこも同様ですので
if文の"("と")"を入れ替えればOKです。
回答ありがとうございます。
CStrは文字列のデータ型変換関数でいいのでしょうか?
http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd …
はじめて見ました。
このプログラムは括弧のなかに括弧があるときは大丈夫ですが括弧が別々に存在した場合はどうなのでしょうか?
動かしてみたのですが、abc(ads(fs)dfs)asaなどのときは大丈夫なのですが、aafs(eys)eear(hr)sdfのときはうまくいきませんでした。
私のやり方が悪いのかもしれませんがどうか教えてください。
No.3
- 回答日時:
>私はInstrは文字列を左からよんでいって最初にある指定した文字(下記の例だと"("など)の場所を何文字目か示してくれるだけなので1つの括弧にしか対応できないと考えています。
開始位置指定できますけど。
省略しちゃってるから先頭から調べてるだけです。
ヘルプを見てください。
アドバイスありがとうございます。
毎回、省略して最初から調べていました。
ヘルプはインターネットにつないでいないと見れないんですよね?
間違ってたらすいません。
VBを使っているのはインターネットがつなげないほうのパソコンなので見れないのです。
このページはlynaxのパソコンから見ています。
instrの使い方は
Instr([検索の開始位置, ]検索対象となる文字列式,検索する文字列式[, 文字比較のモードを指定する番号])
と本に書いてあったのですが、これで正しいのでしょうか?
検索の開始位置の部分を変数にしてもよろしいのでしょうか?
どうか教えてください、おねがいします。
No.2
- 回答日時:
普通に文字列を一文字ずつ読んでいって「(」があったら「開いている括弧の数」を増やして「)」があったら「開いている括弧の数」を減らしてやってそれが「-1になっていないか」と、文字列の最後まで行ったときに「0になっているか」を検査すればよいのでは?
VBの細かい関数思い出せないのでもっと簡単にできるかも知れませんが(汗)
アドバイスありがとうございます。
laputartさんのプログラムのct1とct2を使って、
If ct1 = ct2 Then
Else
Msgbox "だめ"
というプログラムを入れてみようと思っているのですがどうでしょうか?
No.1
- 回答日時:
Dim N as integer
Dim a(9),b(9) as integer
Dim ct1, ct2 as integer
Dim Z as string
'text1をZに置く
Z=Text1.text
' Ln=文字列Zの長さ
Ln=Len(Z)
ct1=0:Ct2=0
'ct1とct2はそれぞれ (と)の数
for I=1 to Ln
If Mid(Z,i,1)="(" then
Ct1=ct1+1
a(Ct1)=I
Elseif Mid(Z,i,1)=")" then
Ct2=ct2+1
b(Ct2)=I
End If
next I
Msgbox("(の数は" & ct1 & "個です。")
Msgbox(")の数は" & ct2 & "個です。")
End Sub
a(1) a(2) には(の文字列番号が入ります。
b(1) b(2) には)の文字列番号が入ります。まだエラーとラップとかはしていません。
原始的ですがこういった方法は如何でしょうか。
回答ありがとうございます。
bucketL = InStr(a, "(")
bucketR = InStr(a, ")")
If bucketL < bucketR And bucketL * bucketR <> 0 Then
と、このプログラムを組み合わせればできそうです。
しかし、私はfor文の使い方がよくわかっていないのでうまくいきません。
nextに対応するforがありませんと出てしまいます。
↓プログラムの1部分
For i = 1 To Ct1
ここにいろいろプログラムをいれます。
next i
Msgbox"OK"
上の例だとエラーがでます、原因はなんでしょうか?
どうか教えてください、おねがいします。
このページのforの説明を見ながらやっているのですが、原因がよくわかりません。
http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) サブフォルダ(データ)にある複数の.xlsxファイルのSheet3のA2セルの値で01から左側をB2 2 2022/08/14 15:46
- Visual Basic(VBA) 以下のVBAで該当文字列の前後に付与したい。 例 前に付与 abc ユーザーID 12345 後に付 3 2022/04/19 21:50
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/15 15:12
- Visual Basic(VBA) VBAにてメール作成した際、一部指定箇所のみ赤文字にしたいです。 下記の内容ですと作成されたメール本 1 2022/04/27 13:31
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) 【再々投稿】VBAのプログラムで動作しなくて困っています 8 2022/10/14 09:06
- Visual Basic(VBA) Vbaで数式をポーランド記法に変換するコードを作って実行しようとするとフリーズします。 1 2022/05/24 17:53
- Visual Basic(VBA) VBAで質問ですが、皆さんはどの様に導き出しているのでしょうか? 6 2022/05/03 21:53
- Excel(エクセル) エクセルVBA Msgboxでの変数の活用 4 2023/07/23 08:33
- Visual Basic(VBA) 数字が「0」の列を削除するため、下記のコードを実行しましたが、コンパイルエラーSubまたはFunct 3 2022/12/04 00:00
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
EXCELで=より左の文字を一括で...
-
エクセルでアルファベットか数...
-
VBAでの Replace関数で、ワイル...
-
Excelで指数表現しないようにす...
-
Excelで3E8を3.00E+8にしない方...
-
文字列からタブコードを取り除...
-
エクセルで文字列をtxtファイル...
-
エクセルで文字列の最大値を抽...
-
VBの「As String * 128」とは?
-
エクセル 数値データを桁をそ...
-
Left関数とRight関数を合わせた...
-
textboxユーザーコントロールの...
-
ORCLEでの小数の表示方法の変更...
-
同一セル内に関数と文字列を同...
-
アクセスで特定の数字以外(複...
-
16進数を10進数に簡単に変換す...
-
Msgboxの×が押されたとき
-
VBA2005 16進を2桁で表示したい。
-
【Excel VBA】複数ある特定の文...
-
NULLの定義について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルでアルファベットか数...
-
EXCELで=より左の文字を一括で...
-
VBAでの Replace関数で、ワイル...
-
文字列からタブコードを取り除...
-
Excelで3E8を3.00E+8にしない方...
-
Excelで指数表現しないようにす...
-
エクセルで文字列の最大値を抽...
-
エクセル 数値データを桁をそ...
-
エクセルで文字列をtxtファイル...
-
同一セル内に関数と文字列を同...
-
VBA2005 16進を2桁で表示したい。
-
VBの「As String * 128」とは?
-
sedなどで、特定の文字列の後の...
-
MS SQLServer のSQLで文字列の...
-
Left関数とRight関数を合わせた...
-
Msgboxの×が押されたとき
-
アクセスで特定の数字以外(複...
-
【Excel VBA】複数ある特定の文...
-
エクセルでセル内の文字列の最...
-
C#で年月を比較する
おすすめ情報