Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
扩展VBA代码以删除整个工作簿中某些单元格的字符_Vba_Excel - Fatal编程技术网

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

扩展VBA代码以删除整个工作簿中某些单元格的字符,vba,excel,Vba,Excel,我是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(

我是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
这是我想要它做的,但只针对我的活动工作簿。我尝试了几种方法,试图让它循环到所有的工作表,但我没有成功


我非常感谢你的帮助,谢谢

未测试,但应该可以

 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=“字符串有点长”

Left(c.Value),Len(c.Value)-10)=“a string som”
然后

Right(c.Value,Len(c.Value)-7)=“gsom”

右侧的
部分作用于
“字符串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
这将显示
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))


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

Excel作为带公式的工作簿工具确实工作得更好

冒着无法准确回答问题的风险,用从原始工作簿中提取所需信息的公式创建一个新工作簿怎么样

=LEFT(INDIRECT("[Workbook]Sheet1!B1"), LEN(INDIRECT("[Workbook]Sheet1!B1"))-7)
如果可以在字符串参数中计算整个公式引用,则可以提取任何单元格,然后根据需要对其进行处理


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

谢谢,但是-我实际上尝试了这段代码,但由于某些原因,它不起作用。您是否调用了与子例程所在工作簿不同的工作簿?是否使用wb随处可见(即,所有行.范围等应附加.wb).到底发生了什么?它是否给出了一个错误?没有注意到我的答案是相同的。我们都在重复使用OP中的相同代码。因此很难不一致。不管怎样,我已经删除了我的答案,如果这让你觉得被冒犯的话。嘿@sam092,不,不,不,决不是我被冒犯了:)我的观点是每个答案都必须添加一条信息在现有答案中找不到的选项。当然,我相信这是偶然的,无论如何,很难对这个问题给出不同的答案:)@loannis-当我使用这个选项时,会发生什么事情,它一直在B列循环,当它用完字符时,我会得到一个“无效参数”的错误“。我知道这一点,因为当我将代码更改为一次只删除一个字符时,我可以清楚地看到这种情况发生。我在这方面做了很多工作,无法解决这个问题。您的意思是只针对活动工作表:)