是否正确释放htmlfile对象?

是否正确释放htmlfile对象?,html,excel,vba,Html,Excel,Vba,这段代码在我第一次尝试时就可以工作,但当我尝试将它复制到Excel中的新宏并将表拉到另一个工作表时,它不会生成任何结果。所以我想我需要关闭/释放我的对象。我做得对吗?你能看到为什么它不能为我拉另一个HTML表的其他原因吗?谢谢 Dim oHTML As Object Dim oTable As Object Dim x As Long Dim y As Long Dim vData As Variant Dim DataS

这段代码在我第一次尝试时就可以工作,但当我尝试将它复制到Excel中的新宏并将表拉到另一个工作表时,它不会生成任何结果。所以我想我需要关闭/释放我的对象。我做得对吗?你能看到为什么它不能为我拉另一个HTML表的其他原因吗?谢谢

Dim oHTML       As Object
Dim oTable      As Object
Dim x           As Long
Dim y           As Long
Dim vData       As Variant
Dim DataSheet As Worksheet

Set DataSheet = ActiveSheet
Set oHTML = CreateObject("HTMLFile")

With CreateObject("WinHTTP.WinHTTPRequest.5.1")
.Open "GET", "http://www.marketwatch.com/investing/fund/" & range("a1").value, False
.send
oHTML.body.innerhtml = .responsetext
End With

For Each oTable In oHTML.Getelementsbytagname("table")
If oTable.classname = "fundstable" Then

    ReDim vData(1 To oTable.Rows.Length, 1 To oTable.Rows(1).Cells.Length)

    For x = 1 To UBound(vData)
        For y = 1 To UBound(vData, 2)
            vData(x, y) = oTable.Rows(x - 1).Cells(y - 1).innertext
        Next y
    Next x

    With Sheets(2).Range("A" & Rows.Count).End(xlUp).Offset(1)
        .Resize(UBound(vData), UBound(vData, 2)).Value = vData
    End With

End If
Next oTable

Set oHTML = Nothing
Set oTable = Nothing
Set htmlfile = Nothing
首先,我要说的是,非常感谢你看这个-我真的很感谢你的时间

您修改的代码可以工作。。。不过,我还是在第一个标签上试穿了一下。看起来我确实需要展示我的代码的其余部分,并更好地描述我正在尝试做的事情

所以,我有多张表,每一张都有不同类别的基金。我把它们都列了出来,每一张纸的格式都是我希望从表中显示的信息。因为当我拉表时,它不是我想要的格式,我的想法是将数据放入表2中,然后自动将表2中的单元格复制到我想要的单元格中

首先,我用以下方法清除表2中的列:

Sheets("Sheet2").Select
Columns("A:T").Select
Range("A276").Activate
Selection.Delete Shift:=xlToLeft
然后我返回到目标工作表(本例中为大值工作表),从单元格A49复制一个标记,并将其粘贴到工作表2单元格A1中

Sheets("Large Value").Select
Range("A1").Select
ActiveCell.Offset((48 + (Z * 10)), 0).Range("A1").Select
Selection.Copy
Sheets("Sheet2").Select
Range("A1").Select
ActiveSheet.Paste
然后我开始你的我的或者你修改过的代码。在上面,它带来了所需的表格,我开始将我想要的单元格再次复制到目标工作表,大值

Cells.Find(What:="fund return", After:=ActiveCell, LookIn:=xlFormulas, _
    LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
    MatchCase:=False, SearchFormat:=False).Activate

ActiveCell.Offset(1, 0).Range("A1").Select
Selection.Copy
Sheets("Large Value").Select
ActiveCell.Offset(1, 1).Range("A1").Select
ActiveSheet.Paste
Application.CutCopyMode = False
For A = 1 To 4
Sheets("Sheet2").Select
ActiveCell.Offset(1, 0).Range("A1").Select
Selection.Copy
Sheets("Large Value").Select
ActiveCell.Offset(1, 0).Range("A1").Select
ActiveSheet.Paste
Application.CutCopyMode = False
Next A

Sheets("Sheet2").Select
ActiveCell.Offset(-4, 1).Range("A1").Select
Selection.Copy
Sheets("Large Value").Select
ActiveCell.Offset(-4, 1).Range("A1").Select
ActiveSheet.Paste
Application.CutCopyMode = False
For B = 1 To 4
Sheets("Sheet2").Select
ActiveCell.Offset(1, 0).Range("A1").Select
Selection.Copy
Sheets("Large Value").Select
ActiveCell.Offset(1, 0).Range("A1").Select
ActiveSheet.Paste
Application.CutCopyMode = False
Next B

