模拟button按下的效果

我有macros分配到矩形形状,到我的工作簿中的下一张表。

我试图添加一个按下和向上矩形的效果。

当我使用这个代码时,矩形只被按下然后下一张被激活,如果我返回到前一张,矩形被释放。

我需要的是矩形被按下,然后释放,然后去到下一张表。

有什么build议么?

提前感谢你。

Dim MyButton As Shape Dim oHeight, oWidth, cHeight, cWidth As Double Dim oTop, oLeft As Long Public Sub PressButton() Set MyButton = ActiveSheet.Shapes(Application.Caller) With MyButton 'Record original button properties. oHeight = .Height oWidth = .Width oTop = .Top oLeft = .Left 'Button Down (Simulate button click). .ScaleHeight 0.9, msoFalse .ScaleWidth 0.9, msoFalse cHeight = .Height cWidth = .Width .Top = oTop + ((oHeight - cHeight) / 2) .Left = oLeft + ((oWidth - cWidth) / 2) End With 'Set MyButton variable to Nothing to free memory. Set MyButton = Nothing End Sub Public Sub ReleaseButton() Set MyButton = ActiveSheet.Shapes(Application.Caller) With MyButton 'Button Up (Set back to original button properties). .Height = oHeight .Width = oWidth .Top = oTop .Left = oLeft End With 'Set MyButton variable to Nothing to free memory. Set MyButton = Nothing End Sub Public Sub NextPage() PressButton Application.Wait (Now + TimeSerial(0, 0, 1)) ReleaseButton Dim ws As Worksheet Set ws = ActiveSheet Do While Not ws.Next.Visible = xlSheetVisible Set ws = ws.Next Loop With ws.Next .Activate .Range("A1").Select End With End Sub 

你最好使用“命令button”:形状和矩形对象并不真正支持你需要的事件驱动的“点击”function:调用一个相关的macros几乎是他们所做的一切。

但是,当你的界面(在64位环境下对ActiveX命令button的支持非常差),你可能会被困在那个形状中,所以这里…

背景:如何使button看起来像一个button:

大多数形状具有“阴影”属性,并且由45度angular(从左上angular)的光源投射的外部阴影产生“凸起”效果。 相反,从相反angular度投射的内部阴影(来自右下angular的光源)会产生“凹陷”的效果。

在实践中,两者的内部阴影是足够好的:只是改变angular度。

在VBA中,用于形状阴影的光源的“angular度”以X和Y偏移量给出,45度对应于1.14142:

 Dim oShape As Excel.Shape
 Dim oShadow As Excel.ShadowFormat 
设置oShape = ActiveSheet.Shapes(i) 设置oShadow = oShape.Shadow
“从45度以上的光线投射出来的”暗影“暗影: oShadow.OffsetX = Sqr(2) oShadow.OffsetY = Sqr(2)
“阴影从右上方的光线投射到零下45度,产生”凹陷“的效果: oShadow.OffsetX = -Sqr(2) oShadow.OffsetY = -Sqr(2)

…这是您的点击“上”的代码,并单击“下”button状态。

我强烈build议您使用内置的对话框设置形状的填充颜色和阴影的大小,透明度和模糊。 为了便于参考,下面列出了我用于智能“半平”浅灰色button的设置 – 但我不build议您将它们设置为VBA代码,因为这些格式不会按照您期望的顺序应用,该button看起来不像您可以使用UI对话框创build的“干净”形状:

  “浅灰色的button,稍微有点”软化“的边框
     oShape.Fill.ForeColor.RGB =&HD8D8D8
     oShape.Line.ForeColor.RGB =&HC0C0C0
     oShape.Line.Weight = 2
     oShape.Line.Transparency = 0.75 
