Excel 2010命令按钮消失

Excel 2010命令按钮消失,excel,button,Excel,Button,我正在开发一个Excel 2010工作簿,采用手动公式计算模式 (文件->选项->公式->工作簿计算->手册) 我在工作表中有一些命令按钮(ActiveX控件),我将它们设置为随单元格移动和调整大小(右键单击按钮->格式控件->属性->随文本移动和调整大小) 这是因为我在某些条件下过滤掉了一些行,并且我希望放置在这些行中的按钮也根据其宿主行的显示模式显示和消失 一切都进行得非常顺利,直到我在某些行(因此按钮)被过滤掉(即未显示)时保存工作表 当我再次打开文件并展开筛选的行时,按钮不会显示。当检查

我正在开发一个Excel 2010工作簿,采用手动公式计算模式

文件
->
选项
->
公式
->
工作簿计算
->
手册

我在工作表中有一些命令按钮(ActiveX控件),我将它们设置为随单元格移动和调整大小(右键单击按钮->格式控件->属性->随文本移动和调整大小)

这是因为我在某些条件下过滤掉了一些行,并且我希望放置在这些行中的按钮也根据其宿主行的显示模式显示和消失

一切都进行得非常顺利,直到我在某些行(因此按钮)被过滤掉(即未显示)时保存工作表

当我再次打开文件并展开筛选的行时,按钮不会显示。当检查它们的属性时,我看到它们的
可见
属性是
,但它们的
高度
是0,当我取消筛选它们的宿主行时,这不会改变

我想再次强调,在保存文件之前,过滤和取消过滤按钮都很有效


非常感谢您的帮助。

好的,我可以使用ActiveX或表单控件获得相同的结果。无论出于何种原因,控件的原始高度似乎不会持续超过保存和关闭

另一个选项是只需清除工作簿的
Close
Save
事件上的自动筛选。但是,如果您希望在保存和重新打开文件时打开某些筛选器,则这可能不是您想要的。可能可以将过滤器参数保存在隐藏的表格中,或者直接操作VBE/VBA,但这似乎是一个很大的麻烦。然后,您可以在重新打开工作簿时重新应用筛选器

下面是我建议的代码

注意:我依赖工作表的
\u Calculate
事件和隐藏的
CountA
公式(设置、更改或清除自动筛选将触发此事件)。我将公式放在E1中,这样你就可以看到它的样子:

由于您的应用程序依赖于
Calculation=xlManual
,因此此方法将不会完全适用于您,但在任何情况下,都可以重新使用子例程
UpdateButtons
。您需要根据需要将其与应用程序中的其他事件或函数绑定

这是密码

Option Explicit
Private Sub UpdateButtons()
'## Assumes one button/shape in each row
'   buttons are named/indexed correctly and
'   the first button appears in A2
Dim rng As Range
Dim shp As Shape
Dim i As Long

Application.EnableEvents = False
'## use this to define the range of your filtered table
Set rng = Range("A1:A6")

'## Iterate the cells, I figure maybe do this backwards but not sure
'   if that would really make a difference.
For i = rng.Rows.Count To 2 Step -1
    Set shp = Nothing
    On Error Resume Next
    Set shp = Me.Shapes(i - 1)
    On Error GoTo 0

    If Not shp Is Nothing Then
        DisplayButton Me.Shapes(i - 1), Range("A" & i)
    End If
Next

Application.EnableEvents = True
End Sub

Private Sub DisplayButton(shp As Shape, r As Range)
    '# This subroutine manipulates the shape's size & location
    shp.Top = r.Top
    shp.TopLeftCell = r.Address
    shp.Height = r.Height
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
MsgBox "_Change"
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
''## Assumes one button/shape in each row
''   buttons are named/indexed correctly and
''   the first button appears in A2
'Dim rng As Range
'Dim shp As Shape
'Dim i As Long
'
''## Uncomment this line if you want an annoying message every time
''MsgBox "Refreshing Command Buttons!"
'
'Application.EnableEvents = False
''## use this to define the range of your filtered table
'Set rng = Range("A1:A6")
'
''## Iterate the cells, I figure maybe do this backwards but not sure
''   if that would really make a difference.
'For i = rng.Rows.Count To 2 Step -1
'    Set shp = Nothing
'    On Error Resume Next
'    Set shp = Me.Shapes(i - 1)
'    On Error GoTo 0
'
'    If Not shp Is Nothing Then
'        DisplayButton Me.Shapes(i - 1), Range("A" & i)
'    End If
'Next
'
'Application.EnableEvents = True

End Sub

有关其他选项的信息,请参见。您可以通过RibbonXML自定义重新使用现有命令。虽然本文面向C#和Visual Studio,但使用CustomUI编辑器也可以做到这一点。

在移除过滤器时,我遇到了类似的按钮消失问题(移动到左上角)

我找到的一个解决方案是在列标题上方添加一行,这样按钮仍会出现在列的顶部,但不会触及放置过滤器的行


添加/删除过滤器会停止干扰按钮的位置。

我遇到过类似的问题,表单按钮似乎工作正常,但在保存并重新打开工作簿后消失。具体来说,当窗体按钮显示部分隐藏行时(使用vba代码完成)

看起来像是一个真正的错误,虽然我不知道链接在哪里


通过将表单按钮更改为ActiveX按钮,按钮不再消失,而是在隐藏行时开始移动/聚集到屏幕顶部。我刚刚添加了一些vba来重新定位按钮(例如CommandButton1.Top=Range(A12:A12)。Top-->将ActiveX命令按钮移动到第12行)。

尝试使用标准表单控件,而不是
ActiveX
控件。我从来没有在
ActiveX
控件方面有过太多的运气,也从来没有遇到过使用它们而不是表单控件的需要。谢谢你,David。我试过了,也得到了同样的结果。是的,我试过后得到了同样的结果。我想我理解为什么会发生这种情况,尽管这似乎是一种错误/意外的行为。可能您可以在
工作簿\u Open
事件中添加一些代码,以恢复每个控件的高度和左上角单元格位置。我也考虑过这个解决方案,但我想一旦我将它们的高度设置为正值,它们都将显示,包括我仍然希望隐藏的控件。我可以想出一个可能的替代方案。你的每个单元格/行只有一个按钮吗?非常感谢你的全面回复,大卫。我感谢你的帮助。然而,我必须承认这有点超出了我的VBA能力。我尝试了另一种方法,通过显式设置相关按钮的“可见”属性。除了在保存文件并重新打开后从一组行中删除筛选之外,这种方法工作得非常好。在这种情况下,按钮位于图纸中的任意高度。所以我放弃了这种方法,删除了所有的按钮,取而代之的是一个跟随用户滚动的悬停按钮。再次感谢!*并用一个跟随用户滚动的悬停按钮替换了它们。*这似乎是一个更好/更干净的方法!