1

我正在以手动公式计算模式开发 Excel 2010 工作簿。

( file-> options-> formulas-> Workbook calculation-> manual)

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

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

一切都很好,直到我在某些行(因此按钮)被过滤掉(即不显示)时保存他的工作表。

当我再次重新打开文件并展开过滤的行时,按钮不显示。检查他们的属性时,我看到他们的visible属性是True,但他们height是 0,当我取消过滤他们的托管行时,这不会改变。

我想再次强调,在保存文件之前 - 过滤和取消过滤按钮都运作良好。

非常感谢这里的任何帮助。

4

3 回答 3

0

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

我发现的一个解决方案是在列标题上方添加一行,以便按钮仍然出现在列的顶部,但不会触及放置过滤器的行。

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

于 2014-04-24T08:51:36.137 回答
0

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

另一种选择是简单地清除工作簿CloseSave事件上的自动筛选。但是,如果您希望在保存并重新打开文件时保留一些过滤器,这可能不是您想要的。可能可以将过滤器参数保存在隐藏表中或通过直接操作 VBE/VBA 来保存,但这似乎比它的价值要麻烦得多。然后,您可以在重新打开工作簿时重新应用过滤器。

这是我建议的代码

注意:我依靠_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 编辑器来完成。

于 2013-11-12T02:53:49.507 回答
0

我有一个类似的问题,表单按钮似乎工作正常,但在保存并重新打开工作簿后消失。具体来说,当表单按钮的一部分隐藏行(使用 vba 代码完成)时,就会发生这种情况。

似乎是一个真正的错误,虽然我不知道链接在哪里。

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

于 2015-08-24T18:37:47.623 回答