MacOs Excel 2011 VBA Macro Добавление запятой и пробела после строкового шаблона - PullRequest
0 голосов
/ 02 апреля 2019

Мне нужно найти строковый шаблон различной длины и добавить запятую и пробел после этого строкового шаблона.Например, поиск строки «Cat. 123». Я хочу заменить эту строку значением «Cat. 123» (т.е. добавить запятую, а затем пробел в конце «Cat. 123»).Я использую Mac Office 2011, поэтому любой код должен работать с версией Excel для Mac.

Я пытался использовать Replace.Regex, Split и все другие функции замены, которые я мог найти.Приведенный ниже код - лучшее, что я придумал, чтобы сделать это, но он не добавляет запятую и пробел в конец строкового шаблона.


Sub test()
    Dim r As Range, x, y

    Set r = Cells.Find("?*, Cat. *", , , 1)
    If Not r Is Nothing Then
        Do
            ' Search for any string with the pattern Cat. 123, Cat. 14, etc
            x = Split(r.Value, " Cat. ")
            If x(UBound(x)) Like "* *" Then
             ' Replace string Cat. 123 with the new string Cat. 123, 
                y = Split(x(UBound(x)))
                x(0) = "Cat. " & y(0) & ", " & x(0)
                x(UBound(x)) = y(1)
            Else
                y = x(UBound(x))
                x(0) = "Cat. " & y & ", " & x(0)
                x(UBound(x)) = ""
            End If
            r.Value = Join(x)
            Set r = Cells.FindNext(r)
        Loop Until r Is Nothing
    End If
  End Sub

Так чтовыходные данные каждой ячейки, содержащей шаблон, подобный следующим примерам: «Кат. 123», «Кат. 1», «Кат. 34», «Кат. 4567», будет изменен на «Кат. 123», «Кат. 1».«Cat. 34», «Cat. 4567», ПРИМЕЧАНИЕ. Исходная строка всегда будет иметь точку после слова «Cat», за ней будет следовать пробел, а затем одна цифра до четырех цифр.как показано выше.

1 Ответ

1 голос
/ 02 апреля 2019

Попробуйте (на этот раз без регулярных выражений, зависящих от vbscript):

Sub tgr()

    Dim aData As Variant
    Dim sTemp As String
    Dim lCatLoc As Long
    Dim lNextSpace As Long
    Dim i As Long, j As Long

    With ActiveSheet.UsedRange
        If .Cells.Count = 1 Then
            ReDim aData(1 To 1, 1 To 1)
            aData(1, 1) = .Value
        Else
            aData = .Value
        End If
        For i = 1 To UBound(aData, 1)
            For j = 1 To UBound(aData, 2)
                If Len(aData(i, j)) > 0 Then
                    If aData(i, j) Like "*Cat. [0-9]*" Then
                        lCatLoc = InStr(1, aData(i, j), "Cat. ", vbTextCompare)
                        lNextSpace = InStr(lCatLoc + 5, aData(i, j) & " ", " ", vbTextCompare)
                        sTemp = Mid(aData(i, j), lCatLoc, lNextSpace - lCatLoc)
                        If Right(sTemp, 1) <> "," Then aData(i, j) = Replace(aData(i, j), sTemp, sTemp & ", ")
                    End If
                End If
            Next j
        Next i
        .Value = aData
    End With

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...