【问题标题】:Flash colour in entire Excel window整个 Excel 窗口中的闪烁颜色
【发布时间】:2017-05-09 01:49:21
【问题描述】:

我正在尝试创建一个宏,以便在用户打开工作簿时根据一些描述工作簿状态的条件来闪现视觉提示。

我想做的是用不影响单元格格式或任何内容的颜色填充整个屏幕/单元格区域/excel边框主题(这只​​是暂时的)。 我目前的做法是制作一个形状来填充屏幕并根据需要更改其填充颜色。

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
'allows for pauses in the millisecond range

Sub Flash_routine()
    Dim FillCol As Long
    FillCol = RGB(255, 186, 49)

        ActiveSheet.Shapes.AddShape(msoShapeRectangle, 0, 0, 2000, 1000).Select
    For x = 1 To 2 'phase ie. lightingup, empty
        If x = 1 Then
            IncVal = 0.5
        Else
            IncVal = 0.05
        End If

        For i = 0 To 1 Step IncVal
            With Selection.ShapeRange.Fill
                .Visible = msoTrue
                .ForeColor.RGB = FillCol
                If x = 1 Then
                    .Transparency = 1 - i
                Else
                    .Transparency = i
                End If
                .Solid
            End With
            Sleep 50
            'dictates time between successive shape fills
            ActiveWindow.SmallScroll down:=3
            ActiveWindow.SmallScroll up:=3
            'refreshes screen view

        Next i
    Next x

        Selection.Delete
End Sub

宏被 workbook_open 事件调用

但是有一些问题我希望得到帮助;

  • 首先,这是正确的方法还是有一些我不知道的屏幕色调应用程序?

  • 假设是 - 我的形状没有填满屏幕。我的印象是AddShape(msoShapeRectangle, 0, 0, 2000, 1000) 会将我的形状放在左上角 (0,0) 但实际上它被放置在稍微向下的位置(第 1 列,从我的窗口当前查看的位置向下 3 行,例如。如果我m看着F13:X55,它的顶角放在F16,对象覆盖了其余的单元格,但没有覆盖前3行)

  • 如何引用形状?我不知道怎么做,所以我将其保留为 Selection.ShapeRange.Fill,但我知道选择是糟糕的 VBA 实践
  • 最后,滚动是更新窗口视图的最佳方式吗?出于某种原因,它有时甚至不起作用,整个宏运行时我看不到任何东西

我知道这是很多小问题,如果需要完全不同的方法,它们甚至可能不相关!此外,如果将 excel 主题从绿色更改为新颜色并逐渐变回是可能的,那将非常时髦。感谢您为新生儿 VBAer 提供解决方案或任何一般提示!

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    我相信您正在寻找这样的形状控件:

    更新:现在使用您的代码和 Sleep 函数...这对我有用,非常棒!

    Sub Flash_routine()
    Dim FillCol As Long
    FillCol = RGB(255, 186, 49)
    
    Dim w As Worksheet
    Set w = ActiveSheet
    Dim s As Shape
    
    Set s = w.Shapes.AddShape(1, 1, 1, 2000, 2000)
    For x = 1 To 2 'phase ie. lightingup, empty
        If x = 1 Then
            IncVal = 0.5
        Else
            IncVal = 0.05
        End If
    
        For i = 0 To 1 Step IncVal
            With s.Fill
                .Visible = msoTrue
                .ForeColor.RGB = FillCol
                If x = 1 Then
                    .Transparency = 1 - i
                Else
                    .Transparency = i
                End If
                .Solid
            End With
            Sleep 50
            'dictates time between successive shape fills
            DoEvents
            DoEvents
            'refreshes screen view
    
        Next i
    Next x
    
        s.Delete
    End Sub
    

    显然只是它的工作原理的概述,首先我定义s As Shape,然后在Set s 中创建形状,以便您稍后可以参考s 对其进行修改。

    试一试,随时回来。在满足计时器/条件后,您可以使用s.Delete 删除形状。

    使用 2 个 DoEvents(出于某种原因,它只对我使用其中的 2 个)强制屏幕更新显示您的更改而无需滚动。

    我用过Application.Wait,因为我更熟悉它。

    仅供参考 - 矩形是 1 号形状,因此可以省去完整输入的麻烦。我将形状 1 点放在水平和垂直位置,以使其位于工作表的第一个点。我不确定您是否可以进行全屏着色,但如果需要,您可能会影响形状的不透明度

    【讨论】:

    • 仍然得到 3 缺失的行,我认为它可能归结为 3 的滚动
    • 啊,刚看到你的更新,我会尝试做事件,看看我是否仍然得到空白行
    • 哈哈,没问题,祝你好运。我很累,所以不得不编辑,因为我在发布答案后看到了你的其他问题......哎呀。如果您需要,我很乐意多尝试一下,因为我目前没有大量工作。
    • @Greedo 使用您的代码更新了我的答案。让我知道它是否是您正在寻找的东西,因为它会在我的屏幕上很好地淡出
    • 是的,Do Events 代替滚动解决了 3 行缺失问题。还有S.Line.Visible = msoFalse在with循环之后摆脱边框(更好地取出for...next,因为这只会减慢我认为的执行速度(与设置填充颜色相同))感谢修改后的代码,虽然也可以为 excel 主题着色...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-23
    • 1970-01-01
    • 2015-08-29
    • 2014-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多