1

我是 Excel VBA 的新手。这就是问题所在:给定一个标识符,我想从网页中检索一些文本。理想情况下,我想将页面文本存储在单个单元格中。我创建了一个创建 QueryTable 的函数,但有时,检索到的文本会复制到多行上。

有没有办法将所有文本放在一个单元格上?

这是我的函数的代码:

Function Articolo(myRange As Range, code As String)
  Dim myURL As String
  Dim myName As String

  myURL = "URL;http://techstore.runner.it/feed/dettagli_csv.php?codcli=111367&pwd=03142110786&sku=" & code
  myName = "dettagli_csv.php?codcli=111367&pwd=03142110786&sku=" & code

  With ActiveSheet.QueryTables.Add(Connection:= _
    myURL _
    , Destination:=myRange)
    .Name = myName
    .FieldNames = True
    .RowNumbers = False
    .FillAdjacentFormulas = False
    .PreserveFormatting = False
    .RefreshOnFileOpen = False
    .BackgroundQuery = True
    .RefreshStyle = xlOverwriteCells
    .SavePassword = False
    .SaveData = True
    .AdjustColumnWidth = False
    .RefreshPeriod = 0
    .WebSelectionType = xlEntirePage
    .WebFormatting = xlWebFormattingNone
    .WebPreFormattedTextToColumns = False
    .WebConsecutiveDelimitersAsOne = False
    .WebSingleBlockTextImport = True
    .WebDisableDateRecognition = False
    .WebDisableRedirections = False
    .WebConsecutiveDelimitersAsOne = True
    .Refresh BackgroundQuery:=False
  End With
End Function

作为测试,您可以使用 8E4374 作为代码

谢谢你的帮助!

4

2 回答 2

0

看起来来自该 URL 的数据中嵌入了回车符和换行符。这就是为什么它在excel中分成不同的单元格。

一种解决方案是运行 VBA 代码来执行查询,去掉回车/换行字符,然后将结果放入单元格中。问题是您必须运行代码来更新,而不是使用 excel 来处理刷新。

一个更简单的答案可能是使用如下公式添加另一个单元格:

=A1&" "&A2&" "&A3&" "&A4
于 2012-09-29T06:10:54.113 回答
0

查询表通常很慢而且很麻烦。如果您使用其中一个 httprequest 对象,它会更快,并且您可以更好地控制如何解析响应。下面是不管理会话或检查页面是否缓存的基本示例。

Option Explicit

Sub test()
Dim rng As Range
Dim code As String

    Set rng = Sheet1.Range("A1")
    code = "8E4374"
    Articolo rng, code

End Sub

Sub Articolo(myRange As Range, code As String)
  Dim myURL As String
  Dim myName As String

  myURL = "http://techstore.runner.it/feed/dettagli_csv.php?codcli=111367&pwd=03142110786&sku=" & code
  myRange.Value = ExecuteWebRequest(myURL)

End Sub

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

编辑: 上面的代码设计为作为 Sub 而不是 UDF 运行。由于 UDF 不能影响其他单元格,唯一的选择是将字符串返回到调用单元格或调用设置代码以作为事件或控件(例如按钮)运行

下面是一个示例 UDF,它是从 Excel 调用的,=Articolo(C1)其中 C1 是包含所需代码的任何单元格,例如 8E4374

Option Explicit

Function Articolo(ByVal code As String) As String
Dim myURL As String

  myURL = "http://techstore.runner.it/feed/dettagli_csv.php?codcli=111367&pwd=03142110786&sku=" & code
  Articolo = ExecuteWebRequest(myURL)

End Function

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

此外,由于这是发出 http 请求,因此每次强制重新计算时,您的 UDF 也会重新计算,这可能不是您想要的,因为您可能会发出数百或数千个请求。我建议只从定义的循环中运行一次,例如

For Each code in Listofcodes : <Download Page> : Next code
于 2012-09-29T09:50:57.340 回答