自动化Internet Explorer:输入一个没有" ID"

时间:2015-02-06 21:28:36

标签: html excel vba internet-explorer

我尝试使用excel VBA自动化在我公司的Intranet网页上输入的数据。我知道如何与字段的网页值进行交互" id"比如下面的html代码

<input name="txtUserName" tabindex="1" id="txtUserName" type="text">  

使用那种html代码我会使用像

这样的东西
IE.Document.getElementbyId("txtUserName").Value = "UserName"  

我面临的问题是与我尝试互动的字段相关联的代码是

        <HTML><HEAD><META content="IE=5.0000" http-equiv="X-UA-Compatible">
<SCRIPT type=text/javascript>
            function ajusterFrames() {
                var iLargeurGauche = 217;
                var iLargeurDroite = 850;
                var iLargeurFenetre = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
                var iMarge = 0;
                var sCols = "";
                if (iLargeurFenetre > (iLargeurGauche + iLargeurDroite)) {
                    iMarge = (iLargeurFenetre - (iLargeurGauche + iLargeurDroite)) / 2;}
                sCols = (iLargeurGauche + iMarge) + ",*";
                document.getElementById("framesetbas").cols = sCols;
                document.getElementById("cadres").style.display = "block";}
            window.onload = ajusterFrames;
            window.onresize = ajusterFrames;
        </SCRIPT>

                                                                                                                      

                            <TBODY>
                                <TR> </TR>
                                    <TR>
                                        <TD>
                                        <!--RECHERCHE-->
                                            DIV id=Projet>
                                            <!--RECHERCHE-->
                                                <CENTER>
                                                    <FIELDSET style="WIDTH: 600px" name="recherche">
                                                    <LEGEND style="FONT-SIZE: 10px; FONT-FAMILY: verdana; COLOR: #767676" name="legende_recherche">
                                                    <INPUT onclick=afficherRecherche(this.value); type=radio value=simple name=TypeRecherche>
                                                    </DIV><!------RECHERCHE AVANCÉE------------------------------------->
                                                    <DIV id=divAvancee>
                                                        <CENTER>
                                                            <TABLE cellSpacing=0 cellPadding=0 border=0>
                                                                <TBODY>
                                                                    <TR>
                                                                    <TR>
                                                                    <TR>
                                                                    <TR>
                                                                    <TR>
                                                                    <TR>
                                                                    <TD align=right>
                                                                        <FONT color=#003366 size=1 face=verdana>No Projet :</FONT></TD>

所以我试图通过以下方式修改字段标识的值:&#34; txtNoProjet&#34;这是我能提出的代码,我尝试了许多版本,但仍然无法正确使用。
更新代码以包含解决方案

Private Sub entree_budget()


Dim i As Long
Dim IE As Object
Dim Doc As Object
Dim objElement As Object
Dim objCollection As Object
Dim buttonCollection As Object
Dim valeur_heure As Object

num_proj = Cells(1, 3)              'this is the value that I need to input

' Create InternetExplorer Object
Set IE = CreateObject("InternetExplorer.Application")

' You can uncoment Next line To see form results
IE.Visible = True

' Send the form data To URL As POST binary request
IE.Navigate "http://intranet.cima.ca/fr/application/paq/projets/index.asp?v1_lang=1"

' Wait while IE loading...
Do While IE.Busy
    Application.Wait DateAdd("s", 1, Now)
Loop

&#39;以下更新的代码

    Set links = IE.Document.frames(2).Document.getElementsByTagName("input")
         n = links.Length   
    While i < n
            If links(i).Name = "txtMotCle" Then        
                links(i).Value = num_proj
            End If  
  i = i+ 1  
Wend 

End Sub 

任何人都可以帮我这个吗? 如果可能的话,我还需要点击按钮&#34;搜索&#34;在表单的底部,但我无法识别它的语法,所以我不知道如何与它进行交互。有人能告诉我如何点击有这个HTML代码的按钮吗?

<A href="javascript:submitForm('avancee');">
<IMG border=0 alt="Rechercher un projet" src="../../../images/fr/rechercher.gif"></A>  

更新后的代码解决方案:

Set links = IE.Document.frames(2).Document.getElementsByTagName("a")
 n = links.LengtH
i = 0
While i < n
    If links(i).href = "javascript:submitForm('avancee');" Then           
        Set objElement = links(i)
        objElement.ClicK
    End If
    i = i + 1
Wend

在您回答我的问题时,请提前感谢您。

2 个答案:

答案 0 :(得分:2)

编辑:输入元素包含在一个框架中,这就是@ jeeped的答案不起作用的原因。 getElementsByTagName(“input”)应该返回它们。希望这个编辑将使您不必阅读评论以找到答案。要返回框架中包含的输入,请使用

IE.document.frames(x).document.getElementsByTagName("input") 

其中x是框架的索引。

以下原始回复。

=============================================== ======

如果它是从零开始的,那么你不应该删除阻止循环运行的-1吗?也就是说,如果有一个元素,那么for循环将是iNPT = 0 to 0并执行一次。如果有两个,则.length将返回1,=0 to 1将按预期执行两次。

我个人可能会在项目的引用中包含Microsoft Internet Controls和Microsoft HTML Object Library,这样我就可以使用早期绑定并声明变量,然后使用a for each迭代:

Dim inputs As MSHTML.IHTMLElementCollection
Dim inpt As MSHTML.IHTMLInputElement
Dim IE As New SHDocVw.InternetExplorer

IE.Visible = True
IE.navigate "http://intranet.cima.ca/fr/application/paq/projets/index.asp?v1_lang=1"
While IE.readyState <> READYSTATE_COMPLETE: DoEvents: Wend

Set inputs = IE.document.getElementsByTagName("input")
For Each inpt In inputs
    If inpt.Name = "txtNoProjet" Then inpt.Value = num_proj
    Next

请注意,HTML对象库包含几个不同的IHTMLElementCollections,具有不同的数字。在某些情况下,您可能需要使用其中一种。此外,您可能需要使用getAttribute来访问该属性:

If inpt.getAttribute("name") = "txtNoProjet" then inpt.Value = num_proj

答案 1 :(得分:0)

元素集合的索引是从零开始。假设您只使用一个txtNoProjet

IE.Document.getElementsbyName("txtNoProjet")(0).Value = num_proj

我过去曾遇到过.getElementsbyName的问题。如果上述内容对您不起作用,请收集所有<input>元素并循环显示它们,直到找到所需的元素。

dim iNPT as long
for iNPT=0 to (IE.Document.getElementsbyTagName("input").length - 1)
  if IE.Document.getElementsbyTagName("input")(iNPT).name = "txtNoProjet" then
    IE.Document.getElementsbyTagName("input")(iNPT).value = num_proj
    exit for
  end if
next iNPT

其中一个应该让你去。您将遇到的最大问题是重复的名称。

编辑:点击图片锚点的附录

dim iIMG as long
for iIMG=0 to (IE.Document.getElementsbyTagName("img").length - 1)
  if CBool(InStr(1, IE.Document.getElementsbyTagName("img")(iIMG).src, "rechercher.gif", vbTextCompare)) then
    IE.Document.getElementsbyTagName("img")(iIMG).click
    do while IE.Busy Or IE.ReadyState <> READYSTATE_COMPLETE: Do Events: Loop
    exit for
  end if
next iIMG

我通常更喜欢接近IE.Document.getElementsbyTagName("form")(0).submit的内容,但您还没有提供足够的HTML源代码来正确编写。您必须调整该代码以查看您的.Frames元素。