在VBA excel中dynamic生成页面的错误

我正在努力处理我的电子表格,它能够根据我们在Excel中使用VBA定期使用的模板dynamic生成自定义数量的工作表。

我已经创build了一个“Overview”页面,我们可以在其中input一系列复制“Master”页面内容的页面名称,然后使用页面名称范围中的值生成命名它们的工作表。

在这里输入图像说明

我的代码做我想要它做的,但我得到一个1004运行时错误(应用程序定义或对象定义的错误) 一个额外的页面生成名为master(2)。

Sub copySheets() Dim MyNames As Range, MyNewSheet As Range Set masterSheet = ThisWorkbook.Worksheets("master") Set MyNames = Range("B7:B31") ' load range into variable For Each MyNewSheet In MyNames.Cells ' loop through cell range masterSheet.Copy ThisWorkbook.Sheets(Sheets.Count) 'copy master template sheet ActiveSheet.Name = MyNewSheet.Value Next MyNewSheet MyNames.Worksheet.Select ' move selection to original sheet End Sub 

在这里输入图像说明

如果我们想循环遍历所有Range("B7:B31")单元格,并且不停止,如果我们发现空单元格,那么我们只需要添加: if MyNewSheet.Value <> "" then .... End If

喜欢这个:

 For Each MyNewSheet In MyNames.Cells ' loop through cell range if MyNewSheet.Value <> "" masterSheet.Copy ThisWorkbook.Sheets(Sheets.Count) 'copy master template sheet ActiveSheet.Name = MyNewSheet.Value End If Next MyNewSheet 

遇到第一个空白/空单元格时,您需要Exit For语句。 发生错误的原因是您试图将空string分配给工作表的.Name属性。

 For Each MyNewSheet In MyNames.Cells ' loop through cell range If MyNewSheet = vbNullString Then Exit For masterSheet.Copy ThisWorkbook.Sheets(Sheets.Count) 'copy master template sheet ActiveSheet.Name = MyNewSheet.Value Next MyNewSheet 

或者,使用Do循环:

 Dim r as Long Dim myNewSheet as String r = 1 MyNewSheet = MyNames.Cells(r).Value Do Until MyNewSheet = vbNullString masterSheet.Copy ThisWorkbook.Sheets(Sheets.Count) 'copy master template sheet ActiveSheet.Name = MyNewSheet r = r + 1 MyNewSheet = MyNames.Cells(r).Value Loop r 

你的MyNames范围似乎并不意味着你的想法。 您似乎认为这意味着B列中的单元格中有一个页面列出的总数,实际上,这意味着列B的整个部分直到第31行。您需要根据非空白的数量定义MyNames在该部分内的单元格,然后在该有限范围内运行其余的函数。

我的假设是,它试图创build一个工作表名称为空值的新工作表,并在这一点上的错误。

确定列B走多远的一种方法是将一个新variables定义为整数,以保存最后包含数据的行号。 就像是:

 dim lastRow as Integer ... lastRow = ActiveSheet.Cells(Rows.Count, 2).End(xlUp).Row ... Set MyNames = Range("B7:B"&lastRow) ...