【问题标题】:Can't Edit Cell Values After Clicking Excel UserForm单击 Excel 用户窗体后无法编辑单元格值
【发布时间】:2015-11-09 23:15:27
【问题描述】:

当我单击用户窗体上的按钮时,它会转到相关工作表(通过 .activate,然后是 End Sub,但我也尝试过 .select),但我无法编辑单元格。但是,当我通过底部窗格正常单击工作表时,我可以再次对其进行编辑。

我还没有找到一个 Excel 日志或进程管理器,所以我看不到哪些宏正在运行或正在加载的数据* 并且可能会影响这一点 - 有人知道我无法找到的可能原因吗使用用户窗体后编辑单元格值?

这是我有问题的按钮的代码(我添加了 Unload Me 部分,希望它能阻止任何额外的 UserForm subs 剩余:

    Private Sub CommandButton1_Click()
    Sheets("2H Campaigns View").Select
    Unload Me
    End Sub

*我们的工作表使用了相当多的外部数据,但如果是这种情况,我认为单击底部窗格进行编辑也不起作用...

我还尝试在单击“卸载我”后立即关闭用户窗体(以及可能运行的宏),但无济于事。

编辑:我在每个子程序的末尾放置了一个打印到单元格功能(在单独的调试表上),以检查单击按钮后是否还有其他人在运行,但它读取按钮 (上面的 sub) 是最后一个运行的 sub。因此可以安全地假设该问题与以下潜艇无关;隔离到按钮子或按钮子的运行对工作簿的设置所做的事情....

此工作表中使用的其他子项(都在 UserForm - cbSector_Change 和 UserForm_initialize 为两个用于分类页面的菜单中绘制工作表名称;一个是另一个的子菜单):

Private Sub cbSector_Change()
If cbSector.Value = "DIST" Then
With cbCampaign
    .RowSource = Worksheets("Master Data").Range("G13").Value
    .ListRows = Worksheets("Master Data").Range("H14").Value
    .Value = Worksheets("Master Data").Range("b16").Value
End With
ElseIf cbSector.Value = "INDU" Then
With cbCampaign
    .RowSource = Worksheets("Master Data").Range("gl7").Value
    .ListRows = Worksheets("Master Data").Range("h17").Value
    .Value = Worksheets("Master Data").Range("b16").Value
End With
ElseIf cbSector.Value = "CS" Then
With cbCampaign
    .RowSource = Worksheets("Master Data").Range("gl8").Value
    .ListRows = Worksheets("Master Data").Range("h18").Value
    .Value = Worksheets("Master Data").Range("b16").Value
End With
End If
End Sub

Private Sub EButton_Click()
ThisWorkbook.Saved = True
ThisWorkbook.Close
End Sub

Private Sub SEButton_Click()
ThisWorkbook.Save
ThisWorkbook.Saved = True
ThisWorkbook.Close
End Sub

Private Sub UserForm_Initialize()

With cbSector
    .RowSource = Worksheets("Master Data").Range("b13").Value
    .ListRows = Worksheets("Master Data").Range("b14").Value
    .Value = Worksheets("Master Data").Range("b12").Value
End With
End Sub
Private Sub cbSelect_Click()

If cbSector.Value = "(none)" Then
    errormsg = "Please Select Sector"
ElseIf cbCampaign.Value = "(none)" Then
    errormsg = "Please Select Campaign"
Else: errormsg = "nothing"
End If

If errormsg = "nothing" Then
      Sheets(cbSector.Value & "_" & cbCampaign.Value).Select
      Unload Me
    Else: MsgBox (errormsg)
End If
End Sub

要启动用户窗体,此代码附加到工作簿中除一张工作表之外的所有工作表上的按钮:

Public SheetSelected As Worksheet
Public errormsg As String
Sub CallUserForm()
nav.Show
End Sub

【问题讨论】:

  • 宏运行后可以选择单元格吗??
  • 是的,但是当我在编辑后点击返回时,它会恢复为原始值。同样,您不能在输入新值后单击顶部/公式栏中的勾号。
  • 为什么我的问题被否决了?我是新来的,所以一些解释会很好。在询问无济于事之前,我进行了彻底的搜索。
  • @DesConlon 我没有对您投反对票,但发现有人会投反对票是可以理解的。您实际上是在要求我们调试我们看不到的代码。我们可以尝试猜测——但何必呢?也许如果您向我们展示相关按钮的代码,它会有所帮助。
  • 已编辑。我很抱歉约翰,但实际上是三行;如果我认为它相关,我最初会包含它。

标签: vba excel userform


【解决方案1】:

这是您在 cmets 中提出的最后一个问题的部分答案(“有什么方法可以破解 vba 中的手动工作表选项卡单击”?)我不知道如何直接执行此操作,但这里是一个丑陋的 hack,它模拟使用 Ctrl+PgUpCtrl+PgDn 键盘快捷键从一个工作表切换到另一个工作表:

Sub PageToSheet(SheetName As String)
    Dim here As Long, there As Long, i As Long

    here = ActiveSheet.Index
    there = Sheets(SheetName).Index
    If here = there Then
        Exit Sub
    ElseIf here < there Then
        For i = 1 To there - here
            Application.SendKeys "^{PGDN}"
        Next i
    Else
        For i = 1 To here - there
            Application.SendKeys "^{PGUP}"
        Next i
    End If
End Sub

当 VBA 编辑器是活动窗口时,这将不起作用。但是,如果您在 Excel 主窗口处于活动状态时启动以下测试子程序,它似乎可以工作:

Sub test()
    Dim s As String
    s = InputBox("Enter name of sheet to go to")
    PageToSheet s
End Sub

最好尝试追踪您看到的错误的来源,甚至尝试将所有数据和代码传输到新工作簿,以确保文件本身没有莫名其妙的损坏(这有时是真正奇怪的行为背后的原因)。仍然——如果你想模拟手册页标签,你可以通过SendKeys

【讨论】:

  • 对于这种情况,解决方法与治愈方法一样有价值!谢谢约翰。
猜你喜欢
  • 2017-08-01
  • 1970-01-01
  • 2013-09-20
  • 2016-11-18
  • 2021-01-03
  • 2016-11-21
  • 1970-01-01
  • 2011-03-18
  • 1970-01-01
相关资源
最近更新 更多