'使用形状的阴影来给出'凸起button'的效果: oShadow.Style = msoShadowStyleInnerShadow oShadow.Visible = True oShadow.Blur = 2 oShadow.Size = 100 oShadow.Transparency = 0.5
“从45度以上的光线投射出来的”暗影“暗影: oShadow.OffsetX = Sqr(2) oShadow.OffsetY = Sqr(2)

你也可以使用3D效果对话框,但是这对大多数形状(包括你的矩形)的“凿子”效果起作用:我没有find任何预定义的“凸起”或“凹陷”三维形状的形状。

主要编辑:

猜猜在64位Office卷展栏出现之前,所有战术电子表格工具中的所有 Active-X控件button都将被replace,从而导致它们无法运行?

所以你的问题确实变得非常非常有趣。 以下是我正在做的事情:

通用“button单击”代码使用Excel“Shape”对象调用VBAmacros而不是ActiveX控件。

这是我使用的而不是ActiveXbutton:文本标签,矩形和图像,使用function区上的“插入”菜单放置在工作表中。

这些对象都是Excel的“形状”,它们都可以与一个已命名的macros相关联,并且具有共同的“阴影”效果,可以用作“凸起button”3D效果。

下面的例子是一个函数调用从一个图像(这是一个数据库的32 * 32图标,带问号)embedded工作表上的形状。 我给了这个ersatz控制button一个有意义的名字,我命名macros[Name]_Click() ,因为我正在replace现有的“Click”事件过程。

所以这个macros是一个用代码名称标识的工作表上的公共子程序,用户可以重命名工作表,改变用户可读的标签,但是他们不会重命名底层的VBA类模块 – 它可以看作是MySheetCodeName.img_TestDefaultDSN_Click()当您右键单击该形状时,在“分配macros”列表中的MySheetCodeName.img_TestDefaultDSN_Click()

..这就是为什么它是公共的(不是私人的,因为ActiveX控件的自动创build的事件过程存根将是):私人潜艇在“分配macros”列表中不可见。

 Public Sub img_TestDefaultDSN_Click() 
ClickDown Me.Shapes(“img_TestDefaultDB”) ShowDBStatus“EOD_Reports_DSN” ClickUp Me.Shapes(“img_TestDefaultDB”)
结束小组

这将在常规的代码模块中调用一对通用的“点击”和“点击”子例程:

公用函数ClickDown(objShape As Excel.Shape)
在错误恢复下一步 
'重新从右下angular到左上angular的button阴影: 与objShape.Shadow .Visible = msoFalse .OffsetX = -1.2 .OffsetY = -1.2 .Visible = msoTrue .Bur = 1 .Size = 99 。透明度= 0.75 .Style = msoShadowStyleInnerShadow .Obscured = msoFalse 结束
“稍微改变button的脸部: 如果objShape.Type = msoPicture那么 用objShape.PictureFormat 。亮度=。亮度 - 0.01 结束 其他 用objShape.Fill .Visible = msoTrue .ForeColor.Brightness = .ForeColor.Brightness - 0.01 结束 万一
结束function

公共函数ClickUp(objShape As Excel.Shape) 在错误恢复下一步
'将button面恢复为默认亮度: 与objShape.Shadow .Visible = msoFalse .OffsetX = 1.2 .OffsetY = 1.2 .Visible = msoTrue .Bur = 1 .Size = 99 。透明度= 0.75 .Style = msoShadowStyleInnerShadow .Obscured = msoFalse 结束
'将button阴影恢复到右下angular: 如果objShape.Type = msoPicture那么 用objShape.PictureFormat 亮度=。亮度+0.01 结束 其他 用objShape.Fill .Visible = msoTrue .ForeColor.Brightness = .ForeColor.Brightness + 0.01 结束 万一
结束function

您可能对“控制button”的外观有自己的偏好,但这对我很有用。

请注意,如果“点击”立即出现,即使“睡眠”或“应用程序等待”语句将它们分开,也不会看到“点击”效果 – 只有在存在真实代码的情况下,可检测的经过时间或modal dialog。