我正在编写一个代码,以便在同一工作簿中复制工作表沿着名称范围,然后将该范围提升到工作簿。
下面的代码用于复制工作表
For A = 1 To 8
For B = 1 To 3
Set ws = Sheets(tabnames(A) & B)
ws.Copy After:=Sheets(tabnames(A) & B)
ActiveSheet.Name = tabnames(A) & B + 1
Next B
Next A
附加代码用于将名称范围更改为工作簿:https://stackoverflow.com/a/20054925
代码在第一次运行时运行良好。一旦执行,当我试图重新运行时,程序返回一条错误消息:
名称'XX'已存在。单击“是”以使用该版本的名称,或单击“否”以重命名您正在移动或复制的'XX'版本。
当我手动复制工作表时,同样的消息弹出。让我困惑的是,当我重新打开WB时,同样的代码工作得很好。这意味着每次运行后,我必须关闭并打开WB才能执行下一次运行。有没有解决这个问题的方法?也许像刷新或重置之类的方法?
我尝试冻结显示警报,但随后我注意到名称范围没有与工作表沿着复制。
此外,我还尝试了上述线程中提到的其他代码来提升名称范围,结果也是如此。
此外,它的工作时,我复制倒数第二表(无论是手动或通过下面的代码)
Set ws = Sheets(tabnames(A) & B-1)
ws.Copy After:=Sheets(tabnames(A) & B)
请告知。
3条答案
按热度按时间qcuzuvrc1#
当我复制父工作表时,错误似乎消失了。现在似乎解决了。但如果有人能帮助我弄清楚为什么我不能在不重新启动的情况下创建新的工作表,这将是有帮助的。
bq3bfh9z2#
命名范围的作用域可以是:
如果命名区域是工作簿,则您要将某些数据复制到另一个工作簿中,而该工作簿中存在具有完全相同名称的命名区域。
因此Excel不知道使用哪一个:源数据或目标数据中的一个。这就是为什么它会问一个问题。
如果您同意使用目标命名范围,提示是通过添加以下内容来防止显示任何消息:
应用程序.DisplayAlerts =假
这样你的代码就会变成:
(in您的示例,您也可以将displayAlert移到for块之外以获得更好的速度,但您要冒错过另一条重要消息的风险...)
我想这并不理想,但这是我到目前为止找到的最好的...
祝你好运
mrwjdhj33#
创建工作表副本时,也会创建工作表中命名区域的副本。由于它们是工作簿范围内的名称,因此是重复的,因此无法复制。与其在同一工作簿中复制工作表,不如将其复制到新工作簿,更改名称,然后将其复制回原始工作簿。