首页 文章

从UserForm使用Sheets.Add时,新工作表是“连接”到另一个工作表?

提问于
浏览
11

从UserForm向工作簿添加新工作表时遇到问题 . 基本上每当我添加新工作表时,它似乎都链接到同一工作簿中的另一个工作表 .

我已经能够通过创建一个新的Excel文件,然后添加一个带有此代码的新用户窗体,相当容易地重现这个问题:

Private Sub UserForm_Click()
    Sheets.Add
    Call Unload(Me)
End Sub

如果我从这样的表单打开用户表单:

enter image description here

然后我双击userform,问题已经发生 .

新工作表工作不正常 . 例如,如果我在新工作表的任何单元格上书写,我将从原始工作表中获取格式 . 更糟糕的是,如果原始工作表受到保护,我不允许在新工作表上书写(虽然功能区显示它没有受到保护) .

enter image description here

如果我选择另一张纸并再次选择新纸张,则一切都恢复正常 . 难道我做错了什么?如果它是一个错误,有任何解决方法吗?

这是一个产生错误的Excel文件:Drive.google.com

4 回答

  • 0

    在Userform1的属性中,将ShowModal更改为False .

    我能够重新产生这种行为 . 我将ShowModal更改为False,行为更改为预期的行为 . 我没有对任何VBA代码进行任何更改 .

    我正在从MS Office Professional运行64位Excel 2013 .

  • 0

    这是一个很好的,以前从未见过这样的东西 .

    我能够复制您的错误并提出解决方法,但它可能不是您正在寻找的 .

    我在测试中注意到,如果您运行宏,选择原始工作表,然后重新选择新创建的工作表,格式化将恢复正常(如您在问题中所述) . 所以我在 Sheets(2).Select 添加到你的私人潜艇的末尾 . 然后,当我选择新工作表时,这是正常的格式 .

    我也尝试了 Sheets(2).Select ,然后是 Sheets(1).Select ,但它不起作用( Sheets(1) 是新创建的工作表) .

    非常离奇的问题!希望这对您有用(可能需要调整 Sheets(2) 以匹配原始工作表的名称或位置),并且在原始工作表上的结尾是可以的 .

    Private Sub UserForm_Click()
        Sheets.Add
        Call Unload(Me)
        Sheets(2).Select
    End Sub
    

    上面的工作假设您在一个只有1张工作簿的工作簿中,这是"Click Me"按钮所在的位置 .

  • 0

    我认为,它以某种方式与ShowModal属性相关联,可能是一些bug .

    Workaround

    添加UserForm2,将其ShowModal属性设置为 false ,编辑代码 .

    UserForm1的代码:

    Private Sub UserForm_Click()
    
        Unload Me
    
    End Sub
    
    Private Sub UserForm_Terminate()
        UserForm2.Show
    End Sub
    

    UserForm2的代码:

    Private Sub UserForm_Activate()
        Sheets.Add
        Unload Me
        End
    End Sub
    

    这个想法是:关闭旧的UserForm,创建一个将添加工作表的新用户 .


    编辑#1

    随意download working example并尝试一下 .


    More simple way?

    我还注意到,当userForm1终止时,Module1中的代码继续运行 . 那么为什么不在那里添加新表呢? module1的代码是:

    Sub ShowForm()
        UserForm1.Show
        Sheets.Add
    End Sub
    

    和UserForm1的代码:

    Private Sub UserForm_Click()
        Unload Me
    End Sub
    
  • 3

    虽然这不会影响Excel 2010,但请尝试这种不同的方法 .

    注意:如果仍然发生,您可能需要增加时间 .

    在您的用户窗体中,添加:

    Option Explicit
    
    Private Sub UserForm_Click()
        AddWorksheetTask 1 ' invokes task to Delay 1 second
        Unload Me
    End Sub
    

    然后在普通模块中添加:

    Option Explicit
    
    Sub AddWorksheetTask(Seconds As Integer)
        Application.OnTime Now + TimeSerial(0, 0, Seconds), "AddWorkSheet"
    End Sub
    
    Sub AddWorksheet()
        If UserForm1.Visible Then ' <-- Change to your Form name
            AddWorksheetTask 1 ' Reschedule task for next second
        Else
            Sheets.Add
        End If
    End Sub
    

相关问题