Необходимо исключить слово (или количество символов) в моем коде - PullRequest
0 голосов
/ 21 января 2019

Я пытаюсь создать модуль, который будет форматировать таблицу Excel для моей команды на работе. Существует один столбец, который будет содержать слово «CPT» и различные коды CPT с описаниями. Мне нужно удалить весь текст (описание CPT) после 5-значного кода CPT, но все же оставить слово CPT в других ячейках.

Например: столбец S, строка 6 содержит только слово «CPT» (не в кавычках) Затем в столбце S, строка 7 содержится текст «99217 Расход по наблюдению»

Эта настройка повторяется несколько раз по всей колонке S.

Я бы хотел, чтобы строка 6 оставалась такой же, как она есть ("CPT"), но в строке 7 я хочу оставить только "99217"

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

Я пробовал различные утверждения If / Then, If / Then / Else

Sub CPTcolumn()
Dim celltxt As String
celltxt = ActiveSheet.Range("S6" & Rows.Count).End(xlUp).Text
Dim LR As Long, i As Long
LR = Range("S6" & Rows.Count).End(xlUp).Row

For i = 1 To LR
    If InStr(1, celltxt, "CPT") Then
Next i

Else
    With Range("S6" & i)
    .Value = Left(.Value, InStr(.Value, " "))
End With
Next i

End If
End Sub

Когда я пытаюсь запустить его, я получаю различные "ошибки компиляции"

Ответы [ 3 ]

0 голосов
/ 21 января 2019

Ваша первая ошибка произойдет здесь:

ActiveSheet.Range("S6" & Rows.Count).End(xlUp).Text

Поскольку вы пытаетесь получить текст из последнего использованного диапазона, начиная с .End(xlUp) в Range("S61048576"), что примерно в 58 раз превышает предел строки вExcel.Вы можете изменить Range("S6" & Rows.Count) на Range("S" & Rows.Count)

Здесь произойдет ваша вторая ошибка:

LR = Range("S6" & Rows.Count).End(xlUp).Row

Это будет та же ошибка.

Произойдет третья ошибказдесь:

For i = 1 To LR
    If InStr(1, celltxt, "CPT") Then
Next i

Вы не можете вложить половину блока If-End If в цикл For-Next, или наоборот, и вы сделали оба.Если вы хотите выполнить итерацию и выполнить If-End If каждую итерацию, вам необходимо указать If-End If в For-Next, например

For i = 1 To LR
    If InStr(1, celltxt, "CPT") Then
    'Is the purpose here to do nothing???
    Else
        With Range("S" & i)
            .Value = Left(.Value, InStr(.Value, " "))
        End With
    End If
Next i

EDIT:

Для технической точности вашей первой ошибкой на самом деле будут разбитые For-Next и If-End If, поскольку вы даже не сможете скомпилировать код для выполнения двух других ошибок.

0 голосов
/ 21 января 2019

Я бы сделал это по-другому.

Учитывая:

  • Ячейкой, которая будет изменена, будет ячейка под ячейкой, которая содержит CPT
    • валгоритм ниже, мы ищем CPT все заглавные буквы и только это содержимое.Легко изменяется, если это не так.
  • Поскольку вы пишете «пятизначный код», нам нужно извлечь только первые пять символов.
  • ЕСЛИ у вас может бытьнекоторые ячейки, которые содержат CPT, где нижняя ячейка не содержит код CPT, тогда мы также должны были бы проверить содержимое ячейки внизу, чтобы увидеть, не выглядел ли он как код CPT.

Поэтому мы просто используем метод Range.Find:

Sub CPT()
    Dim WS As Worksheet, R As Range, C As Range
    Dim sfirstAddress As String

Set WS = Worksheets("sheet4")
With WS.Cells
    Set R = .Find(what:="CPT", LookIn:=xlValues, lookat:=xlWhole, _
                    MatchCase:=True)
    If Not R Is Nothing Then
        sfirstAddress = R.Address
        Set C = R.Offset(1, 0)
        C.Value = Left(C.Value, 5)

        Do
            Set R = .FindNext(R)
            If Not R.Address = sfirstAddress Then
                Set C = R.Offset(1, 0)
                C.Value = Left(C.Value, 5)
            End If
        Loop Until R.Address = sfirstAddress
    End If
End With
End Sub

Если эта последовательность гарантированно будет находиться только в столбце S, мы можем изменить

With WS.Cells

на With WS.Columns(19).Cells

, и это может немного ускорить процесс.

Вы также можете ускорить процесс, добавив отключение ScreenUpdating и Calculation во время выполнения.

0 голосов
/ 21 января 2019

Вы можете просто использовать функцию Mid на листе.Как я понял из вашего вопроса, вам нужно отделить числа и поместить их в другие ячейки, это правда?Для этого вы можете написать эту функцию в ячейке R6 следующим образом = Mid (S6,1,5). Затем нажмите enter и перетащите функцию вниз, и вы увидите, что все ячейки, содержащие цифры и тексты, сохранены в них числами

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