2016-11-25 2 views
4

はのはCで保存され、次のように私はページを持っているとしましょうエクセルVBAでHTMLを操作:\ tempに\ html_page.html:読むと

<html> 
    <head> 
     <link rel="stylesheet" href="styles.css"> 
    </head> 
    <body> 
     <div id="xxx1"> 
     <img src="test.png"> 
     </div> 
    </body> 
</html> 
私はプログラム的にIMGのsrc属性を調整したいと思います

、Excelデータ& VBAに基づいています。基本的にXpathでdivを見つけて、その中に含まれている(単一の)imgタグを調整する方法です。

XMLライブラリhereを使ってVBAでXMLを操作する例が見つかりましたが、私はHTMLオブジェクトライブラリでこの作業を行うことに頭を悩ましています。サンプルやドキュメントを見つけることができません。

Dim XDoc As Object, root As Object 

Set XDoc = CreateObject("MSXML2.DOMDocument") 
XDoc.async = False: XDoc.validateOnParse = False 

If XDoc.Load(html_path) Then 
    Debug.Print "Document loaded" 
Else 
    Dim strErrText As String 
    Dim xPE As MSXML2.IXMLDOMParseError 
    ' Obtain the ParseError object 
    Set xPE = XDoc.parseError 
    With xPE 
     strErrText = "Your XML Document failed to load" & _ 
     "due the following error." & vbCrLf & _ 
     "Error #: " & .ErrorCode & ": " & xPE.reason & _ 
     "Line #: " & .Line & vbCrLf & _ 
     "Line Position: " & .linepos & vbCrLf & _ 
     "Position In File: " & .filepos & vbCrLf & _ 
     "Source Text: " & .srcText & vbCrLf & _ 
     "Document URL: " & .URL 
    End With 
    MsgBox strErrText, vbExclamation 

私がやりたいすべてがある:

'... 
Set outer_div = XDoc.SelectFirstNode("//div[id='xxx1'") 
... edit the img attribute 

しかし、それは適切なXML(imgタグが閉じていない)ではないので、私は、HTMLページをロードすることはできません。

ご協力いただきまして誠にありがとうございます。ああ、私はPythonのような他の言語を使うことはできません。

答えて

3

これは、あなたが望むものはかなりありませんが、それは十分に近いかもしれません。むしろXMLライブラリを使用するよりも、HTMLライブラリを使用します。

Sub changeImg() 

    Dim dom As Object 
    Dim img As Object 
    Dim src As String 

    Set dom = CreateObject("htmlFile") 

    Open "C:\temp\test.html" For Input As #1 
     src = Input$(LOF(1), 1) 
    Close #1 

    dom.body.innerHTML = src 

    Set img = dom.getelementsbytagname("img")(0) 

    img.src = "..." 

    Open "C:\temp\test.html" For Output As #1 
     Print #1, dom.DocumentElement.outerHTML 
    Close #1 


End Sub 

問題は、結果のファイルがHeadノードが追加されますと、タグ名が大文字になるということです。あなたがこれで暮らすことができれば、解決策があなたのために働くでしょう。

もっと深いことをしたいのならば、より良いセレクタを使って、早期バインディングを検討してください。暴露HTMLインターフェイスは、後半に結合した場合のインタフェースとは異なっていると、複数のプロパティをサポートしています - あなたはHTML Object Libraryへの参照を追加したいと思う:あなたはdoc.querySelector("div[id='xxx1'] img")を使用することができます。この目的のために

Sub changeImg() 

    Dim dom As HTMLDocument 
    Dim img As Object 
    Dim src As String 

    Set dom = CreateObject("htmlFile") 

    Open "C:\temp\test.html" For Input As #1 
     src = Input$(LOF(1), 1) 
    Close #1 

    dom.body.innerHTML = src 

    Set img = dom.getelementsbytagname("img")(0) 

    img.src = "..." 

    Open "C:\temp\test.html" For Output As #1 
     Print #1, dom.DocumentElement.outerHTML 
    Close #1 


End Sub 
+0

おかげでたくさん!私はほとんどそこにいるようです:質問は100%正確ではありませんでした。私は、複数行のHTMLファイルで動作するソリューションを探しています。私はコードを調整する方法を見つけようとしていますが、まだ成功していません。それを答えに加えてもよろしいですか? – MattV

+0

@MattV、私は何かが欠けする必要があります申し訳ありませんが、なぜ複数行のファイルに対して、この作品はないのでしょうか?私に知らせて、私は更新します – SWa

0

。変更するにはsrc属性はimg.setAttribute "src", "new.png"を使用しています。 HTH

Option Explicit 

' Add reference to Microsoft Internet Controls (SHDocVw) 
' Add reference to Microsoft HTML Object Library 

Sub Demo() 
    Dim ie As SHDocVw.InternetExplorer 
    Dim doc As MSHTML.HTMLDocument 
    Dim url As String 

    url = "file:///C:/Temp/StackOverflow/html/html_page.html" 
    Set ie = New SHDocVw.InternetExplorer 
    ie.Visible = True 
    ie.navigate url 
    While ie.Busy Or ie.readyState <> READYSTATE_COMPLETE: DoEvents: Wend 
    Set doc = ie.document 

    Dim img As HTMLImg 
    Set img = doc.querySelector("div[id='xxx1'] img") 
    If Not img Is Nothing Then 
     img.setAttribute "src", "new.png" 
    End If 
    ie.Quit 
End Sub