网页上的Excel VBA:未填写文本区域

时间:2014-06-18 20:28:17

标签: excel vba internet-explorer text

我很难过。我试图用vba用文本" hi"填写描述文本区域。但是我收到了错误。我做错了什么?

这是页面: http://toronto.kijiji.ca/c-PostAd?AdVideoUrl=&AddressCity=&AddressCounty=&AddressRegion=&AddressSelectedByUser=false&AddressStreet=&AddressStreetName=&AddressStreetNumber=&AddressZip=&Alley=&CPUrl=&CatId=212&ChangeCategory=&ChangePhoto=&ContactInfo=&Description=&DiscountPrice=&Email=&EpsErrorCode=&EventEndDay=18&EventEndHour=23&EventEndMinute=59&EventEndMonth=5&EventEndSecond=3&EventEndYear=2014&EventStartDay=18&EventStartHour=0&EventStartMinute=0&EventStartMonth=5&EventStartSecond=3&EventStartYear=2014&GetNeighborhood=&Guid=&JavaScriptNotEnabled=false&Lane=&MapAddress=&Number=&PaypalEmailAddress=&PaypalMobileNumber=&Phone=&Photo=&PhotoDesc=&PostAs=POST_AS_OWNER&PreviewAd=&PreviewToEdit=&Price=&RequestRefererUrl=%2C&RoadStreet=&SelectedLeafCat=SelectedLeafCat&ShowPhone=checked&ShowTerms=&SubNumber=&Thumbnail=&Title=&TransDescription=&TransTitle=&VinNumber=&WebsiteUrl=&action_cancel=&action_publish=&carproof=&cplink=&cpvin=&extraInfo=&machId=&numActiveAdsInCategory=&text_loading=&tmId=&useBasicUpload=false&utm_campaign=&utm_medium=&utm_source=

这里有元素: <textarea name="Description" id="hdnDescription" wrap="soft" cols="71" maxlength="100000" style="width:500; height:240;font-family:arial;" ondescriptiondest="0" rows="6" class="tipField"></textarea>

这是我尝试过的代码:

Sub test()
Dim objIE As Object

Set objIE = CreateObject("InternetExplorer.Application")
With objIE
    .Visible = True
    .navigate Website
    Do While .Busy Or .readyState <> 4
        DoEvents
    Loop

' Description
  objIE.document.getElementByID("hdnDescription").Value = "hi"
   End With


End Sub

我也尝试过使用getElementsByName而不是ID,但是也没有用:

objIE.document.getElementsByName("Description").Item(0).Value = Description

帮助将不胜感激!谢谢!

注意:也发布在这里:http://www.mrexcel.com/forum/excel-questions/785128-visual-basic-applications-webpage-not-filling-textarea.html#post3842132

5 个答案:

答案 0 :(得分:1)

如果我使用Chrome打开您的网址,我会看到您描述的textarea hdnDescription。

如果我使用IE11打开您的URL,则textarea hdnDescription将呈现为不可见,但可以看到带有IFrame和自己的HTML内容的富文本编辑器。为什么?没有线索...但是像这样,代码行objIE.document.getElementByID("hdnDescription").Value = "hi"不会按预期工作。

所以我选择了另一个结构更简单的网站:https://www.netvoip.ch/support textarea位于最底层。

然后,使用此网址的代码段完全正常。我看到&#34; hi&#34;出现在textarea:

Dim objIE As Object

Set objIE = CreateObject("InternetExplorer.Application")
Dim webSite As String
webSite = "https://www.netvoip.ch/support" 
With objIE
    .visible = True
    .navigate webSite
    Do While .Busy Or .ReadyState <> 4
        DoEvents
    Loop

   ' Description
   objIE.document.getElementByID("description").value = "hi"
End With

由于机制工作正常,最终可能是你必须将它也用于Kijiji,尽管textarea hdnDescription呈现为不可见,因为表单提交无论如何都将取其值。

答案 1 :(得分:0)

当文档开始加载时,IE应用程序进入readyState 4。在开始更改DOM之前,您还必须等待文档readyState。

这是我用来等待从另一个项目中获取IE的Sub。

Private Sub WaitUntilLoaded(ie As Object)
    Dim i As Long
    Dim ready As Boolean

    ' wait for page to connect
    i = 0
    Do Until ie.readyState = READYSTATE_COMPLETE
        Application.Wait Now + TimeValue("0:00:01")
        i = i + 1
        If i > 300 Then
            Err.Raise 513, , "Timeout"
        End If
    Loop

    ' wait for document to load
    Do Until ie.document.readyState = "complete"
        Application.Wait Now + TimeValue("0:00:01")
        i = i + 1
        If i > 300 Then
            Err.Raise 513, , "Timeout"
        End If
    Loop
End Sub

此外,它是getElementsByTagName,而不是getElementsByName

答案 2 :(得分:0)

&#34;描述&#34;框位于iframe中。通常,要与驻留在iframe中的元素进行交互,您需要从标记中提取src属性,然后导航到该src和基本URL形成的URL。然后,在新网页上,构建如

  

objIE.document.getElementByID(&#34; rteDescription&#34;)。值=&#34; hi&#34;

应该有效。但是,当我尝试将src添加到基本URL时,在这种情况下,新页面没有要与之交互的描述框(或其他任何内容)。在这种情况下,不要理解为什么这种方法会失败。

答案 3 :(得分:0)

让我们说HTML textarea 的标签是:

ObjIE.Document.getElementById(“hdnDescription”).innerHTML= “Hello World”

然后使用.innerHTML在textarea中提供文本,VBA代码提供文本“Hello World”:

namespace App\Listeners;

use Carbon\Carbon;

class UpdateLastLoginOnLogin
{
    public function handle($user, $remember)
    {
        $user->last_login_at = Carbon::now();

        $user->save();
    }
}

答案 4 :(得分:0)

试试这个。

objIE.getElementsBytagname("textarea").Item.Value = "Your text."