Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Excel VBA上检索多行文本_Excel_Vba - Fatal编程技术网

在Excel VBA上检索多行文本

在Excel VBA上检索多行文本,excel,vba,Excel,Vba,我是一个新手,擅长VBA。问题是: 给定一个标识符,我想从网页中删除一些文本。理想情况下,我希望将页面文本存储在单个单元格中。我创建了一个创建查询表的函数,但有时检索到的文本会复制到多行 有没有办法将所有文本放在一个单元格中 以下是我的函数代码: Function Articolo(myRange As Range, code As String) Dim myURL As String Dim myName As String myURL = "URL;http://techst

我是一个新手,擅长VBA。问题是: 给定一个标识符,我想从网页中删除一些文本。理想情况下,我希望将页面文本存储在单个单元格中。我创建了一个创建查询表的函数,但有时检索到的文本会复制到多行

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

以下是我的函数代码:

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作为代码


谢谢你的帮助

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

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

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

=A1&" "&A2&" "&A3&" "&A4

查询表通常速度慢且繁琐。如果您使用一个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
编辑:上面的代码设计为作为子代码而不是UDF运行。由于UDF不能影响其他单元格,因此唯一的选择是将字符串返回到调用单元格,或调用设置代码以作为事件或从控件(如按钮)运行

下面是一个示例UDF,使用=ArticoloC1从Excel调用,其中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

Excel因试图以自己认为需要的方式格式化内容而臭名昭著。制表符和新行等字符通常用作分隔符,并导致值跨越多行/多列。最好的解决方法是检查返回的字符串,去掉那些值,然后将其输入到cell中,如果我调用,例如,=ArticoloA1;C1由于某种原因返回值!但是如果我要求通过按下按钮来评估公式!选择此选项后签名,结果正确。你知道这有什么不对吗?无论如何,谢谢你的帮助=ArticoloA1;C1将函数Articolo用作UDF。无法使用UDF更改其他单元格,因此需要使用=ArticoloC1将函数返回给调用单元格,然后更改函数。我将更新我的答案,以展示如何使其作为UDF工作。嗨,别担心!感谢您对UDF函数的建议,我成功地修复了它!现在,该函数只获取一个参数cose作为字符串,并返回Articolo=ExecuteWebRequestmyURL中的值。非常感谢你的帮助!!!