我是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
这是我想要它做的,但仅限于我的活动工作簿。我已经尝试了几件事来尝试让它循环到所有床单,但我没有成功。
非常感谢帮助谢谢!
答案 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
编辑(基于下面的第二条评论)
上述代码(也是原始发布的代码)仅在Left
和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->立即窗口)并键入? 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解决方案,但它不需要其他语言的知识,而且更容易调试。