【问题标题】:VBA Automation - Prefilling Combodate BoxVBA 自动化 - 预填充组合框
【发布时间】:2020-02-03 09:22:11
【问题描述】:

我正在尝试通过 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

这是我正在使用的代码的 sn-p:

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 中的其他字段有点不同。

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

谢谢!

【问题讨论】:

  • 请使用sn-p工具通过edit分享html而不是发布html图片。我们可能需要能够复制它。此外,它看起来像一个 select 元素,这意味着它需要扩展以显示子 options
  • 感谢您的帮助,我已将 HTML 代码添加为 sn-p。
  • 您是不小心粘贴了两次,还是真的所有内容都粘贴了两次?
  • 第一部分是HTML代码,第二部分是我的VBA代码。
  • 在 html 中有两分钟和两小时的方框。

标签: excel vba internet-explorer combobox automation


【解决方案1】:

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

  1. 您可以在select 本身上使用selectedIndex,然后在select 下的列表中指定感兴趣的option 的索引。我认为从 1 开始,但您需要检查一下。
  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 Selectors

编辑:

根据提供的 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 

【讨论】:

  • 非常感谢您的工作!!!!最后一个问题,我在下面有一个精确的组合框来表示结束时间,我如何引用第二个小时和分钟框?
  • 另外,我如何将变量分配给值,所以我希望它不是 [value='0'],而是 value=x(Dim x As Integer x = 1)。谢谢!
  • 非常感谢,我现在可以为我的值分配一个变量!最后一件事!尝试结束时间 querySelector 代码时出现运行时错误 424(ie.document.querySelector(".combodate + .combodate .minute [value='0']").Selected =True),有什么想法吗?跨度>
  • @FeiLong001,来自您之前关于此答案的 cmets。看起来您已经为您的问题找到了解决方案。我建议您将 QHarr 给出的建议标记为已接受的答案。它可以在未来帮助其他社区成员解决类似的问题。感谢您的理解。
  • 嗨 QHarr,是否有替代 querySelector 方法的方法?如果使用此 querySelector 方法(即使填充了小时和分钟下拉菜单),看起来表单将无法正确保存。该表格抱怨没有选择小时/分钟,我必须手动选择它的工作时间。谢谢。
猜你喜欢
  • 1970-01-01
  • 2010-10-29
  • 1970-01-01
  • 1970-01-01
  • 2013-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多