当其他代码执行时,Excel VBA窗体上的Webbrowser控件中未连续播放Gif

当其他代码执行时,Excel VBA窗体上的Webbrowser控件中未连续播放Gif,excel,forms,vba,webbrowser-control,userform,Excel,Forms,Vba,Webbrowser Control,Userform,我创建了一个表单,用于获取用户凭据、登录公司系统和请求导出。单击“获取导出”按钮时,我会显示gif(旋转的轮子)和文本(首先是启动Internet Explorer实例时的“建立连接”,然后应该更改为“验证用户凭据”)。我遇到的问题是gif在创建/显示后,在整个代码执行过程中没有按照我希望的方式一致地播放 单击前填写表单 用户表单代码: Dim progresslbl As Object, progressbar As Object Dim webBr As Object 'vbNewLine

我创建了一个表单,用于获取用户凭据、登录公司系统和请求导出。单击“获取导出”按钮时,我会显示gif(旋转的轮子)和文本(首先是启动Internet Explorer实例时的“建立连接”,然后应该更改为“验证用户凭据”)。我遇到的问题是gif在创建/显示后,在整个代码执行过程中没有按照我希望的方式一致地播放

单击前填写表单

用户表单代码:

Dim progresslbl As Object, progressbar As Object
Dim webBr As Object
'vbNewLine for linebreak in msgbox
Private Sub GetExports_Click()
    'Call FetchExports
    number = login.number.Text
    username = login.username.Text
    password = login.password.Text
    Label2.Enabled = False
    Label4.Enabled = False
    login.number.Enabled = False
    login.username.Enabled = False
    login.password.Enabled = False

    login.Height = login.Height * 1.02
    Set webBr = login.Controls.Add("Shell.Explorer.2", "x", True)
    With webBr
        .Navigate "C:\Users\Me\Dropbox\Macros\loadspinner.html"
        .Width = 12
        .Height = 12
        .Top = Label4.Top + 30
        .Left = 17.25
        .Visible = True
    End With

    Set progresslbl = login.Controls.Add("Forms.Label.1", "Progress", True)
    With progresslbl
        .Caption = "Establishing Connection"
        .Width = 150
        .Height = 21.75
        .Top = Label4.Top + 31.25
        .Left = 32
        .Visible = True
    End With
    Do While webBr.Busy Or webBr.ReadyState <> READYSTATE_COMPLETE
        DoEvents 'Starts the loadspinner gif
    Loop
    DoEvents

'Call IE instance
Call GetIE
DoEvents
'Wait for system to get successful instance via loop that tests for control and number of tabs

progresslbl.Caption = "Validating User Credentials"

    login.Height = login.Height * 1.04
    Set progressbar = login.Controls.Add("Forms.Label.1", "Progressbar", True)
    With progressbar
        .BackColor = RGB(29, 104, 176)
        .Width = 10 '-> 150 finish
        .Height = 7.75
        .Top = Label4.Top + 47 '280
        .Left = 17.25
        .Visible = True
    End With
    DoEvents

'    Do While progressbar.Width <> 150
'        Application.Wait (Now + TimeValue("0:00:01"))
'        progressbar.Width = progressbar.Width + 5
'        DoEvents
'    Loop

'Proceed with login credentials and wait until we successfully get in (and don't receive popup)

End Sub
点击后形成

场景1:纺车gif直到
GetIE()
完成后才会显示

场景2:纺车gif在首次创建时显示,但即使在
GetIE()
完成后,文本仍停留在“建立连接”状态

我尝试使用中提供的方法,但无法使其工作。也许是因为我在用后期装订

我的问题:

Dim progresslbl As Object, progressbar As Object
Dim webBr As Object
'vbNewLine for linebreak in msgbox
Private Sub GetExports_Click()
    'Call FetchExports
    number = login.number.Text
    username = login.username.Text
    password = login.password.Text
    Label2.Enabled = False
    Label4.Enabled = False
    login.number.Enabled = False
    login.username.Enabled = False
    login.password.Enabled = False

    login.Height = login.Height * 1.02
    Set webBr = login.Controls.Add("Shell.Explorer.2", "x", True)
    With webBr
        .Navigate "C:\Users\Me\Dropbox\Macros\loadspinner.html"
        .Width = 12
        .Height = 12
        .Top = Label4.Top + 30
        .Left = 17.25
        .Visible = True
    End With

    Set progresslbl = login.Controls.Add("Forms.Label.1", "Progress", True)
    With progresslbl
        .Caption = "Establishing Connection"
        .Width = 150
        .Height = 21.75
        .Top = Label4.Top + 31.25
        .Left = 32
        .Visible = True
    End With
    Do While webBr.Busy Or webBr.ReadyState <> READYSTATE_COMPLETE
        DoEvents 'Starts the loadspinner gif
    Loop
    DoEvents

'Call IE instance
Call GetIE
DoEvents
'Wait for system to get successful instance via loop that tests for control and number of tabs

progresslbl.Caption = "Validating User Credentials"

    login.Height = login.Height * 1.04
    Set progressbar = login.Controls.Add("Forms.Label.1", "Progressbar", True)
    With progressbar
        .BackColor = RGB(29, 104, 176)
        .Width = 10 '-> 150 finish
        .Height = 7.75
        .Top = Label4.Top + 47 '280
        .Left = 17.25
        .Visible = True
    End With
    DoEvents

'    Do While progressbar.Width <> 150
'        Application.Wait (Now + TimeValue("0:00:01"))
'        progressbar.Width = progressbar.Width + 5
'        DoEvents
'    Loop

'Proceed with login credentials and wait until we successfully get in (and don't receive popup)

End Sub
  • 创建/显示gif后,如何实现gif的连续显示(和播放)
  • 我是否正确使用了
    DoEvents
    ?我觉得我可能用得太多了?我应该如何使用
    DoEvents
  • 我如何确保gif旁边的文本会相应地更改(在每个子文件执行时,例如:
    GetIE()
    ),而不是等到结束时跳过(或快速浏览其他文本)

  • DoEvents
    只是将控制权传递给处理器,以执行队列中的任何任务/消息,然后再将控制权返回给执行代码。听起来,在vba中,您想要的是极其复杂的,因为它是单线程执行,不能同时运行多个作业。如果表单尚未设置为“非模态”,并在继续执行之前强制暂停加载gif,您可能会更幸运。似乎所做的只是按照您的建议更改登录表单的模态属性。非常感谢。嗨,我知道这是一个旧的线程,但你是如何实现文本框的外观?它看起来几乎像HTML表单。
    DoEvents
    只是将控制权传递给处理器,以执行队列中的任何任务/消息,然后再将控制权返回给执行代码。听起来,在vba中,您想要的是极其复杂的,因为它是单线程执行,不能同时运行多个作业。如果表单尚未设置为“非模态”,并在继续执行之前强制暂停加载gif,您可能会更幸运。似乎所做的只是按照您的建议更改登录表单的模态属性。非常感谢。嗨,我知道这是一个旧的线程,但你是如何实现文本框的外观?它看起来几乎像HTML表单。