首页 > 解决方案 > VBA 自动化 - 预填充组合框

问题描述

我正在尝试通过 VBA 将 Excel 中的数据预填充到本地 Intranet 网站。

我已经能够将大多数数据预填充到该站点,但我正在努力使用这个组合框:

请参阅 HTML 代码:

<div class="form-group row  " id="starttime_field">
<label class="col-form-label col-md-3" for="starttime">Start time</label>
<div class="col-md-9">
<input type="text" id="starttime" name="starttime" class="form-control" size="30" style="display: none;"><span class="combodate">
<select class="hour " style="width: auto;"><option value="0">00</option><option value="1">01</option><option value="2">02</option><option value="3">03</option><option value="4">04</option><option value="5">05</option><option value="6">06</option><option value="7">07</option><option value="8">08</option><option value="9">09</option><option value="10">10</option><option value="11">11</option><option value="12">12</option><option value="13">13</option><option value="14">14</option><option value="15">15</option><option value="16">16</option><option value="17">17</option><option value="18">18</option><option value="19">19</option><option value="20">20</option><option value="21">21</option><option value="22">22</option><option value="23">23</option></select>&nbsp;:&nbsp;
<select class="minute " style="width: auto;"><option value="0">00</option><option value="1">01</option><option value="2">02</option><option value="3">03</option><option value="4">04</option><option value="5">05</option><option value="6">06</option><option value="7">07</option><option value="8">08</option><option value="9">09</option><option value="10">10</option><option value="11">11</option><option value="12">12</option><option value="13">13</option><option value="14">14</option><option value="15">15</option><option value="16">16</option><option value="17">17</option><option value="18">18</option><option value="19">19</option><option value="20">20</option><option value="21">21</option><option value="22">22</option><option value="23">23</option><option value="24">24</option><option value="25">25</option><option value="26">26</option><option value="27">27</option><option value="28">28</option><option value="29">29</option><option value="30">30</option><option value="31">31</option><option value="32">32</option><option value="33">33</option><option value="34">34</option><option value="35">35</option><option value="36">36</option><option value="37">37</option><option value="38">38</option><option value="39">39</option><option value="40">40</option><option value="41">41</option><option value="42">42</option><option value="43">43</option><option value="44">44</option><option value="45">45</option><option value="46">46</option><option value="47">47</option><option value="48">48</option><option value="49">49</option><option value="50">50</option><option value="51">51</option><option value="52">52</option><option value="53">53</option><option value="54">54</option><option value="55">55</option><option value="56">56</option><option value="57">57</option><option value="58">58</option><option value="59">59</option></select></span><span class="combodate"><select class="hour " style="width: auto;"><option value="0">00</option><option value="1">01</option><option value="2">02</option><option value="3">03</option><option value="4">04</option><option value="5">05</option><option value="6">06</option><option value="7">07</option><option value="8">08</option><option value="9">09</option><option value="10">10</option><option value="11">11</option><option value="12">12</option><option value="13">13</option><option value="14">14</option><option value="15">15</option><option value="16">16</option><option value="17">17</option><option value="18">18</option><option value="19">19</option><option value="20">20</option><option value="21">21</option><option value="22">22</option><option value="23">23</option></select>&nbsp;:&nbsp;<select class="minute " style="width: auto;"><option value="0">00</option><option value="1">01</option><option value="2">02</option><option value="3">03</option><option value="4">04</option><option value="5">05</option><option value="6">06</option><option value="7">07</option><option value="8">08</option><option value="9">09</option><option value="10">10</option><option value="11">11</option><option value="12">12</option><option value="13">13</option><option value="14">14</option><option value="15">15</option><option value="16">16</option><option value="17">17</option><option value="18">18</option><option value="19">19</option><option value="20">20</option><option value="21">21</option><option value="22">22</option><option value="23">23</option><option value="24">24</option><option value="25">25</option><option value="26">26</option><option value="27">27</option><option value="28">28</option><option value="29">29</option><option value="30">30</option><option value="31">31</option><option value="32">32</option><option value="33">33</option><option value="34">34</option><option value="35">35</option><option value="36">36</option><option value="37">37</option><option value="38">38</option><option value="39">39</option><option value="40">40</option><option value="41">41</option><option value="42">42</option><option value="43">43</option><option value="44">44</option><option value="45">45</option><option value="46">46</option><option value="47">47</option><option value="48">48</option><option value="49">49</option><option value="50">50</option><option value="51">51</option><option value="52">52</option><option value="53">53</option><option value="54">54</option><option value="55">55</option><option value="56">56</option><option value="57">57</option><option value="58">58</option><option value="59">59</option></select></span>

这就是表单这一部分的样子(以红色突出显示): ComboBox Form

这是我正在使用的代码片段:

Sub Legends()

Dim IE As InternetExplorerMedium
Dim Environment As String
Dim webContent As String
Dim NOME_EMPRESA, CNPJ, CPF, COD_ACESSO As String
Dim Lookup_Range As Range
Dim SH

Dim confirmationBox As Integer
confirmationBox = MsgBox("Confirm Legendary Promotion changes to " & Worksheets("Legends").Range("E2") & "?", vbYesNoCancel, "Woolly Legends")

'Confirmation box data if yes is clicked
Select Case confirmationBox
Case vbYes

