【问题标题】:I can't get Excel to create a new worksheet in a VBA Macro我无法让 Excel 在 VBA 宏中创建新工作表
【发布时间】:2019-06-19 08:44:19
【问题描述】:

我维护了第一个工作表“Master”,其中 A 列是产品代码。 第二个工作表是“模板”。

目标是从 A 列中的单元格值创建新工作表,将数据从模板表复制到新工作表,重命名工作表并创建指向单元格值的超链接,因此如果我单击单元格,它将转到新工作表.

现在它在创建新工作表时出错。其次,当我向 A 列添加更多数据并再次运行宏时,它不会创建新工作表。

Sub CreateAndNameWorksheets()
   Dim c As Range
   Application.ScreenUpdating = False

   For Each c In Sheets("Master").Range("A5:A50")
        Sheets("Template").Copy After:=Sheets(Sheets.Count)
        With c
            ActiveSheet.Name = .Value
            .Parent.Hyperlinks.Add Anchor:=c, Address:="", SubAddress:= _
                "'" & .Text & "'!A1", TextToDisplay:=.Text
        End With
    Next c
    Application.ScreenUpdating = True
End Sub

【问题讨论】:

    标签: vba hyperlink cell worksheet


    【解决方案1】:

    如果您不更改ALLA5:A50 中的数据,您将无法再次运行它。 Excel 要求每个工作表都有一个唯一的名称。但是,您可以做的是在工作表名称已经存在时创建一个错误处理程序,并在循环中跳过该单元格。此外,如果您有一个空白单元格并尝试将工作表名称设置为该单元格,也会出错。

    对于功能性答案,您可以使用类似的东西

    Sub CreateAndNameWorksheets()
    Dim c As Range
    Dim errTest As Worksheet
    Application.ScreenUpdating = False
    
    On Error GoTo eHandler
    
    For Each c In Sheets("Master").Range("A5:A50")
        With c
            Set errTest = Sheets(.Value)
            If .Value <> "" And errTest Is Nothing Then
                Sheets("Template").Copy After:=Sheets(Sheets.Count)
                Sheets(Sheets.Count).Name = .Value
                .Parent.Hyperlinks.Add Anchor:=c, Address:="", SubAddress:= _
                    "'" & .Text & "'!A1", TextToDisplay:=.Text
            End If
        End With
    Next c
    
    Application.ScreenUpdating = True
    Exit Sub
    eHandler:
    If Err.Number = 9 Then
        Set errTest = Nothing
        Resume Next
    Else
        Application.ScreenUpdating = True
        MsgBox Err.Number & vbCrLf & Err.Description
    End If
    End Sub
    

    【讨论】:

    • 在保存 Excel 文档并再次打开并向 A 列添加更多文本时仍然出现错误,错误 1004
    【解决方案2】:

    ...如果您的模板中还没有返回主工作表的超链接,您可以像这样在每个新工作表中添加一个:

    ActiveSheet.Hyperlinks.Add Anchor:=ActiveSheet.Range("A1"), Address:="", SubAddress:= _
        "'Master'!A" & c.Row, TextToDisplay:="Back"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-12
      • 2013-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-20
      相关资源
      最近更新 更多