Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


7944 / 13644 ツリー ←次へ | 前へ→

【35931】検索文字列の置換方法 Jack 06/3/16(木) 11:59 質問[未読]
【35932】Re:検索文字列の置換方法 ちくたく 06/3/16(木) 12:25 回答[未読]
【35937】Re:検索文字列の置換方法 Jack 06/3/16(木) 14:41 質問[未読]
【35940】Re:検索文字列の置換方法 ちくたく 06/3/16(木) 15:49 回答[未読]
【35941】Re:検索文字列の置換方法 ちくたく 06/3/16(木) 16:04 発言[未読]
【35942】Re:検索文字列の置換方法 Jack 06/3/16(木) 16:12 質問[未読]
【35943】Re:検索文字列の置換方法 Blue 06/3/16(木) 16:29 発言[未読]
【35951】Re:検索文字列の置換方法 ちくたく 06/3/16(木) 17:10 発言[未読]

【35931】検索文字列の置換方法
質問  Jack  - 06/3/16(木) 11:59 -

引用なし
パスワード
   お尋ねします。

"Book::TDK01A"
"Book::SONY05D"
"Book::KEN10Z"

というような文字列を検索して"Book::"以降の文字列の置換をしたいと思っています。
置換回数は最大50回程あり、その都度違います。
エクセルの置換機能のように、まず初めの"Book::"が入った文字列を検索して置換、
次に、2番目にある"Book::"を検索して置換、次に3番目の"Book::"を検索して置換、
という作業を繰り返し行いたいのです。
以前こちらで見つけて使わせていただいている下記のコードを参考に作ろうと思うのですが、"Book::"以降の文字が数字の場合はうまくいくのですが、文字列になると、文字が追加されてしまい、置換したい"TDK01A"の部分が残ったままになります。

いろいろ試してみたのですがどこを変更すればよいのか全く解らず行き詰まってしまいました。
どなたかお知恵をお貸しいただけないでしょうか??
どうぞ宜しくお願い致します。


  Const S As String = """Book::" '検索する文字列
  Dim MyS As String
  Dim MyS0 As String
  Dim Ans1 As Variant
  Dim n As Long
  Dim i As Long, j As Long

i = 1
  Do While InStr(i, MyS, S) > 0
    j = InStr(i, MyS, S)
    n = Val(StrConv(Mid(MyS, j + Len(S)), 8))
    If n = 0 Then
      MyS0 = S
    Else
      MyS0 = S & Mid(MyS, j + Len(S), Len(CStr(n)))
    End If
    Ans1 = Application.InputBox("検索文字列は " & MyS0 & _
      Chr(13) & Chr(13) & "置換する文字列", , _
      """Book::"& StrConv("", 4))
    If VarType(Ans1) = vbBoolean Then
      Ans1 = MyS0
    End If
    If n = 0 Then
      MyS = Left(MyS, j - 1) & Ans1 & Mid(MyS, j + Len(S))
    Else
      MyS = Left(MyS, j - 1) & Ans1 & Mid(MyS, j + Len(S) + Len(CStr(n)))
    End If
    i = j + Len(Ans1) - 1
  Loop

【35932】Re:検索文字列の置換方法
回答  ちくたく WEB  - 06/3/16(木) 12:25 -

引用なし
パスワード
   Jack さん:
こんな感じですか?

Sub test()
  
  Dim fStr As String, rStr As String
  
  fStr = InputBox("検索文字列")
  rStr = InputBox("置換文字列")
  
  Cells.Replace "Book::" & fStr, "Book::" & rStr

End Sub

【35937】Re:検索文字列の置換方法
質問  Jack  - 06/3/16(木) 14:41 -

引用なし
パスワード
   ちくたくさん

早速の回答ありがとうございます。
ですが。。。一括検索ではなく、1番目の"Book::" に続く文字列の置換文字が
それぞれ違うのでエクセルでいう、”次を検索”でひとつひとつ検索して最後の
"Book::" まで書き直していくという作業をします。

まだVBAを始めて1ヶ月も経ってない初心者で、右も左もわからない状態です。。。

素人考えですが、

Const S As String = """MOM::"   ←検索する文字列

の部分に"""MOM:: &○○○"として "MOM:: を含んだ文字列(1行)を1つづつ検索して置換するというような引数を書く事は可能ですか???

宜しくお願い致します。  

【35940】Re:検索文字列の置換方法
回答  ちくたく WEB  - 06/3/16(木) 15:49 -

引用なし
パスワード
   Jack さん
こんにちは。

ひとまず、こんな感じかと思います。
面倒なのでFindを使いました。他にもやり方はあると思います。

Sub test()
  
  Dim fStr As String, rStr As String
  Dim r As Range, f As Integer, fAdd As String
  
  fStr = InputBox("検索文字列")
  rStr = InputBox("置換文字列")
  
  With ActiveSheet.Cells
    Set r = .Find("Book::" & fStr)
    fAdd = r.Address
    Do
      If Not r Is Nothing Then f = MsgBox(r.Address & "置き換えますか?", vbOKCancel)
      If f = vbOK Then r.Value = "Book::" & rStr
      Set r = .FindNext(r)
      If r Is Nothing Then Exit Do
    Loop While Not r Is Nothing And r.Address <> fAdd
  End With
