扩展VBA代码以删除整个工作簿的某些单元格的字符

我是VBA的超级新手,但是在过去的几天里我一直在努力工作。 我有许多具有相似的结构,有50多张工作簿。 我一直被困在没有我的Excelmacros扩展到整个工作簿。

我需要使用string值从两列的左侧和右侧删除字符。 这里是代码:

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 

这是我想要它做的,但只有我的积极的工作簿。 我尝试了几件事情,试图让它循环到所有表,但我没有成功。

我非常感谢帮助,谢谢!

未经testing,但应该没问题

  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 

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

上面的代码(也是原始发布)只有在左右的第二个参数是非负时才起作用。 如果有负面的观点,就会提出一个错误,比如你所描述的错误。 我不确定你想要提取什么,但最有可能的LeftRight都没有做你想做的事情。

例:

如果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

你可以把它看作是一个expression式:“确保string的长度至less为10,如果不是这样,那么停止,这将停止代码的执行,那么你可以去立即窗口(Ctrl + G或者View-> Immediate Window)并input? c.Value这将显示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))

代码将不会通过一个错误..但在这种情况下,它会抛出一个错误之前,现在将消除整个单词(即返回一个空string)。 我不确定这是否是可取的行为,但让我知道! 🙂

Excel实际上更好地作为具有公式的工作簿工具。

冒着不完全回答这个问题的风险,如何用公式从原始工作簿中提取所需信息来创build一个新的工作簿呢? 然后,通过使用一个公式如

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

在string参数中可以计算整个公式的引用,您可以提取任何单元格,然后根据需要处理它。

作为一个完整的描述性解决scheme,虽然性能可能与VBA解决scheme类似,但不需要其他语言的知识,debugging起来也更容易。