Dim eachIE
    'Choosing the environment
    If ThisWorkbook.Sheets("Legends").Range("E2").Value = ThisWorkbook.Sheets("Parameters").Range("A2") Then
        AD = ThisWorkbook.Sheets("Parameters").Range("C2").Value
        Environment = AD
    End If
    If ThisWorkbook.Sheets("Legends").Range("E2").Value = ThisWorkbook.Sheets("Parameters").Range("A3") Then
        AC= ThisWorkbook.Sheets("Parameters").Range("C3").Value
        Environment = AC
    End If
    If ThisWorkbook.Sheets("Legends").Range("E2").Value = ThisWorkbook.Sheets("Parameters").Range("A4") Then
        AB = ThisWorkbook.Sheets("Parameters").Range("C4").Value
        Environment = AB
    End If
    If ThisWorkbook.Sheets("Legends").Range("E2").Value = ThisWorkbook.Sheets("Parameters").Range("A5") Then
        Testing = ThisWorkbook.Sheets("Parameters").Range("C5").Value
        Environment = Testing
    End If

    Set IE = New SHDocVw.InternetExplorer
    IE.navigate Environment
    ShowWindow IE.hwnd, SW_MAXIMIZE

    Do
      Set SH = New Shell32.Shell
      For Each eachIE In SH.Windows
        If InStr(1, eachIE.LocationURL, Environment) Then
          Set IE = eachIE
          'ie.Visible = False  'This is here because in some environments, the new process defaults to Visible.
          Exit Do
          End If
        Next eachIE
      Loop
    Set eachIE = Nothing
    Set SH = Nothing

    'Setting doc to allow for form manipulation via Excel
    Set doc = IE.document

    'Setting the Promotion Names for the Text Promotion
    IE.document.all("promo_name").Value = ThisWorkbook.Sheets("Legends").Range("b3")
    IE.document.all("race_name").Value = ThisWorkbook.Sheets("Legends").Range("b19")

    'Setting start date and end date
    IE.document.all("startdate").Value = Format$(ThisWorkbook.Sheets("Legends").Range("b7").Value, "yyyy-mm-dd")
    IE.document.all("enddate").Value = Format$(ThisWorkbook.Sheets("Legends").Range("b8").Value, "yyyy-mm-dd")

    'Setting the Runner Names
    IE.document.all("runner_names_0").Value = ThisWorkbook.Sheets("Legends").Range("b20")
    IE.document.all("runner_names_1").Value = ThisWorkbook.Sheets("Legends").Range("b21")
    IE.document.all("runner_names_2").Value = ThisWorkbook.Sheets("Legends").Range("b22")
    IE.document.all("runner_names_3").Value = ThisWorkbook.Sheets("Legends").Range("b23")
    IE.document.all("runner_names_4").Value = ThisWorkbook.Sheets("Legends").Range("b24")
    IE.document.all("runner_names_5").Value = ThisWorkbook.Sheets("Legends").Range("b25")

    'Setting the dropdown box for the jurisdictions
    If ThisWorkbook.Sheets("Legends").Range("B4").Value = "AAA" Or ThisWorkbook.Sheets("Legends").Range("B5").Value = "AAB" Or ThisWorkbook.Sheets("Legends").Range("B6").Value = "AAC" Then
        IE.document.all("jurisdiction[]").Options(0).Selected = True
    End If
    If ThisWorkbook.Sheets("Legends").Range("B4").Value = "BBB" Or ThisWorkbook.Sheets("Legends").Range("B5").Value = "BBA" Or ThisWorkbook.Sheets("Legends").Range("B6").Value = "BBC" Then
        IE.document.all("jurisdiction[]").Options(1).Selected = True
    End If
    If ThisWorkbook.Sheets("Legends").Range("B4").Value = "CCA" Or ThisWorkbook.Sheets("Legends").Range("B5").Value = "CCB" Or ThisWorkbook.Sheets("Legends").Range("B6").Value = "CCC" Then
        IE.document.all("jurisdiction[]").Options(2).Selected = True
    End If

End Select

End Sub

我不确定如何将电子表格中的数据预填充到小时和分钟组合框中,因为它的布局与 html 中的其他字段有点不同。

任何帮助或指导将不胜感激。

谢谢!

标签: excelvbainternet-explorercomboboxautomation

解决方案


小时和分钟框是select元素,这意味着使用 InternetExplorer 自动化您有两种主要的方法来选择单个项目(以及一些用于棘手情况的替代方法):

  1. 您可以selectedIndex在其本身上使用,然后在其下的列表中指定感兴趣的select索引。我认为从 1 开始,但您需要检查。optionselect
  2. option在元素本身上使用 .Selected = True 。

由于您有具有相同值的选项,因此如果使用第二种方法,则需要通过父选择来隔离下拉列表。这可以通过在前面添加父类名来完成。

方法一:

小时

ie.document.querySelector(".hour").SelectedIndex = 1

分钟

ie.document.querySelector(".minute").SelectedIndex = 1

方法二:

小时

ie.document.querySelector(".hour [value='0']").Selected = True  'hour 00

分钟

ie.document.querySelector(".minute [value='0']").Selected = True 'minute 00

替代品主要是上面的/变体,用 javascript 编写并通过 ie.document.parentWindow.execScript. 当元素由于某种原因不可交互但通常特别受到 QA 自动化专家的反对时,这会很有帮助。


阅读:

  1. CSS 选择器

编辑:

根据提供的 html 来区分开始时间和结束时间,例如

ie.document.querySelector(".combodate + .combodate .hour [value='0']").Selected =True  'end hour
ie.document.querySelector(".combodate + .combodate .minute [value='0']").Selected =True  'end minute

使用变量

Dim var As Long
var = 0

ie.document.querySelector(".combodate .hour [value='" & cstr(var) & "']").Selected =True  'start hour

尽管您的 HTML 没有反映这一点,但我预计会更像:

ie.document.querySelector("#starttime_field .combodate .hour [value='" & cstr(var) & "']").Selected =True 
ie.document.querySelector("#endtime_field .combodate .hour [value='" & cstr(var) & "']").Selected =True 

推荐阅读