【问题标题】:When using Sheets.Add from a UserForm the new sheet is "connected" to another sheet?从用户窗体使用 Sheets.Add 时,新工作表“连接”到另一个工作表?
【发布时间】:2016-03-01 18:34:09
【问题描述】:

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

通过创建一个新的 Excel 文件,然后添加一个新的用户表单,其中包含以下代码,我已经能够相当容易地重现此问题:

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

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

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

新工作表工作不正确。例如,如果我在新工作表的任何单元格上书写,我会从原始工作表中获取格式。更糟糕的是,如果原始工作表受到保护,我就不能在新工作表上写字(尽管功能区显示它不受保护)。

如果我选择另一个工作表并再次选择新工作表,一切都会恢复正常。难道我做错了什么?如果是错误,有什么解决方法吗?

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

【问题讨论】:

  • 您的示例文件中的问题未出现在 Excel 2010 中。
  • 它发生在 2013 Office Excel 中,带有表单控制命令按钮和形状。在工作表上使用 ActiveX 控件命令按钮不会导致此问题。
  • 我可以用 xl2016 复制初始格式问题 - 但一旦输入文本,编辑模式下的黄色背景就会消失。然而,其他格式(粗体文本等)从第一张表中保留。很有趣。
  • @brettdj 我看到了由该问题引起的不同行为。有时,当您在新工作表中写入时,原始工作表会发生变化,有时您无法使用箭头键在单元格之间移动。
  • 我在 2013 年见过。从模态表单调用 sht.Activate 方法似乎有问题。它使sht 可见但不活动。我记得的唯一解决方法是用 ActiveX 按钮替换表单按钮。

标签: vba excel


【解决方案1】:

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

我能够重现该行为。 我将 ShowModal 更改为 False,并且行为更改为预期的行为。我没有更改任何 VBA 代码。

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

【讨论】:

    【解决方案2】:

    这很好,以前从未见过这样的东西。

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

    我在测试中注意到,如果您运行宏,选择原始工作表,然后重新选择新创建的工作表,格式会恢复正常(如您在问题中所述)。所以我在你的私人订阅的末尾添加了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
    

    以上工作假设您在一个只有一张工作表的工作簿中,即“单击我”按钮所在的位置。

    【讨论】:

    • 嗨,很遗憾,这对我不起作用,因为我需要在宏结束时激活新创建的工作表 =/。但是我现在在想,值得尝试选择一张纸,等待 100 毫秒,然后再选择另一张。
    • 刚试了,等了5秒,没用:(
    【解决方案3】:

    我认为,它以某种方式与 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
    

    这个想法是:关闭旧的用户窗体,新建一个将添加一个工作表的用户窗体。


    编辑#1

    请随时download working example 尝试一下。


    更简单的方法?

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

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

    UserForm1 的代码:

    Private Sub UserForm_Click()
        Unload Me
    End Sub
    

    【讨论】:

    • @lisovaccaro,我在答案中添加了更多细节。请让我知道它是否不适合您以及为什么。谢谢。
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 2020-10-31
      • 2014-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-16
      • 1970-01-01
      相关资源
      最近更新 更多