无法在Excel中更改形状的颜色

时间:2019-10-07 09:13:21

标签: excel vba colors

VBA菜鸟在这里。 我正在开发一个使用我的客户端中的外部dll的工作簿。 在工作表中,我有一个按钮,当按下该按钮时,它会启动一个使形状变为橙色的例程,然后调用API,最后使该形状变为黑色。

奇迹般地,它仅在“几次”下起作用。

以下代码位于模块的子目录中:

Dim shapeToFlash As String
shapeToFlash = "SHAPE " & sheetName
Worksheets("GTE HOME").Shapes(shapeToFlash).Fill.ForeColor.SchemeColor = 53
Worksheets("HOME").Shapes(shapeToFlash).Fill.ForeColor.SchemeColor = 53

// API CALL (kind of long operation ~ 3/4 seconds)

Worksheets("GTE HOME").Shapes(shapeToFlash).Fill.ForeColor.SchemeColor = 0
Worksheets("HOME").Shapes(shapeToFlash).Fill.ForeColor.SchemeColor = 0

我无法分享有关API的详细信息。我只是用传统的sintax声明:

#If Win64 Then
Private Declare PtrSafe Function IMB_set_value _
    Lib "path/API.dll" () As Long

#Else
Private Declare Function IMB_set_value _
    Lib "path/API.dll" () As Long

并且完美运行。

问题在于第一个 SchemeColor (至53)无法正常工作,这意味着该API已被调用,第二个SchemeColor也已被调用(形状变为黑色)。为了进行测试,我尝试将第二个 SchemeColor (注释为0)注释,在这种情况下,在调用API之后,形状变为橙色!这建议我Excel为要执行的命令创建一种优先级队列,并且在第一个 SchemeColor 之前执行API调用:这显然弄乱了我的流程。有没有一种方法可以强制Excel立即执行操作?失败还有其他原因吗?

P.S .:我已经分别执行了代码的前SchemeColor行,并且运行良好,因此我认为代码是正确的。 P.P.S .:我也尝试使用RGB代替SchemeColor,结果相同。

1 个答案:

答案 0 :(得分:1)

尝试一下

Sub InitiateLongRunningOperation()
    Dim Argument as String

    HighlightShape
    Argument = "Argument Value"        
    Application.OnTime Now, "'LongRunningOperation """ & Argument & """'"
End Sub

Sub HighlightShape()
    Worksheets(1).Shapes(1).Fill.ForeColor.SchemeColor = 53
End Sub

Sub LongRunningOperation(AnArgument As String)
    Debug.Print AnArgument
    ' Replace the line below with your API call
    Application.Wait Now + TimeValue("0:00:03")

    Application.OnTime Now, "ResetShape"
End Sub

Sub ResetShape()
    Worksheets(1).Shapes(1).Fill.ForeColor.SchemeColor = 0
End Sub

它与Application.OnTime一起启动事件链,而无需等待所有事件都结束才更新。 我已经对您的一些代码进行了更改,以使其更易于重现,但我认为您将能够非常轻松地遵循它。