【问题标题】:Read Local HTML File into String With VBA使用 VBA 将本地 HTML 文件读入字符串
【发布时间】:2020-01-29 05:30:08
【问题描述】:

这感觉应该很简单。我的计算机上存储了一个 .HTML 文件,我想将整个文件读入一个字符串。当我尝试超级简单的时候

Dim FileAsString as string 

Open "C:\Myfile.HTML" for input as #1
Input #1, FileAsString
Close #1

debug.print FileAsString

我没有得到整个文件。我只得到前几行(我知道立即窗口被切断,但这不是问题。我绝对不会将整个文件放入我的字符串中。)我还尝试使用文件系统对象的替代方法,并且得到了类似的结果,只是这次有很多奇怪的字符和问号。这让我觉得这可能是某种编码问题。 (虽然坦率地说,我并不完全理解这意味着什么。我知道有不同的编码格式,这可能会导致字符串解析出现问题,但仅此而已。)

所以更一般地说,这是我真正想知道的:如何使用 vba 打开任何扩展名(可以在文本编辑器中查看)和长度(不超过 VBA 的字符串限制)的文件),并确保我在基本文本编辑器中看到的任何字符都是读入字符串的? (如果这不能(轻松)完成,我当然希望有人指出一种可能适用于 .html 文件的方法)非常感谢您的帮助

编辑: 这是我使用建议的方法时发生的情况的示例。具体

    Dim oFSO As Object
    Dim oFS As Object, sText As String

    Set oFSO = CreateObject("Scripting.FileSystemObject")
    Set oFS = oFSO.OpenTextFile(Path)

    Do Until oFS.AtEndOfStream
        sText = oFS.ReadAll()
    Loop
    FileToString = sText

    Set oFSO = Nothing
    Set oFS = Nothing

End Function

我将向您展示开头(通过消息框)和结尾(通过即时窗口),因为两者在不同的方面都很奇怪。在这两种情况下,我都会将其与 chrome 中显示的 html 源的屏幕截图进行比较:

开始:

结束:

【问题讨论】:

  • 你能提供一个编码文本的例子吗?
  • 在这里快速搜索显示了其他类似的问题。也许这个可能会有所帮助:stackoverflow.com/questions/1376756/…
  • 问号通常表示并非在所有字体或操作系统中都表示的双字节 unicode 字符...您可以尝试使用ADODB 流来读取内容,但我怀疑您的 HTML 文档有问题。
  • @osknows 我添加了原始文件的屏幕截图,以及尝试使用下面的upvoted 方法将其读入字符串时得到的结果。 (非常感谢您的所有帮助)
  • @osknows 文件的内容是 XMLHTTP 对象的 .responseText。问题可能是我在文件名末尾添加的有点随意的“.html”吗?

标签: html vba excel io


【解决方案1】:

这是一种方法

Option Explicit

    Sub test()

    Dim oFSO As Object
    Dim oFS As Object, sText As String

    Set oFSO = CreateObject("Scripting.FileSystemObject")
    Set oFS = oFSO.OpenTextFile("C:\Users\osknows\Desktop\import-store.csv")

    Do Until oFS.AtEndOfStream
    ' sText = oFS.ReadLine 'read line by line
    sText = oFS.ReadAll()
    Debug.Print sText
    Loop
    End Sub

编辑:

尝试将以下行更改为以下 3 行之一,看看是否有任何不同

http://msdn.microsoft.com/en-us/library/aa265347(v=vs.60).aspx

Set FS = FSO.OpenTextFile("C:\Users\osknows\Desktop\import-store.csv", 1, 0)
Set FS = FSO.OpenTextFile("C:\Users\osknows\Desktop\import-store.csv", 1, 1)
Set FS = FSO.OpenTextFile("C:\Users\osknows\Desktop\import-store.csv", 1, 2)

EDIT2:

这段代码对你有用吗?

Function ExecuteWebRequest(ByVal url As String) As String

    Dim oXHTTP As Object

    Set oXHTTP = CreateObject("MSXML2.XMLHTTP")
    oXHTTP.Open "GET", url, False
    oXHTTP.send
    ExecuteWebRequest = oXHTTP.responseText
    Set oXHTTP = Nothing

End Function

Function OutputText(ByVal outputstring As String)
    MyFile = ThisWorkbook.Path & "\temp.html"
    'set and open file for output
    fnum = FreeFile()
    Open MyFile For Output As fnum
    'use Print when you want the string without quotation marks
    Print #fnum, outputstring
    Close #fnum
End Function

Sub test()
Dim oFSO As Object
Dim oFS As Object, sText As String
Dim Uri As String, HTML As String

    Uri = "http://www.forrent.com/results.php?search_type=citystate&page_type_id=city&seed=859049165&main_field=12345&ssradius=-1&min_price=%240&max_price=No+Limit&sbeds=99&sbaths=99&search-submit=Submit"
    HTML = ExecuteWebRequest(Uri)
    OutputText (HTML)

    Set oFSO = CreateObject("Scripting.FileSystemObject")
    Set oFS = oFSO.OpenTextFile(ThisWorkbook.Path & "\temp.html")

    Do Until oFS.AtEndOfStream
    ' sText = oFS.ReadLine 'read line by line
    sText = oFS.ReadAll()
    Debug.Print sText
    Loop

End Sub

【讨论】:

  • 所以这会起作用,除了它似乎在每个字符之后惰性化一个空格。再次使用奇怪的编码...
  • @ebrts 请包括您的 HTML 内容的屏幕截图或示例以及“奇怪”输出,以便我们更好地诊断正在发生的事情。谢谢!
【解决方案2】:

好的,所以我终于设法解决了这个问题。 VBA 文件系统对象只能读取 asciiII 文件,我已将我的保存为 unicode。有时,就像我的情况一样,保存 asciiII 文件可能会导致错误。但是,您可以通过将文件转换为二进制文件,然后再转换回字符串来解决此问题。详情请看http://bytes.com/topic/asp-classic/answers/521362-write-xmlhttp-result-text-file

【讨论】:

    【解决方案3】:

    回答有点晚了,但我今天做了这件事(效果很好):

    Sub modify_local_html_file()
        Dim url As String
        Dim html As Object
        Dim fill_a As Object
    
        url = "C:\Myfile.HTML"
    
        Dim oFSO As Object
        Dim oFS As Object, sText As String
    
        Set oFSO = CreateObject("Scripting.FileSystemObject")
        Set oFS = oFSO.OpenTextFile(url)
    
        Do Until oFS.AtEndOfStream
            sText = oFS.ReadAll()
            Debug.Print sText
        Loop
    
        Set html = CreateObject("htmlfile")
        html.body.innerHTML = sText
    
        oFS.Close
        Set oFS = Nothing
    
        '# grab some element #'
        Set fill_a = html.getElementById("val_a")
    
        MsgBox fill_a.innerText
    
        '# change its inner text #'
        fill_a.innerText = "20%"
    
        MsgBox fill_a.innerText
    
        '# open file this time to write to #'
        Set oFS = oFSO.OpenTextFile(url, 2)
    
        '# write it modified html #'
        oFS.write html.body.innerHTML
        oFS.Close
    
        Set oFSO = Nothing
        Set oFS = Nothing
    
    End Sub
    

    【讨论】:

      猜你喜欢
      • 2018-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-30
      • 2017-09-12
      相关资源
      最近更新 更多