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

时间:2013-09-26 22:21:45

标签: excel vba excel-vba

我是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

这是我想要它做的,但仅限于我的活动工作簿。我已经尝试了几件事来尝试让它循环到所有床单,但我没有成功。

非常感谢帮助谢谢!

2 个答案:

答案 0 :(得分: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

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

上述代码(也是原始发布的代码)仅在LeftRight的第二个参数为非负数时有效。如果存在否定参数,则会引发错误,例如您描述的错误。我不确定您想要提取的是什么,但很可能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

您可以将此视为一个表达式,说明“确保字符串的长度至少为10,如果不是这样,则停止。这将在代码执行时停止执行。然后您可以转到立即窗口(Ctrl + G或View->立即窗口)并键入? 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))

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

答案 1 :(得分:0)

Excel确实更适合作为带公式的工作簿工具。

冒着没有完全回答问题的风险,如何使用从原始工作簿中提取所需信息的公式创建新工作簿。然后,使用诸如

之类的公式
=LEFT(INDIRECT("[Workbook]Sheet1!B1"), LEN(INDIRECT("[Workbook]Sheet1!B1"))-7)

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

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