Цикл по столбцу C и возврат в столбец B содержимого за вычетом первых X символов

#excel #vba

#excel #vba

Вопрос:

Цель: Если столбец C не начинается с «XXX *», то верните эту ячейку за вычетом первых 5 символов.

Пример:

 C2 = XXX                 Then                 B2 would be empty
C3 = YYY1220190318       Then                 B3 = 20190318
C4 = UGA1535D            Then                 B4 = 1535D 
  

‘Вот мой фактический код

   Dim arrData As Variant, LastRow As Long, i As Long, ws As Worksheet

            Set ws = ThisWorkbook.Sheets("Long List 15032019") 'change 

the name of the sheet to the one you are doing the code

        With ws
            LastRow = .Cells(.Rows.Count, 3).End(xlUp).Row
            arrData = .Range("A2", .Cells(LastRow, "C")).Value
            For i = 1 To UBound(arrData)
                If arrData(i, 3) Like "Bus*" Then
                    arrData(i, 1) = "BU CRM"
                Else
                    arrData(i, 1) = "CSI ACE"
                End If
                If arrData(i, 3) Like "CSI*" Or arrData(i, 3) = vbNullString Then
                    arrData(i, 2) = vbNullString
                    Else: arrData(i, 2) = Right(arrData(i, 3), 12)
                End If
            Next i
            .Range("A2", .Cells(LastRow, "C")).Value = arrData

             End With
  

Я думаю, что это единственная строка кода, которую необходимо скорректировать Else: arrData(i, 2) = Right(arrData(i, 3), 12)

Я пытался использовать -12 или ВЛЕВО. Но это не сработало бы.

Комментарии:

1. Я смотрел на код и думал… чувак, это похоже на мое, и это было… хахаха, вам нужно сделать символы динамическими. Right(arrData(i, 3), Len(arrData(i, 3) - 5) эти 5 символов вы хотите вычесть

2. @Дамиан, я почти уверен, что это ваш код, спасибо. Я отредактировал код, но это выдало мне ошибку. Ошибка компиляции — синтаксическая ошибка

3. Я предполагаю, что это происходит со строками, меньшими 6 символов, если это так, это выдаст ошибку. Проверьте это, если это так, то просто используйте оператор if, If Len(arrData(i, 3) < 6 Then независимо от того, содержит ли он 5 или менее символов Else в моем коде выше.

4. @Damian все мои строки больше 6 символов. Я попытался исправить, которое вы предложили, но безуспешно.

5. Извините, @AAD. Объявление, которое я пропустил в завершении «)» это должно быть Right(arrData(i, 3), Len(arrData(i, 3)) - 5)

Ответ №1:

Как насчет:

 Sub KleanUp2()
    Dim cell As Range, v As String, v2 As String
    For Each cell In Intersect(Range("C:C"), ActiveSheet.UsedRange)
        v = cell.Value
        If Len(v) < 4 Then
            vr = ""
        Else
            vr = Mid(v, 4, 9999)
        End If
        cell.Offset(0, -1) = vr
    Next cell

End Sub
  

Если значение в столбце C превышает 3 символа, первые три символа удаляются, а результат помещается в ту же строку в столбце B

Если значение в столбце C меньше 4 символов (или ячейка пуста), то в столбце B в той же строке помещается значение null.

Ответ №2:

Попробуйте:

 Option Explicit

Sub test()

    Dim Lastrow As Long, Row As Long

    With ThisWorkbook.Worksheets("Sheet1")

        Lastrow = .Cells(.Rows.Count, "C").End(xlUp).Row

            For Row = 1 To Lastrow

                If Left(.Range("C" amp; Row).Value, 3) = "XXX" Then
                    .Range("B" amp; Row).Value = ""
                Else
                    .Range("B" amp; Row).Value = Mid(.Range("C" amp; Row).Value, 4, Len(.Range("C" amp; Row).Value) - 3)
                End If

            Next Row

    End With

End Sub
  

Комментарии:

1. ваш код работает, однако я получаю сообщение об ошибке [Недопустимый вызов процедуры или аргумент (ошибка 5)] Код действительно работает. Есть ли способ избавиться от ошибки? В моем файле более 65 000 строк

2. В итоге я использовал ваш код и еще один для его дальнейшего форматирования. Я не отслеживал, где находился код. Тем не менее, спасибо!!