需要在我的代码中排除一个单词(或字符数)

时间:2019-01-21 20:19:26

标签: excel vba

我正在尝试创建一个模块,该模块将为我的团队格式化Excel电子表格。一栏将包含单词“ CPT”和各种带有说明的CPT代码。 我需要删除5位数CPT代码之后的所有文本(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 :(得分:0)

您的第一个错误将在这里发生:

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

因为您正尝试从.End(xlUp)的{​​{1}}开始的最近使用范围中检索文本,这大约是Excel中行限制的58倍。您可以将Range("S61048576")更改为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 For-Next,因为您甚至无法编译执行代码,以碰到另外两个错误。

答案 1 :(得分:0)

我会做不同的事情。

给出:

  • 要修改的单元格将是包含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来加快速度。

答案 2 :(得分:-1)

您可以简单地在工作表中使用Mid函数。 从您的问题中我了解到,您需要将数字分开并将其放在其他单元格中,这是真的吗? 为此,您可以像这样在单元格R6中编写此函数 =中(S6,1,5) 然后按Enter键并向下拖动该功能,您会发现所有包含数字和文本的单元格中都保留了数字