Добавить ноль в строке из одной цифры после "/" в строке - PullRequest
0 голосов
/ 09 июля 2019

У меня есть столбец в следующем формате:

RMB-2018-726/12    
RMB-2019-27/16    
RMB-2019-160/21
RMB-2019-259/6
RMB-2019-433/2

Теперь мне нужно проверить последнюю цифру или после косой черты, если это одна цифра, добавить ноль, в противном случае сохранить значение (для сортировкицели).Я уже написал код, используя texttocolumn, затем len, а затем объединить столбцы, однако кажется, что мои решения длинные, но они работают в соответствии с моими потребностями.Ради обучения мне интересно, есть ли другие способы обойти или более эффективный способ сделать это.

'Insert zero on single digit claim number
Dim myLastRow As Long
myLastRow = Worksheets(ActiveSheet.Name).Range("A1").End(xlDown).Row

Columns("J:M").Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove 'Insert 4 new columns
'Column 1 = Batch Number; Column 2 = Claim Number; Column 3 = add zero on single digit; Column 4 = merge Column 1 + 3

Range("I2:I" & myLastRow).TextToColumns _
Destination:=Range("J2"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
        Semicolon:=False, Comma:=False, Space:=True, Other:=True, OtherChar:= _
        "/" 'TextToColumn the Batch Column = Column 1
Application.CutCopyMode = False
Range("L2:L" & myLastRow).FormulaR1C1 = "=IF(LEN(RC[-1])=1,""0"","""")&RC[-1]" 'add zero on single digit only = Column 3
Range("M2:M" & myLastRow).FormulaR1C1 = "=RC[-3]&""/""&RC[-1]" 'combine the batch = Column 4

Range("M2:M" & myLastRow).Copy
Range("I2:I" & myLastRow).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False 'Where the original batch column
Columns("J:M").Delete
Columns("I:I").EntireColumn.AutoFit

Ответы [ 3 ]

1 голос
/ 09 июля 2019

Вот простой шаблон, который я все время использую для супер эффективного обновления значений Range.

  • Определить целевой диапазон
  • Считать значения целевого диапазона в массив
  • Изменить значения
  • Назначить массив обратно целевому диапазону

Sub FormatIDs()
    Dim data
    Dim Target As Range
    Dim BackSlashIndex As Long, r As Long

    With ActiveSheet
        Set Target = .Range("A1", .Cells(Rows.Count, 1).End(xlUp))
    End With

    data = Target.Value

    For r = 1 To UBound(data)
        BackSlashIndex = InStrRev(data(r, 1), "/")
        If Len(data(r, 1)) - BackSlashIndex = 1 Then
            data(r, 1) = Left(data(r, 1), Len(data(r, 1)) - 1) & "0" & Right(data(r, 1), 1)
        End If
    Next

    Target.Value = data
End Sub
1 голос
/ 09 июля 2019

Как к сведению, это можно сделать без vba:

=LEFT(A1,FIND("/",A1))&IF(MID(A1,LEN(A1)-2,1)="/",RIGHT(A1,2),"0"&RIGHT(A1,1))

Или, добавив ноль, если необходимо, перед косой чертой (как это было запрошено в комментарии к другому ответу):

=LEFT(A1,9)&IF(MID(A1,13,1)="/",MID(A1,10,4),"0"&MID(A1,10,3))&IF(MID(A1,LEN(A1)-2,1)="/",RIGHT(A1,2),"0"&RIGHT(A1,1))

Обратите внимание, что больше никаких сложностей (например, возможна одиночная цифра перед косой чертой), и это быстро станет громоздким, поэтому для расширяемости, безусловно, лучше использовать vba.

1 голос
/ 09 июля 2019

Может быть, это может помочь

Sub test()
Dim wb As Workbook, ws As Worksheet
    Set wb = ThisWorkbook
    Set ws = wb.Worksheets("Sheet1")
    colLatter = "A"
        LastRow = ws.Cells(ws.Rows.Count, colLatter).End(xlUp).Row
        valArr = ws.Range(colLatter & "1:" & colLatter & LastRow).Value
        For i = LBound(valArr) To UBound(valArr)
            If valArr(i, 1) <> "" Then
                sStr = Split(valArr(i, 1), "/")
                valArr(i, 1) = sStr(0) & "/" & Format(sStr(1), "00")
            End If
        Next i
        ws.Range(colLatter & "1").Resize(UBound(valArr), 1) = valArr
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...