ID非公開

2020/9/19 7:46

55回答

エクセルのマクロについてご質問です。

エクセルのマクロについてご質問です。 セルにABC-001と文字と数字が混ざっています このセルに+1してABC-002という風に表示させたいのですがどのような方法がございますでしょうか?

Visual Basic | Excel69閲覧xmlns="http://www.w3.org/2000/svg">100

ベストアンサー

1

A1セルを対象にした例文。 数字部分は3桁固定。 Sub sample() Dim xAry With Range("A1") xAry = Split(.Value, "-") .Value = xAry(0) & "-" & Format(xAry(1) + 1, "000") End With End Sub

1人がナイス!しています

数字の桁数を固定にしない方法 Sub sample2() Dim xAry With Range("A1") xAry = Split(.Value, "-") .Value = xAry(0) & "-" & _ Format(xAry(1) + 1, String(Len(xAry(1)), "0")) End With End Sub

その他の回答(4件)

1

数値部分がどこにあっても加算できるようにしてみました。 Sub CallSample()     Debug.Print AddNum("abc-001-xyz") End Sub Function AddNum(ByVal Num As String) As String     '数値部の加算     Dim Reg As Object     'RegExp     Dim Matches As Object 'MatchCollection     Dim subMatch As Object     Dim L As Long     Dim Fmt As String     Dim Rep As String          Set Reg = CreateObject("VBScript.RegExp")          With Reg         .Pattern = "(\D*)(\d+)(\D*)"         .Global = False         If .Test(Num) Then             Set Matches = .Execute(Num)             Set subMatch = Matches(0).subMatches             L = Len(subMatch(1))             Fmt = String(L, "0")             Rep = Format(Val(subMatch(1)) + 1, Fmt)             AddNum = .Replace(Num, "$1" & Rep & "$3")         End If     End With     Set Reg = Nothing End Function

1人がナイス!しています

>このセルに+1して あっ、セルね。 ではCallは、こんな感じですね。 Sub CallSample2()     With Range("A1")         .Value = AddNum(.Value)     End With End Sub

1

書いてみた。 Function 加算(buf As String) As String '行末数値加算 Dim RE, reMatch, reValue, Len1 As Long, len2 As Long Dim zero Set RE = CreateObject("VBScript.RegExp") 加算 = buf With RE .Pattern = "\d*$" .Global = False Set reMatch = .Execute(buf) If reMatch.Count > 0 Then Len1 = Len(reMatch.Item(0)) zero = Replace(Space(Len1), " ", "0") len2 = Len(buf) 加算 = Left(buf, len2 - Len1) + Format(Trim(str(Val(reMatch.Item(0)) + 1)), zero) End If End With Set RE = Nothing End Function

1人がナイス!しています

1

雰囲気、以下でどうなりますか 標準モジュールに以下を記述し、test を実行してみます 結果は、イミディエイトウィンドウへ 処理パターン2つ ・1つは、"-" に注目した処理 ・1つは、文字列右側の数字部分だけに注目した処理 後は、与えられる文字列のイレギュラーパターン時にどうするかを盛り込んでいけば Option Explicit Public Sub test()    Dim vC As Variant, v As Variant    vC = Array("ABC-001", "ABC-998", "ABC1-0001" _          , "ABC-8A8", "ABC-1-001", "ABC998", "998", Empty)    For Each v In vC       Debug.Print v, fncSamp1(v), fncSamp2(v)       Debug.Print v, fncSamp1(v, 3), fncSamp2(v, 3)    Next End Sub Public Function fncSamp1(ByVal sSrc As String _             , Optional ByVal jAdd As Long = 1) As String    Dim sA() As String    Dim i As Long    Const CSP As String = "-"    If (jAdd < 1) Then jAdd = 1    sA = Split(sSrc, CSP)    ReDim Preserve sA(0 To 1)    i = Len(sA(1))    If (i = 0) Then i = 3    sA(1) = Format(Val(sA(1)) + jAdd, String(i, "0"))    fncSamp1 = Join(sA, CSP) End Function Public Function fncSamp2(ByVal sSrc As String _             , Optional ByVal jAdd As Long = 1) As String    Dim s As String    Dim i As Long, n As Long    If (jAdd < 1) Then jAdd = 1    For i = Len(sSrc) To 1 Step -1       s = Mid(sSrc, i, 1)       If (s Like "[!0-9]") Then Exit For       n = Val(s) + jAdd       jAdd = n \ 10       Mid(sSrc, i, 1) = n Mod 10       If (jAdd = 0) Then Exit For    Next    If (jAdd > 0) Then       sSrc = Left(sSrc, i) & jAdd & Mid(sSrc, i + 1)    End If    fncSamp2 = sSrc End Function

1人がナイス!しています

1

セルに「1」と入力して見た目だけ「ABC-001」になるように しておけば 単純に「+1」するだけで済みます。 A1に「1」と入力し 表示形式をユーザー定義で「"ABC-"000」

1人がナイス!しています