我需要删除名为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列的代码,或修复我的代码。
答案 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
If
语句中,InStr将返回一个位置或0,因此对> 0
的测试就足够了,不需要<>
,尽管这样可行,但是只是不必要的UCase()
语句中对if
的第二次调用,无需UCase
固定字符串,只需以大写字母提供。同时强>
假设您的数据是矩形的(即,您没有任何没有标题但您不想搜索的列):
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...
才能实际让它遍历该列中的行