【问题标题】:Sheet.Activate changes sheet but continues to edit data on previous sheetSheet.Activate 更改工作表,但继续编辑上一张工作表上的数据
【发布时间】:2015-01-14 21:27:58
【问题描述】:

我有一个带有几个按钮的对话框,它们可以启动宏来激活并更改为不同的工作表。

我遇到的问题是在我单击按钮后,宏激活了新工作表并且我看到了它。但是当我去删除数据,添加数据或尝试删除一行“什么都没有发生”时,屏幕上的数据仍然存在。如果我回到上一张工作表,我打算删除的单元格和行在该工作表中被删除。这是非常奇怪的,从来没有见过这样的东西。看来,我的宏代码足以说明实际更改为新工作表。如果我单击不同的工作表选项卡来更改它,我没有这个问题。或者,如果我单击对话框按钮转到新工作表并快速执行 ctrl-pgDown 和 Ctrl-PgUp 以从另一个选项卡更改并返回,这似乎可以解决问题。

这是我用来尝试切换到所需选项卡的宏中的代码。

Private Sub Report1Button_Click()
On Error GoTo Handler
Sheets("Report1").Activate
If StayOpenBox.Value = False Then
    Unload MainMenu
End If
Exit Sub
Handler:
MsgBox "Sheet 'Report1' not found or renamed"
End Sub

感谢您的帮助或建议

更新:

这是我用来调用对话框的代码。我在另一张纸上有一个形状,该形状分配给此宏以打开对话框

Sub ShowMainMenu()

With UserForm1
  .Show
End With
End Sub

此外,没有进一步的代码可以对新工作表进行编辑。我的按钮单击只是切换到另一张纸,当我尝试手动进行编辑时,它们实际上是在上一张纸上完成的,这不是我目前正在查看的。因此,我所做的任何事情,粗体文本、删除文本、删除行等,都没有在我正在查看的当前工作表上完成,但是当我返回上一个工作表时,那里所做的更改。我在 Excel 2013 上,我已经在 2 个单独的文件中重现了这个问题,但我会在不同的计算机和旧版本的 excel 上尝试。我的情况截图如下。

更新 2: 我在带有 Xls 2007 的第二台计算机上运行了这个 xlsm 文件,但没有遇到问题。所以我在第三台也有 Excel 2013 的计算机上运行了宏,它遇到了同样的问题。所以它不是特定于计算机的,似乎是 XLS 2013 中的问题,但不是 XLS 2007 中的问题。我会尝试找到一台带有 Excel 2010 的计算机进行测试,但是关于此代码的某些内容在 2013 年导致了问题,但在旧版本的 excel。

【问题讨论】:

  • 以下两个答案都有意义,都没有解决我的问题。 VBA 代码确实正确激活了正确的工作表并对该工作表进行了 excel 更改。但是当我尝试编辑时,它会继续编辑上一张表。我发现如果我直接运行宏或将宏分配给形状,Excel 将激活正确的工作表,我不会有编辑问题。但是我已将宏分配给命令 button_click,出于某种原因,这似乎是问题的一部分。
  • 必须有更多代码才能触发 UserForm MainMenu。 Report1Button_Click 在 MainMenu 上不是吗?您是否还可以发布对 Report1 进行更改的代码,因为所有发布的代码都会激活它,然后可能是 Unload MainMenu?
  • @user1825774 是的,我们需要将您的代码视为对原始帖子的编辑。
  • 我创建了一个功能区自定义,它运行用于工作表激活的宏代码,之后编辑新工作表没有问题。当对话框中的按钮激活工作表时存在问题,并且仅在 Excel 2013 中,Excel 2007 没有问题。

标签: vba excel excel-2013


【解决方案1】:

当您运行VBA 代码时,如果您未定义工作表,它将默认使用ActiveSheet。当您有要在特定工作表上执行的对象/方法时,您应该始终指定!您可以通过以下两种方式之一进行操作:

Sheets("Report1").[Object].[Method]
'or
Sheets("Report1").[Method]

或者您可以将工作表名称传递给变量并将其用于更短的代码

Dim Report1 As Worksheet
Set Report1 = Sheets("Report1")
Report1.[Object].[Method]
'or
Report1.[Method]

【讨论】:

    【解决方案2】:

    尝试更改代码中的行顺序。我遇到了类似的情况,结果我在将数据从 sheet1 复制到 sheet2 的命令之间插入了“删除工作表”代码。当我在完成复制工作表后放置删除行(命令)时,一切都开始正常工作。许多命令在执行时会激活一张纸,这会立即停用另一张纸。因此,如果您在某处使用“ActiveSheet”命令可能会被错误地理解 - 该命令可能不是在您想要的工作表上执行的。

    【讨论】:

      【解决方案3】:

      只需使用您尝试操作的范围的完整地址,例如,而不是:

      Sheets("mySheet").Activate
      Range("A1:B10").Cut
      Sheets("myOtherSheet").Activate
      Range("A1:B10").Paste
      

      使用:

      Sheets("mySheet").Range("A1:A10").Cut Destination:=Sheets("myOtherSheet").Range("A1:B10")
      

      【讨论】:

        【解决方案4】:

        我刚刚遇到了同样的问题,Excel 2013 也是如此。因此,即使该线程已超过 9 个月处于非活动状态,我也想分享我的解决方案,以防有人通过 Google 搜索到达这里。

        解决方案非常简单。调用用户表单:

        UserForm1.show vbModeless
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-09-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-05-01
          • 2017-09-13
          • 1970-01-01
          相关资源
          最近更新 更多