2017-12-19 10 views
5

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:&nbsp;<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);">&nbsp; 
     <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">&nbsp;</td><td class="formCopy">&nbsp;</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);">&nbsp;<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> 
+0

私は、問題のWebページにアップロード用のファイルを準備するためのフロントエンドがあると思います。おそらく、DOM要素の操作のために発砲していないJavascriptイベントです。私の推測になるほど深くは見ていない...これは、通常、マウスのクリックイベントから発射されますか?ちょうど何かこれを取る時間を持つ人が助けに来るまで(私は恐れています) –

+0

Webページで、要素をクリックすると自動的にファイルブラウザウィンドウが開き、ファイルを選択するとボックスを作成します(ただし、背中をクリックして手動で何も入力することはできません)。その後、送信ボタンを押すと、ファイルがロードされ、pafeがリフレッシュされます。私はおそらく助けるために全面的なコードを追加します。 –

+0

このトピックに関する熟練者ではありませんが、このリンクはhttps://stackoverflow.com/questions/4007969/application-x-www-form-urlencoded-or-multipart-form-dataにあるようです。これは 'multipart /フォームデータ」フォームでは、フォームデータに境界(vbCrlf)を含めることはできません。私はあなたが変数 'd'にvbCrlfを含めたことを見ています。それはおそらく問題でしょうか?あなたはできないときに境界を含めましたか? –

答えて

0

いくつかのセキュリティ強化機能は、ファイルの入力コントロールの周りのInternet Explorerに追加されました。

  1. ファイルが
  2. から来たサーバーに露出しないようにサーバに送信された値は、おそらく入力が(値を入力することができるというユーザーから無効になっている「偽のパスを」含まれていますこのページのキーロガーでオンに詮索されていた)
  3. フィールド(またはボタン)がJavaScriptの
  4. このよう

でクリックイベントをトリガするユーザー対によってクリックされる必要があり、私は完全に両方の期待します#2と#3は、フィールドと対話する自動化されたツールのブロッカーになる実際にはブラウザのボタンをクリックした後、ファイル選択ダイアログからファイルを選択して、Windowsの世界からユーザを完全に模倣することができます。

関連する問題