- ベストアンサー
繰り返しの置き換えマクロで困っています
- マクロ初心者が繰り返しの置き換えマクロについて質問しています。
- 特定の条件に基づいてプラス5して値を置き換えるマクロを作成したいとのことです。
- 具体的な例を挙げて問題を説明しており、正しい置き換え結果を得るための指示を求めています。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>一番最後の値に、プラス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
その他の回答 (3)
- Wendy02
- ベストアンサー率57% (3570/6232)
#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
お礼
ありがとうございました。 大変役に立ちました。
- imogasi
- ベストアンサー率27% (4737/17069)
必要要素技術はたいしたことなく少数なのに、丸投げしている。質問点を絞る訓練をしないと上達しません。 (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は削除。
お礼
ありがとうございました。 ひとつひとつ丁寧な説明で、とてもわかりやすかったです。 大変勉強になりました。
- watabe007
- ベストアンサー率62% (476/760)
データは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
お礼
ありがとうございました。 うまくいきました。大変に役にたちました。