VBA中动态生成页面的错误优于

时间:2016-01-14 15:24:44

标签: excel vba excel-vba

我正在努力错误处理我的电子表格,该电子表格根据我们在excel中使用VBA定期使用的模板动态生成自定义数量的工作表。

我创建了一个“概述”页面,我们可以输入一系列页面名称来复制“主”页面内容,然后生成工作表,用页面名称范围中的值命名它们。

enter image description here

我的代码执行我想要的操作,但是我得到了1004运行时错误(应用程序定义或对象定义错误) AND 生成一个名为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

enter image description here

3 个答案:

答案 0 :(得分:1)

如果我们要遍历所有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

答案 1 :(得分:0)

遇到第一个空白/空单元格时,您需要Exit For语句。发生错误的原因是您尝试将空字符串分配给工作表的.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

答案 2 :(得分:0)

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

我的假设是它尝试为工作表名称创建一个空值,并在此时创建错误。

确定B列向下走多远的一种方法是将新变量定义为整数,以保存最后包含数据的行号。类似的东西:

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