End Sub

>素人考えですが、
>
>Const S As String = """MOM::"   ←検索する文字列
>
>の部分に"""MOM:: &○○○"として "MOM:: を含んだ文字列(1行)を1つづつ検索して置換するというような引数を書く事は可能ですか???

すいません、上記文章の意味がわかりませんでしたので、お答えできません。

【35941】Re:検索文字列の置換方法
発言  ちくたく WEB  - 06/3/16(木) 16:04 -

引用なし
パスワード
   っていうか、今気づく僕も間抜けですが、
一個ずつ検索して置換するなら、
Excelの一般機能の検索でいいんじゃないですか?

Book::を記述する手間が面倒だからのコーディングだったら、
ナンセンスな仕様の気がする。

なんか、一個ずつ検索しなきゃいけなくて、
一般機能の検索を使いたくない理由があれば、
教えてください。

あ、単なる興味心です。

【35942】Re:検索文字列の置換方法
質問  Jack  - 06/3/16(木) 16:12 -

引用なし
パスワード
   ちくたくさん
お返事ありがとうございます。

実は、テキストファイルからデータを読み込んで置換していきたいのです。

下記のようにテキストファイルからデータを読み込むコードを追加してみました。


Sub test()
 
  Dim Fso As Object
  Dim Ts As Object
  Dim MyF As String
  Dim fStr As String, rStr As String
  Dim r As Range, f As Integer, fAdd As String
  Dim MyS As String
  
  MyF = Application.GetOpenFilename("ファイルを選択(*.*), *.*")
  If MyF = "False" Then Exit Sub

  Set Fso = CreateObject("Scripting.FileSystemObject")
  Set Ts = Fso.OpenTextFile(MyF, 1)
  MyS = Ts.ReadAll
  Ts.Close
 
  fStr = InputBox("検索文字列")
  rStr = InputBox("置換文字列")
 
    Set r = .Find("""MOM:: & " & fStr)
    fAdd = r.Address
    Do
      If Not r Is Nothing Then f = MsgBox(r.Address & "置き換えますか?", vbOKCancel)
      If f = vbOK Then r.Value = """MOM:: & " & rStr
      Set r = .FindNext(r)
      If r Is Nothing Then Exit Do
    Loop While Not r Is Nothing And r.Address <> fAdd
    
     Set Ts = Fso.OpenTextFile(MyF, 2, True)
    Ts.Write MyS
    Ts.Close
    MsgBox "書換えが完了しました"
    If S <> 0 Then
  Else
    MsgBox S & " はありませんでした"
  End If
  
  Set Ts = Nothing
  Set Fso = Nothing
  
  End With
End Sub


ですが、今動かしてみたところ
Set r = .Find("""MOM:: & " & fStr) の  .Findの部分でエラーがでます。

どこが違うのかもし解られるようであれば教えていただけないでしょうか?
お手数ですがもし宜しければエラーの原因も教えていただけると
今後の勉強にも役立つのでお願いできませんでしょうか?
どうぞ宜しくお願い致します。

    

【35943】Re:検索文字列の置換方法
発言  Blue  - 06/3/16(木) 16:29 -

引用なし
パスワード
   ソースよむきあるのでしょうか?

>   Set r = .Find("""MOM:: & " & fStr)
の .Find が何にかかっているかわかりますか?
With〜もないのに使えるわけないです。

ちくたくさんは、エクセルのシート上の置換を前提にしています。
Rangeオブジェクトを使わない、ただの String 変数では当然使えません。

というか、折角Excelをつかっているのだから、オンメモリーではなく、
一度Excelに読み込ませてから処理するほうが楽チンだと思います。
(行削除や置換とう便利)
見栄え上うざったいと思うのならば、シートを非表示にすればいいし。


何度も云いますけど、
ここに載せるソースはあくまでも「サンプル」に過ぎないので、
そのあとどう利用するかは、あなたしだいです。
理解しないで先に進むと後で、痛い目にあってもしょうがないですよ。

【35951】Re:検索文字列の置換方法
発言  ちくたく WEB  - 06/3/16(木) 17:10 -

引用なし
パスワード
   こんにちは。
Blueさんの意見も受けまして。

さて、目的によりコーディングのやり方は異なります。
ので、仕様は当初段階で明確にする必要があると思います。

.FindのFind文字列前のピリオドに着目してください。
そして、Withという構文をみてください。
エラーの原因は自ずと明確です。探す対象範囲がなくなってますもんね。
しかし、このやり方は今回のケースではいけません。

また、Blueさんが言っているように、
こっちとしては、サンプルを提示しているという感じです。
委託をうけているわけではないですのでね。

こちら側では、今回の処理をfsoでやりたいのかもわかりませんし、
それだったら別にVBAでやる意味がわからないことも考えられます。

ヘルプファイルを見てみて下さいね。

7944 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free