我正在以手动公式计算模式开发Excel 2010工作簿。
(file
- > options
- > formulas
- > Workbook calculation
- > manual
)
我在工作表中有一些命令按钮(ActiveX控件),我将它们设置为使用单元格移动和调整大小(右键单击按钮 - >格式控件 - >属性 - >移动和文本大小) 。
这是因为我在某些条件下过滤掉了一些行,并且我希望放置在这些行中的按钮也会根据其主机行的显示模式显示和消失。
这一切都很顺利,直到我将某些行(因此按钮)过滤掉(即不显示)时保存了工作表。
当我再次重新打开文件并展开已过滤的行时,按钮不会显示。检查其属性时,我发现他们的visible
属性为True
,但他们的height
为0,当我取消过滤其托管行时,这不会改变。
我想再次强调一下,在保存文件之前 - 过滤和取消过滤按钮效果都很好。
非常感谢这里的任何帮助。
答案 0 :(得分:0)
好的,所以我使用ActiveX或Form Controls获得相同的结果。无论出于何种原因,控件的原始高度似乎不会持续超出save&关。
另一个选项就是简单地清除工作簿的Close
和Save
事件中的自动筛选。但是,如果您希望在保存并重新打开文件时保留一些过滤器,则可能不是您想要的。可能可以将过滤器参数保存在隐藏的工作表中,也可以通过直接操作VBE / VBA来实现,但这似乎比 LOT 更麻烦。然后,您可以在重新打开工作簿时重新应用过滤器。
以下是我建议的代码
注意:我依赖工作表的_Calculate
事件,隐藏CountA
公式(设置,更改或清除AutoFilter会触发此事件)。我把公式放在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
对于其他选项请参阅this article。您可以使用RibbonXML自定义重新使用现有命令。虽然本文面向C#和Visual Studio,但可以使用CustomUI Editor进行。
答案 1 :(得分:0)
当删除过滤器时,我遇到了类似的问题,即按钮消失(在左上角移动)。
我找到的解决方案是在列标题上方添加一行,以便按钮仍显示在列的顶部,但不会触及放置过滤器的行。
添加/删除过滤器会停止干扰按钮'位置。
答案 2 :(得分:0)
我有一个类似的问题,表单按钮似乎工作正常,但保存并重新打开工作簿后消失。具体来说,这发生在表单按钮中隐藏行的一部分(使用vba代码完成)。
看起来像一个真正的错误,虽然我不知道链接在哪里。
通过将表单按钮更改为ActiveX按钮,按钮停止消失,但在隐藏行时开始移动/聚合到屏幕顶部。我刚刚添加了一些vba来重新定位按钮(例如CommandButton1.Top = Range(A12:A12).Top - >将ActiveX命令按钮移动到第12行)。