在Excel VBA上检索多行文本
我是一个新手,擅长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
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中的值。非常感谢你的帮助!!!