Sheets("Sheet2").Select
ActiveCell.Offset(-4, 1).Range("A1").Select
Selection.Copy
Sheets("Large Value").Select
ActiveCell.Offset(-4, 1).Range("A1").Select
ActiveSheet.Paste
Application.CutCopyMode = False
For C = 1 To 4
Sheets("Sheet2").Select
ActiveCell.Offset(1, 0).Range("A1").Select
Selection.Copy
Sheets("Large Value").Select
ActiveCell.Offset(1, 0).Range("A1").Select
ActiveSheet.Paste
Application.CutCopyMode = False
Next C

Next Z
因此,这在我第一次使用我的代码和修改后的代码时都有效。但是,只要我添加第二个标签,比如说大增长,并复制相同的代码,在整个代码中用增长只替换单词Value,它就不会带来任何结果。正确地复制了报价单。。。实际上是第一个股票代码,但是它什么也没有带来,当它寻找基金回报时会出错,因为什么都没有

所以我的想法是,在某种程度上,代码的中间部分与另一个宏混淆了。一旦我删除第二个宏尝试和第二个选项卡,宏1的大值将再次工作

但是现在我想起来了,你的答案/提示是有意义的——而不是把所有的东西都放进表格2,把表格放进目标页面,比如说单元格A1000——或者别的什么,只是不碍事,所以它是从同一张表格复制,而不是在表格之间来回切换。我现在就去试试,然后回来报到


好吧,我想我越来越近了。但还有一个简单的问题——如何从HTML中获取第一个表,而不是每个表的表。有两个表进入,第二个表覆盖第一个表

让我们试一试。您的代码很好,没有理由不使用类似的页面,也就是说它具有相同的结构。所以,我要做的是:

将对工作表的引用(如Sheet2)替换为HTTP请求响应的粘贴。下面是修改后的代码,用注释突出显示

确保将宏放置在正确的位置,即工作簿的专用模块中。要达到此目的,请打开VBA编辑器视图/宏,然后在VBA项目/模块下单击鼠标右键并插入模块。所以,只需复制并粘贴下面的代码

确保基金名称始终位于您希望结果所在的表的A1范围内

确保在浏览器上手动查看链接时,该链接实际上包含与您查找的数据相同的数据

修改代码:


在代码有效的工作表和代码无效的工作表中,A1包含的范围是什么?对不起,应该提供更多详细信息。它只是包含一个股票代码。代码的较长版本有一个从另一个工作表复制过来的代码,然后将结果表中的数据复制回原始工作表。然后重复,例如,当代码不起作用时,你能确保股票代码在那里吗?太棒了!太棒了-所有的工作都和我想要的一样-再次感谢你的知识、时间和努力!
Sub UpdateThisSheet() 'working on the current sheet, you don't need to make X identical macros ;)

Dim oHTML       As Object
Dim oTable      As Object
Dim x           As Long
Dim y           As Long
Dim vData       As Variant
Dim DataSheet As Worksheet

Set DataSheet = ActiveSheet
Set oHTML = CreateObject("HTMLFile")

With CreateObject("WinHTTP.WinHTTPRequest.5.1")
.Open "GET", "http://www.marketwatch.com/investing/fund/" & ActiveSheet.Range("a1").Value, False 
.send
oHTML.body.innerhtml = .responsetext
End With

For Each oTable In oHTML.Getelementsbytagname("table")
If oTable.classname = "fundstable" Then

    ReDim vData(1 To oTable.Rows.Length, 1 To oTable.Rows(1).Cells.Length)

    For x = 1 To UBound(vData)
        For y = 1 To UBound(vData, 2)
            vData(x, y) = oTable.Rows(x - 1).Cells(y - 1).innertext
        Next y
    Next x

    With ActiveSheet.Range("A" & Rows.Count).End(xlUp).Offset(1) 'data goes in the current sheet, not always in sheet 2 !
        .Resize(UBound(vData), UBound(vData, 2)).Value = vData
    End With

Exit For 'NEW LINE TO ESCAPE THE CODE ONCE THE FIRST TABLE HAS BEEN REPORTED

End If
Next oTable

Set oHTML = Nothing
Set oTable = Nothing
Set htmlfile = Nothing

End Sub