• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:繰り返しの置き換えマクロで困っています。)

繰り返しの置き換えマクロで困っています

このQ&Aのポイント
  • マクロ初心者が繰り返しの置き換えマクロについて質問しています。
  • 特定の条件に基づいてプラス5して値を置き換えるマクロを作成したいとのことです。
  • 具体的な例を挙げて問題を説明しており、正しい置き換え結果を得るための指示を求めています。

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

  • ベストアンサー
  • watabe007
  • ベストアンサー率62% (476/760)
回答No.3

>一番最後の値に、プラス5して置き換 一番最後の値を5に置き換えていました プラス5なら Sub Test2()   Dim MyRng As Range   Dim FirstAddress As String     Dim v As Variant, i As Long   With Columns("A")     Set MyRng = .Find("@", LookIn:=xlValues, LookAt:=xlPart)     If MyRng Is Nothing Then Exit Sub     FirstAddress = MyRng.Address     Do       With MyRng.Offset(1)         v = Split(.Value, " ")         i = UBound(v)         v(i) = v(i) + 5         .Value = Join(v, " ")       End With       Set MyRng = .FindNext(MyRng)     Loop While FirstAddress <> MyRng.Address   End With   Set MyRng = Nothing End Sub

ivu_raru
質問者

お礼

ありがとうございました。 うまくいきました。大変に役にたちました。

その他の回答 (3)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

#3さんのご指摘の「プラス5なら」、というのは確かに、質問はそうなのですが、その数字って、IP Address ですよね。桁の制限があるはずですね。そうでしたら、もう少し検証したほうがよいかもしれませんね。 '// Sub TestMacro1()  Dim c As Range  Dim i As Long  Application.ScreenUpdating = False  For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row   If Cells(i, 1).Value Like "?*@*" Then     Cells(i + 1, 1).Value = NumberAdd(Cells(i + 1, 1).Value, 5)    i = i + 1   End If  Next  Application.ScreenUpdating = True End Sub Private Function NumberAdd(ByVal sText As Variant, ByVal num As Long) As String Dim i As Long Dim buf As String   i = InStrRev(sText, Space(1), , 2)   If i > 1 Then    buf = Trim(Mid$(sText, i))    If IsNumeric(buf) Then     buf = buf + num    End If    NumberAdd = Mid(sText, 1, i) & buf   Else    NumberAdd = sText   End If End Function

ivu_raru
質問者

お礼

ありがとうございました。 大変役に立ちました。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.2

必要要素技術はたいしたことなく少数なのに、丸投げしている。質問点を絞る訓練をしないと上達しません。 (1)@の在る行をどうして見つけるか (2)次の行の捉え方 (3)文字列がスペースで区切られているから、それを分離し、最後の文字列を対称にする (4)最後の捉え方 (5)数字文字列を数値化して、それに5を加え、また文字列に戻す方法。 (6)その他部分を一体化する方法 こういう風に考えるのだ。その中で判るものは除いて、WEB照会でもしてみる。 それから質問。 ーーー (1)はFind、FindNextが初心者には難しいので、全データ行をInstr関数で@が含まれて居るか 総なめしたほうがわかりやすいかと思う。 (2)はCellS()を使うと、Cells(r+1,"A")が次行 (3)Split関数を使う (4)Ubound()の利用 (5)数値化はVAL()、+5は+5 文字列に戻すのはCSTR関数 (6)は&で結合 ーーー Sub test01() d = Range("A65536").End(xlUp).Row: MsgBox d For i = 2 To d a = Cells(i, "A") p = InStr(a, "@") If p <> 0 Then MsgBox i b = Cells(i + 1, "A"): MsgBox b s = Split(b, " "): MsgBox s(UBound(s)) End If Next i End Sub を実行して、質問のデータで、2,5となることを確認。 次の行のデータが正しく捉えていることを確認。 ーーー Sub test01() d = Range("A65536").End(xlUp).Row: MsgBox d For i = 2 To d a = Cells(i, "A") p = InStr(a, "@") If p <> 0 Then MsgBox i b = Cells(i + 1, "A"): MsgBox b s = Split(b, " "): c = s(UBound(s)): MsgBox c c5 = Val(c) + 5: MsgBox c5 st = "" For j = 0 To UBound(s) - 1 st = st & s(j) & " " Next j st = st & Str(c5): MsgBox st End If Next i End Sub ここでは存在チェックはしてません(次行など) Str(c5)は符号桁1スペース入るかもしれないので、上記ではダメなら、正負にあわせて考えて追加してください。 納得後MSGBOXは削除。

ivu_raru
質問者

お礼

ありがとうございました。 ひとつひとつ丁寧な説明で、とてもわかりやすかったです。 大変勉強になりました。

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.1

データはA列に有るとしています Sub Test()   Dim MyRng As Range   Dim FirstAddress As String   With Columns("A")     Set MyRng = .Find("@", LookIn:=xlValues, LookAt:=xlPart)     If MyRng Is Nothing Then Exit Sub     FirstAddress = MyRng.Address     Do       With MyRng.Offset(1)         .Value = Left(.Value, Len(.Value) - 1) & "5"       End With       Set MyRng = .FindNext(MyRng)     Loop While FirstAddress <> MyRng.Address   End With   Set MyRng = Nothing End Sub