未经测试,但应该没问题
Sub MyTrim()
' avoid Trim because it is a built-in function!
Dim c As Range, wb As Worksheet
For Each wb In ActiveWorkbook.WorkSheets
For Each c In wb.Range("B5", wb.Range("B" & wb.Rows.Count).End(xlUp))
c.Value = Left(c.Value, Len(c.Value) - 10)
c.Value = Right(c.Value, Len(c.Value) - 7)
Next c
For Each c In wb.Range("C5", wb.Range("C" & wb.Rows.Count).End(xlUp))
c.Value = Left(c.Value, Len(c.Value) - 16)
Next c
Next wb
End Sub
编辑(基于下面的第二条评论)
上面的代码(也是原始发布的)仅在Left
and的第二个参数Right
为非负时才有效。如果存在否定论点,则会引发诸如您描述的错误。我不确定您到底想提取什么,但很可能Left
并且Right
没有做您希望他们做的事情..
例子:
如果c.Value = "a string somewhat long"
那么
Left(c.Value), Len(c.value)-10)="a string som"
接着
Right(c.Value, Len(c.Value)-7) = "g som"
Right
零件作用"a string som"
于。
实际上,您可以在代码失败之前停止代码,并检查它是否执行您想要的操作,如下所示:
在行上方
c.Value = Left(c.Value, Len(c.Value) - 10)
添加行
debug.Assert Len(c.Value) >= 10
并在该行上方c.Value = Right(c.Value, Len(c.Value) - 7)
添加该行
debug.Assert Len(c.Value) >= 7
你可以把它想象成一个表达式,“确保字符串的长度至少为 10,如果不正确则停止。这将在不正确时停止代码执行。然后你可以转到立即窗口(Ctrl+G 或 View-> Immediate Window) 并输入? c.Value
This 将显示 的值c
。最后,当代码停止时,它停止的行标记为黄色。如果要执行以下代码行,请点击F8
. 每次点击F8
,都会执行一行代码。
作为最后的观察,如果你c.Value = Left(c.Value, Len(c.Value) - 10)
改变
c.Value = Left(c.Value, IIf(Len(c.Value) - 10 >= 0, Len(c.Value) - 10, 0))
代码不会出现错误。但在以前会抛出错误的情况下,它现在会消除整个单词(即返回一个空字符串)。我不确定这是理想的行为..但请告诉我!:)