Excel VBAを使用してWebサイトへのファイル読み込みを自動化しようとしていますが、Webページのファイル読み込み部分と正しく対話するのに苦労しています。私は多くの異なるウェブページを読んでおり、これと他の情報源の両方でこれを行う方法については答えていますが、これまでのところ私の試みは失敗しています。Excel VBA自動化IEファイルロード
確かに私は、VBAとさまざまなHTML(またはその他の)要素を介してIEとやりとりし、いくつかの助けが必要であると確信していません。
私はと対話するために苦労していますWebページの一部がこれです:
<LABEL ACCESSKEY=U CLASS=filelabel>Upload a file to current older:
<INPUT TYPE="file" NAME="eftupload" CLASS=filefield/></LABEL>
<INPUT TYPE="submit" value="Upload" CLASS=submitbutton>
次のように私はまだ様々に取り組んでいますように私はこれまでのコードに管理しているVBAは(少し厄介私が知っていますそれは作業を取得する方法)私が使用しようとしていますウェブ要素は、「私のURL 2」の上に位置しています:
Sub File2Web()
'dimension (declare or set aside memory for) our variables
Dim objIE As InternetExplorer 'special object variable representing the IE browser
Dim aEle As HTMLLinkElement 'special object variable for an <a> (link) element
'initiating a new instance of Internet Explorer and asigning it to objIE
Set objIE = New InternetExplorer
'make IE browser visible (False would allow IE to run in the background)
objIE.Visible = True
'navigate IE to this web page (a pretty neat search engine really)
objIE.Navigate "my URL"
'wait here a few seconds while the browser is busy
Do While objIE.Busy = True Or objIE.ReadyState <> 4: DoEvents: Loop
'in the userid box put value
objIE.Document.getElementById("username").Value = "userID"
'in the password box put value
objIE.Document.getElementById("password").Value = "PassWD"
'click the 'go' button
objIE.Document.getElementById("loginSubmit").Click
'wait again for the browser
Do While objIE.Busy = True Or objIE.ReadyState <> 4: DoEvents: Loop
'navigate IE to this web page
'Upload file using input type=file
Dim sFormData As String, d As String
Dim FileName As String, FieldName As String
FieldName = "File"
FileName = "C:\FTP Temp\Test.txt"
'Boundary of fields. Be sure this string is Not In the source file
Const Boundary As String = ""
'Get source file As a string.
sFormData = GetFile(FileName)
FieldName = "frmUpload"
'Build source form with file contents
d = d + "Content-Disposition: form-data; name=""" + FieldName + """;"
d = d + " filename=""" + FileName + """" + vbCrLf
d = d + "Content-Type: application/upload" + vbCrLf + vbCrLf
d = d + sFormData
d = d + vbCrLf
Dim URL As String, FormData As String
FormData = d
Dim bFormData() As Byte
ReDim bFormData(Len(FormData) - 1)
bFormData = StrConv(FormData, vbFromUnicode)
URL = "my URL 2"
objIE.Navigate URL, , , bFormData, "Content-Type: multipart/form-data; boundary=" + vbCrLf
'wait here a few seconds while the browser is busy
Do While objIE.Busy = True Or objIE.ReadyState <> 4: DoEvents: Loop
End Sub
'read binary file As a string value
Function GetFile(FileName As String) As String
Dim FileContents() As Byte, FileNumber As Integer
ReDim FileContents(FileLen(FileName) - 1)
FileNumber = FreeFile
Open FileName For Binary As FileNumber
Get FileNumber, , FileContents
Close FileNumber
GetFile = StrConv(FileContents, vbUnicode)
End Function
すべてがファイルのロードから離れて動作します。それが実行されると、画面が見つからないWebページに移動してファイルがアップロードされませんが、VBAエラーなどは発生しません。
ご協力いただければ幸いです。ネットワーク、アプリケーション、その他の作業制限のためにファイルをアップロードする方法は他にありませんので、このページ/フォームとやり取りする必要があります。
編集:全ページのコードは以下のとおりである...
<html>
<head><title>sftp.mysite.com</title>
<link href="/EFTClient/efthtmladvanced.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="/EFTClient/efthtmladvanced.js">
</script>
<script type="text/javascript" src="/EFTClient/Shared/PTCs.js">
</script>
</head>
<body onload="javascript:init();"><div class=header><H1 CLASS=cwd>sftp.mysite.com - /Input/Applications/UKC Apps/</H1></div>
<h3><i>NOTE: Web Transfer Client Access has been disabled for this user or container. Reverting to basic client.</i></h3>
<hr />
<FORM NAME="frmUpload" METHOD="POST" ACTION="/Input/Applications/UKC Apps/" ENCTYPE="multipart/form-data"><table border=0 width='90%'>
<tr>
<td width='70%'>
<LABEL ACCESSKEY=U CLASS=filelabel>Upload a file to current folder: <INPUT TYPE="file" NAME="eftupload" CLASS=filefield/></LABEL>
<INPUT TYPE="submit" value="Upload" CLASS=submitbutton>
</td>
<td width='30%' align='right'>
<INPUT TYPE='button' value='Change Password' onclick="setChangePassDivPosition();showDiv('ChangePass', true);">
<INPUT style="visibility:visible;valign='top';" TYPE='button' value='Log Out' onclick='doLogout(); window.location.reload(true); return false;'>
</td>
</tr>
</table>
</FORM><hr />
<pre>
<a href="/Input/Applications/;html">[To Parent Directory]</a><br><br>
<input type="button" value="Delete" name="btnDelete" id="btnDelete" onClick="javascript:deleteFiles();"><BR>
<input type='checkbox' name='folderitem' value="/Input/Applications/UKC Apps/my file.txt" id='1'> <a href='javascript:void(0);' onclick="rename('/Input/Applications/UKC Apps/my file.txt');">Rename</a> 18 Dec 2017 14:02 56955145 <a href="/Input/Applications/UKC Apps/myfile.txt;html">my file.txt</a><BR>
</pre><hr>
<form name="changePassForm" id="changePassForm" method="post"><div id="ChangePass" class="floatingDiv" style="{ visibility:hidden; }"><table cellpadding="5" cellspacing="0" width="100%" style="border:1px solid black; border-bottom:0px"><tr class="divHeader"><td><table cellpadding=0 cellspacing=0 width="100%%"><tr><td class="formCopy"><b>Change Password</b></td><td class="formCopy" align="right"><a title="Click here to close this dialog" href="javascript:void(0)" onclick="showDiv('ChangePass', false);" style="font-family:verdana; font-size:10px; color:black; text-decoration:none">X</a></td></tr></table></td></tr></table><table cellpadding="5" cellspacing="0" width="100%%" style="border:1px solid black;"><tr><td class="formCopy">Current Password:</td><td class="formCopy"><input type="password" value="" name="oldpass" id="oldpass"></td></tr><tr><td class="formCopy">New Password:</td><td class="formCopy"><input type="password" value="" name="newpass" id="newpass"></td></tr><tr><td class="formCopy">Confirm Password:</td><td class="formCopy"><input type="password" value="" name="confirmpass" id="confirmpass"></td></tr><tr><td class="formCopy"> </td><td class="formCopy"> </td></tr></table><table cellpadding="5" cellspacing="0" style="border:1px solid black; border-top:2px solid #aaaaaa;" class="divHeader" width="100%%"><tr><td colspan="2" align="right"><input type="button" value="Change Password" onclick="changePassword(this.form);"> <input type="button" value="Cancel" onclick="showDiv('ChangePass', false);"></td></tr></table></div></form><br /><br />
<center><font face="arial" size="1" color=#3366CC><em>Powered by the <b>Globalscape EFT Server</b></em></font></center>
<br />
</body>
</html>
私は、問題のWebページにアップロード用のファイルを準備するためのフロントエンドがあると思います。おそらく、DOM要素の操作のために発砲していないJavascriptイベントです。私の推測になるほど深くは見ていない...これは、通常、マウスのクリックイベントから発射されますか?ちょうど何かこれを取る時間を持つ人が助けに来るまで(私は恐れています) –
Webページで、要素をクリックすると自動的にファイルブラウザウィンドウが開き、ファイルを選択するとボックスを作成します(ただし、背中をクリックして手動で何も入力することはできません)。その後、送信ボタンを押すと、ファイルがロードされ、pafeがリフレッシュされます。私はおそらく助けるために全面的なコードを追加します。 –
このトピックに関する熟練者ではありませんが、このリンクはhttps://stackoverflow.com/questions/4007969/application-x-www-form-urlencoded-or-multipart-form-dataにあるようです。これは 'multipart /フォームデータ」フォームでは、フォームデータに境界(vbCrlf)を含めることはできません。私はあなたが変数 'd'にvbCrlfを含めたことを見ています。それはおそらく問題でしょうか?あなたはできないときに境界を含めましたか? –