图片/表格工具不显示在Excel的功能区上

图片/表格工具不显示在Excel的功能区上,excel,vba,userform,Excel,Vba,Userform,我有一张包含图片和表格的工作表。我还有一个UserForm,充当倒计时计时器。UserForm包含以下代码段: Option Explicit Const AllowedTime As Double = 10 ' Total time in minutes Private Sub UserForm_Activate() Dim T, E, M, S As Double T = Timer Do E = CDbl(Time) * 24 * 60 * 60 - T M = A

我有一张包含图片和表格的工作表。我还有一个UserForm,充当倒计时计时器。UserForm包含以下代码段:

Option Explicit
Const AllowedTime As Double = 10 ' Total time in minutes

Private Sub UserForm_Activate()

Dim T, E, M, S As Double

T = Timer

Do
    E = CDbl(Time) * 24 * 60 * 60 - T
    M = AllowedTime - 1 - Int(E / 60)
    S = 59 - Round((E / 60 - Int(E / 60)) * 60, 0)
    
    TimeLabel.Caption = Format(CStr(M), "00") & ":" & Format(CStr(S), "00")
    
    DoEvents
Loop Until (Timer - T) / 60 >= AllowedTime   

MsgBox "Time Over!"
Unload Me

End Sub
上面的代码不是我的。我在Excel论坛上找到了它。它只显示10分钟的倒计时,当时间用完时,userform将卸载

问题在于,当userform运行时,当我单击工作表中的图片或表格时,通常显示在功能区上的图片工具/表格工具不会出现。我插入了一个图表,图表工具也没有出现


我发现,当我通过注释上面的计时器代码来运行userform时,一切都运行得很好。我试着在3台不同的电脑上打开Excel文件,结果都显示出同样的问题。计时器代码有什么问题吗?

这是由于
Do循环造成的。它不仅限于
图片工具/表格工具
,还限于其他菜单,如
数据透视表工具

下面是一个复制您的问题的示例。循环运行时,菜单将不显示。将此代码粘贴到模块中

Option Explicit

Sub Sample()
    Dim loopCount As Long
    
    Do
        loopCount = loopCount + 1
        
        '~~> Wait for 1 second
        Wait 1
        
        If loopCount > 15 Then Exit Sub
    Loop
End Sub

Private Sub Wait(ByVal nSec As Long)
    nSec = nSec + Timer
    While nSec > Timer
        DoEvents
    Wend
End Sub
您可以使用
Application.OnTime
来显示计时器,而不是使用循环。这里有一个例子。顺便说一句,VBA中也有处理计时器的API

小心

在使用或测试计时器之前,请备份数据或使用新工作簿

用户表单代码:

插入一个新的用户表单。让我们称之为
frmTimer
。在上面贴上一个标签。让我们称之为
TimeLabel
。现在将此代码粘贴到userform中

Option Explicit

Dim nextMoment As Date

Private Sub UserForm_Activate()
    Timer_Event
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    Timer_Stop
End Sub

Sub Timer_Event()
    nextMoment = Now + TimeValue("00:00:01")
    Application.OnTime nextMoment, "Module1.OnTimer"
End Sub

Sub Timer_Stop()
    Application.OnTime nextMoment, "Module1.OnTimer", Schedule:=False
End Sub

Public Sub OnTimer()
    TimeLabel.Caption = Time
    Timer_Event
End Sub
模块代码:

插入一个模块。让我们称之为
Module1
。(如果这是新工作簿,默认情况下应为名称)。将此代码粘贴到那里

Option Explicit

Sub OnTimer()
    frmTimer.OnTimer
End Sub

Sub ShowForm()
    frmTimer.Show vbModeless
End Sub
现在运行
Sub ShowForm()
。你会看到菜单现在并没有消失

在行动中