删除单元格中的最后两个字符

时间:2015-03-20 16:40:44

标签: excel vba excel-vba

我需要删除名为Target的工作表中找到的所有单元格的最后两个字符,其中列名为Order(BD列)。

下面的这个宏会在第1行工作表目标中查找单词orders。然后它会删除最后两个字符(字符串)。

然而,由于我是新手并且从两个不同的来源获得这些宏,我可能会搞砸分配变量。

Sub RemoveOrdersTT()
  Dim ws As Worksheet
  Dim rng As Range
  Dim lastCol As Long
  Dim i As Long

  Set ws = Worksheets("Target")
  With ws
     lastCol = .UsedRange.Columns.Count
      For i = 1 To lastCol
       If InStr(1, UCase(.Cells(1, i).Value), "Orders") > 0 Then
         .Cells(1, i).Value = Left(.Cells(1, i).Value, Len(.Cells(1, i).Value) - 2)
        End If
      Next i
  End With
End Sub

将会非常感谢从第2行开始查看工作表Target和BD列的代码,或修复我的代码。

1 个答案:

答案 0 :(得分:1)

更改内部if:

If InStr(1, UCase(.Cells(1, i).Value), "ORDER") > 0 Then
  .cells(1,i).value = left(.cells(1,i).value, Len(.cells(1,i).value) -2)
End If
  1. InStr需要3个参数(加上一些可选参数),你错过了第一个parm告诉它从哪里开始寻找
  2. If语句中,InStr将返回一个位置或0,因此对> 0的测试就足够了,不需要<>,尽管这样可行,但是只是不必要的
  3. 删除UCase()语句中对if的第二次调用,无需UCase固定字符串,只需以大写字母提供。
  4. 无需尝试创建另一个范围对象并修改它,您已经拥有了所需的单元格。
  5. 同时

    假设您的数据是矩形的(即,您没有任何没有标题但您不想搜索的列):

    LastCol = .UsedRange.Columns.Count
    

    更容易找出正在使用的列数,并且不需要在工作表上移动活动单元格。

    完整代码

    Sub RemoveOrdersTT()
      Dim ws As Worksheet
      Dim rng As Range
      Dim lastCol As Long
      Dim i As Long
      Dim r as long
    
      Set ws = Worksheets("Target")
      With ws
         lastCol = .UsedRange.Columns.Count
          For i = 1 To lastCol
           If InStr(1, UCase(.Cells(1, i).Value), "Orders") > 0 Then
             for r = 2 to .usedRange.Rows.Count
               .Cells(r, i).Value = Left(.Cells(r, i).Value, Len(.Cells(r,i).Value) - 2)
             next
            End If
          Next i
      End With
    End Sub
    

    必须添加内部循环For r...才能实际让它遍历该列中的行