3

我是 VBA 的超级新手,但过去几天我一直在使用它。我有许多具有类似结构的工作簿,有 50 多张。我一直坚持没有让我的 excel 宏扩展到整个工作簿。

我需要从具有字符串值的两列的左侧和右侧删除字符。这是代码:

Sub Trim()

Dim c As Range

 For Each c In Range("B5", Range("B" & 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 Range("C5", Range("C" & Rows.Count).End(xlUp))
 c.Value = Left(c.Value, Len(c.Value) - 16)

 Next c

End Sub

这可以满足我的要求,但仅适用于我的活动工作簿。我已经尝试了几件事来尝试让它循环到所有工作表,但我没有成功。

我非常感谢帮助谢谢!

4

2 回答 2

0

未经测试,但应该没问题

 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

编辑(基于下面的第二条评论)

上面的代码(也是原始发布的)仅在Leftand的第二个参数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.ValueThis 将显示 的值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))

代码不会出现错误。但在以前会抛出错误的情况下,它现在会消除整个单词(即返回一个空字符串)。我不确定这是理想的行为..但请告诉我!:)

于 2013-09-26T22:36:59.530 回答
0

Excel 作为带有公式的工作簿工具确实更有效。

冒着无法准确回答问题的风险,如何使用从原始工作簿中提取所需信息的公式创建一个新工作簿。然后,通过使用公式,例如

=LEFT(INDIRECT("[Workbook]Sheet1!B1"), LEN(INDIRECT("[Workbook]Sheet1!B1"))-7)

如果可以在字符串参数中计算整个公式引用,则可以提取任何单元格,然后根据需要对其进行处理。

作为一个完全描述性的解决方案,虽然性能可能类似于 VBA 解决方案,但它不需要其他语言知识,并且更容易调试。

于 2013-12-22T17:07:39.250 回答