• ベストアンサー

forループでの文字の削除

Text1の中の文字列からコントロール信号を叙情するためforループで1文字ずつみて該当すれば削除するようにしました。ところが、文字列が短くなってしまうのにNは先に進むので、削除した文字の次の1文字がチェックできません。 For N = 1 To Len(Text1) 'コントロール信号の削除 If Mid(Text1, N, 1) < " " Then Text1 = Left(Text1, N - 1) + Mid(Text1, N + 1) Next N 試み・・・if文の最後にN=N-1を付けたらループしてしまいダメでした。

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

  • ベストアンサー
回答No.1

'発想の転換 Option Explicit Function Test1(str As String) Dim buff As String Dim start As Integer Dim i As Integer buff = "" For i = 0 To Len(str) - 1 If Mid$(str, i + 1, 1) <> "a" Then buff = buff & Mid$(str, i + 1, 1) End If Next i Test1 = buff End Function Sub Main() Dim testString As String testString = "abcdaefgah" MsgBox (Test1(testString)) End Sub 'これじゃだめですか?(削除する文字をaにしていますし,おそらくテキストボックスであるものを文字列にしています) 余談: 1.デフォルトプロパティは使わない方がよい(後にオブジェクトについて学ぶと解るかも) Text1.Text 2.変数宣言を強制するために一番最初にOption Explicit と書いておこう 3.文字列の連結に+演算子を使うのをやめよう(少なくともVB6の間は) Evil Type CoercionのNew Mathに書かれているコードの結果が説明できるまでは少なくとも避けたい。 http://vb.mvps.org/articles/pt199511.pdf 4.Mid,Left,RightじゃなくてMid$,Left$,Right$を使ったほうがいいです 5.確認してないけど,VBAの文字列比較って炉ケー類損だったりしないのかなあ

noname#96558
質問者

お礼

丁寧にありがとうございました。 逆に削除しない文字だけを積み上げるということですね。 これが一番簡単ですね。

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • _Kyle
  • ベストアンサー率78% (109/139)
回答No.3

文字列の先頭から調べるのではなく、 【後ろから見ていく】というアプローチも…。 For N = Len(Text1) To 1 Step -1  If Mid(Text1, N, 1) < " " Then Text1 = Left(Text1, N - 1) + Mid(Text1, N + 1) Next N ご参考まで。

noname#96558
質問者

お礼

ありがとうございました。なるほどうまくいきますね。

すると、全ての回答が全文表示されます。
  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.2

For N = 1 To Len(Text1) 'コントロール信号の削除 If Mid(Text1, N, 1) < " " Then Text1 = Left(Text1, N - 1) + Mid(Text1, N + 1) N=N-1 End If Next N ではだめですか。

noname#96558
質問者

お礼

ありがとうございました。 やってみると永久ループを起こしました。

すると、全ての回答が全文表示されます。

関連するQ&A