電子書籍の厳選無料作品が豊富!

いろいろやってみたものの出来ないのでお伺いします

Bのカラムに 1303-51303M-1807 と入っています。1303はユニークな番号ですが必ずしも数字4桁ではなく 四桁の数字にアルファベットがつくこともあります。(例)1151a-51151M-1807

真ん中の数字は「顧客コード&M」もしくは「顧客コード&B」、これは必ず6文字です。

右側の1807は "yymm"です。
この「1807」を毎月翌月「1808」に変えたいのですが、それがうまくいきません。
replacementやsubstituteやrightを組み合わせても エラーになります。

VBA教えてもらえないでしょうか?

A 回答 (4件)

No3です。


以下のマクロを標準モジュールに登録してください。
No3の補足要求で全てYesの回答の前提です。
--------------------------------------------
Option Explicit
Public Sub 指定月置換()
Dim date0 As Date '翌月の1日
Dim str As String
Dim trg As String
Dim maxrow As Long
Dim row As Long
Dim RE As Object
date0 = DateSerial(Year(Date), Month(Date) + 1, 1)
str = Format(Year(date0) Mod 100, "00") & Format(Month(date0), "00")
str = InputBox("4桁の年月を入力してください", "置換月指定", str)
If Len(str) <> 4 Or IsNumeric(str) = False Then
MsgBox ("入力値が4桁の数字でないので終了します")
Exit Sub
End If
Set RE = CreateObject("VBScript.RegExp")
With RE
.Pattern = "(^.*)(\d\d\d\d)$" ''検索パターンを設定(最後が4桁の数字であること)
End With
maxrow = Cells(Rows.Count, "B").End(xlUp).row 'B列の最大行取得
For row = 2 To maxrow
trg = Cells(row, "B").Value
If trg <> "" Then
Cells(row, "B").Value = RE.Replace(trg, "$1" & str)
End If
Next
MsgBox ("完了")
End Sub
    • good
    • 0
この回答へのお礼

素晴らしい
内容を見たのですが 読み解けませんでしたが
このままコピーしたら 見事に成功です。
ありがとうございました。

お礼日時:2018/08/16 11:39

補足要求です。


①1行目は見出し行ですか。
②B列の2行目以降のデータを下4桁が数字であれば、添付図のようにinputboxで入力された値で
置換しますが、それでOKですか。
添付図の例では1807が全て1809に変わります。
③inputboxに最初に表示される値は1809のように翌月の月が表示されます。但し、この値を1808のように変更することも可能です。
キャンセルがクリックされた場合、もしくは4桁の数字以外が入力された場合は、処理を打ち切ります。

上記のような仕様でよければ、そのマクロの提供は可能ですがいかがでしょうか。
「Excel VBA 置換の件」の回答画像3
    • good
    • 0
この回答へのお礼

はい、メッセージボックスに入力して変更ということも試みたのですが
ネットでしらべても出てきませんでした。
ご提供お願いいたします。
ありがとうございます。

お礼日時:2018/08/15 20:35

こんばんは!



データはB列の2行目以降にあるとします。
ごく簡単に・・・

Sub Sample1()
 Dim i As Long, myStr As String
  For i = 2 To Cells(Rows.Count, "B").End(xlUp).Row
   myStr = Left(Cells(i, "B"), InStrRev(Cells(i, "B"), "-")) & Format(Date, "yymm")
   Cells(i, "B") = myStr
  Next i
End Sub

こんな感じではどうでしょうか?m(_ _)m
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2018/08/16 11:40

こんな感じでどうでしょうか。



Sub test()

  Dim dt As Date
  Dim src As String
  Dim out As String
  Dim a As Variant
  
  '元の文字列
  src = "1151a-51151M-1812"
  
  '元の文字列を'-'で分割して配列にする。a(2)がyymm
  a = Split(src, "-")
  '元の文字列のyymmから当月1日のシリアル値を取得
  dt = DateSerial(Left(a(2), 2), Right(a(2), 2), 1)
  '1カ月後のシリアル値を計算
  dt = DateAdd("m", 1, dt)
  'a(2)に新しいyymmを書き込む
  a(2) = Right("0" & Year(dt), 2) & Right("0" & Month(dt), 2)
  '配列aを'-'で繋げて文字列にする
  out = Join(a, "-")
  
  MsgBox out
End Sub
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2018/08/16 11:40

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!