VBA Automation - Prefilling Combodate Box

早过忘川 提交于 2021-02-02 09:55:30

问题


I am trying to prefill data from Excel to a local intranet website via VBA.

I've been able to prefill most data to the site, but I am struggling with this combodate box:

Please see HTML code:

<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>

This is what this section of the form looks like (highlighted in red): ComboBox Form

Here is a snippet of the code I am using:

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

I am unsure how to pre-populate data from the spreadsheet into the hour and minute comboboxes, as the layout of this is a bit different from the other fields in the html.

Any help or guidance would be greatly appreciated.

Thanks!


回答1:


The hour and minute boxes are select elements which means with InternetExplorer automation you have two main methods for selecting individual items (and a couple of alternates for tricky situations):

  1. You can use selectedIndex on the select itself then specify index of option of interest in the list under that select. I think starts at 1 but you would need to check.
  2. Use .Selected = True on the option element itself.

As you have options that have the same values you need to isolate the dropdowns by the parent select if using second method. This can be done by adding parent className in front.

Method 1:

hour

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

minute

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

Method 2:

hour

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

minute

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

Alternates are predominately the above/variants thereof written in javascript and executed by method of ie.document.parentWindow.execScript. This can be helpful when elements are not interactable for some reason but generally frowned upon by QA automation specialists in particular.


Reading:

  1. CSS Selectors

EDIT:

To differentiate starttime from endtime based on html provided e.g.

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

Using variable

Dim var As Long
var = 0

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

Although your HTML doesn't reflect this I would have expected something more like:

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


来源:https://stackoverflow.com/questions/58246534/vba-automation-prefilling-combodate-box

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!