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

时间:2016-03-01 18:34:10

标签: excel vba excel-vba

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

我能够通过创建一个新的Excel文件,然后在其中添加一个包含此代码的新用户表单,轻松地重现此问题:

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

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

enter image description here

然后我双击用户表单,问题已经发生。

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

enter image description here

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

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

4 个答案:

答案 0 :(得分:3)

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

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

我从MS Office Professional运行64位Excel 2013。

答案 1 :(得分:0)

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

解决方法

添加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并尝试一下。

更简单的方式?

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

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

UserForm1的代码:

Private Sub UserForm_Click()
    Unload Me
End Sub

答案 2 :(得分:0)

这是一个很好的,从未见过像以前那样。

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

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

我还尝试Sheets(2).Select后跟Sheets(1).Select,但它无法正常工作(Sheets(1)是新创建的工作表。)

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

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

上述工作假设您只有一张工作簿,这是“Click Me”按钮所在的位置。

答案 3 :(得分:0)

虽然这不会影响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