我尝试使用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
在您回答我的问题时,请提前感谢您。
答案 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
元素。