VBA网站自动化:向搜索框赋值时触发Error 438错误求助
Hey there, let's tackle that Error 438 you're hitting when trying to input text into the search box. The root cause is a simple but easy-to-make typo in your code!
The Core Issue
You're using getElementsById("txtClientRef") but this method doesn't exist in the DOM—it's supposed to be getElementById (singular Element, not plural Elements). Since getElementsById isn't a valid method for the Document object, VBA throws the 438 error because it can't find that property/method.
getElementById is designed to return a single element (since HTML IDs should be unique on a page), which is exactly what you need here for a search box with a unique ID.
Fixed Code Snippet
Replace the problematic line with this:
.Document.getElementById("txtClientRef").Value = MyValue
Additional Optimizations & Checks
While we're at it, let's make your script more reliable:
- Replace Hardcoded Wait with Proper Page Load Check
Instead of using a 10-second fixed wait (currenttime + TimeValue("00:00:10")), use a loop that waits for both the browser to be not busy and the page to be fully loaded. This is more efficient and works better across different network speeds:' Replace your fixed wait with this Do While objIE.Busy Or objIE.ReadyState <> READYSTATE_COMPLETE DoEvents Loop - Verify the Element ID
Double-check that the search box's ID is indeedtxtClientRefusing your browser's developer tools (press F12, use the element picker tool to select the search box, and confirm theidattribute matches). If the ID is different, update it in your code. - Check for Iframes
If the search box is inside an iframe, you'll need to access the iframe's document first. For example:Dim iframe As Object Set iframe = .Document.getElementsByTagName("iframe")(0) ' Adjust index if needed iframe.contentDocument.getElementById("txtClientRef").Value = MyValue
Full Fixed Code
Here's your complete script with the typo fixed and the improved wait logic:
Option Explicit Const MyUserName As String = "username" Const MyPassword As String = "password" Const READYSTATE_COMPLETE As Integer = 4 Dim objIE As Object Sub LoginScript() Dim Message, Title, Default Dim MyValue As String Dim currenttime As Date Set objIE = CreateObject("InternetExplorer.Application") If MsgBox("Do you want to search for a member?", vbYesNo, "Login") = vbNo Then With objIE .Visible = True .Silent = True .Navigate ("https://XXXXXXXXX.com/") Do Until .ReadyState = READYSTATE_COMPLETE DoEvents Loop .Document.all.txtuserid.Value = MyUserName .Document.all.txtpassword.Value = MyPassword .Document.all.save_button.Click Do Until .ReadyState = READYSTATE_COMPLETE DoEvents Loop End With Else Message = "Please enter clients CTC number" ' Set prompt. Title = "Member Search" ' Set title. ' Display message, title, and default value. MyValue = InputBox(Message, Title) With objIE .Visible = True .Silent = True .Navigate ("https://XXXXXXXXX.com/") Do Until .ReadyState = READYSTATE_COMPLETE DoEvents Loop .Document.all.txtuserid.Value = MyUserName .Document.all.txtpassword.Value = MyPassword .Document.all.save_button.Click ' Improved wait for post-login page load Do While .Busy Or .ReadyState <> READYSTATE_COMPLETE DoEvents Loop .Document.getElementById("txtClientRef").Value = MyValue ' Fixed line End With End If End Sub
内容的提问来源于stack exchange,提问作者Kyle smith

