Vba 正在尝试将网站中的数据提取到Excel中。For循环不工作

Vba 正在尝试将网站中的数据提取到Excel中。For循环不工作,vba,excel,extract,Vba,Excel,Extract,我正试图从以下网站提取有关NFL新兵的数据: http://espn.go.com/college-sports/football/recruiting/rankings/_/class/2013 我需要访问每个职位,并将信息复制粘贴/提取到Excel电子表格中。正如您在下面看到的,每个位置的URL的唯一区别是caps中的变量。我需要这个变量从运动员到边后卫再到宽接球手 http://espn.go.com/college-sports/football/recruiting/playerra

我正试图从以下网站提取有关NFL新兵的数据:

http://espn.go.com/college-sports/football/recruiting/rankings/_/class/2013
我需要访问每个职位,并将信息复制粘贴/提取到Excel电子表格中。正如您在下面看到的,每个位置的URL的唯一区别是caps中的变量。我需要这个变量从运动员到边后卫再到宽接球手

http://espn.go.com/college-sports/football/recruiting/playerrankings/_/position/VARIABLE/class/2013/view/position
以下是我正在使用的代码:

Dim array_example(18) As String

Sub Macro1()


        array_example(0) = "athlete"
        array_example(1) = "cornerback"
        array_example(2) = "defensive-end"
        array_example(3) = "defensive-tackle"
        array_example(4) = "fullback"
        array_example(5) = "inside-linebacker"
        array_example(6) = "kicker"
        array_example(7) = "offensive-center"
        array_example(8) = "offensive-guard"
        array_example(9) = "outside-linebacker"
        array_example(10) = "offensive-tackle"
        array_example(11) = "quarterback-dual-threat"
        array_example(12) = "quarterback-pocket-passer"
        array_example(13) = "running-back"
        array_example(14) = "safety"
        array_example(15) = "tight-end-h"
        array_example(16) = "tight-end-y"
        array_example(17) = "wide-receiver"

        For i = 0 To 17

            LastUsedRow = ActiveSheet.Range("A1").Offset(Sheet1.Rows.Count - 1, 0).End(xlUp).Row

            LastEmptyRow = LastUsedRow + 1

            Cell = "A" & LastEmptyRow


            With ActiveSheet.QueryTables.Add(Connection:="URL;http://espn.go.com/college-sports/football/recruiting/playerrankings/_/position/" & array_example(i) & "/class/2013/view/position" & "", Destination:=Range("" & Cell & ""))
                .Name = "s"
                .FieldNames = True
                .RowNumbers = True
                .FillAdjacentFormulas = False
                .PreserveFormatting = True
                .RefreshOnFileOpen = False
                .BackgroundQuery = True
                .RefreshStyle = xlInsertEntireCells
                .SavePassword = False
                .SaveData = True
                .AdjustColumnWidth = True
                .RefreshPeriod = 0
                .WebSelectionType = xlAllTables
                .WebFormatting = xlWebFormattingNone
                .WebPreFormattedTextToColumns = True
                .WebConsecutiveDelimitersAsOne = False
                .WebSingleBlockTextImport = False
                .WebDisableDateRecognition = False
                .WebDisableRedirections = False
                .Refresh BackgroundQuery:=True


            End With

        Next i

End Sub
我的问题是,每次我运行这段代码时,excel都会被卡住(有一个小圆盘一直在旋转光标)。当我按Escape停止代码时,我发现只有一个位置已复制到Excel电子表格。你能看一下我的代码,让我知道我可以改变什么,让它循环所有的位置,并将所有的信息(一个接一个)复制到电子表格中吗


非常感谢。

您的代码运行良好。可能您的网络连接速度慢/没有网络连接来获取数据

这就是它看起来的样子

我得了100分。如果我第一次运行循环并停止它,我得到100 ATH


看起来for循环正在运行,将
QueryTable
放在一行中,然后在数据填充之前,将下一行放在下一行,可能会覆盖它。我会把每一个放在一个单独的工作表中。

您的代码运行良好。可能您的网络连接速度慢/没有网络连接来获取数据

这就是它看起来的样子

我得了100分。如果我第一次运行循环并停止它,我得到100 ATH


看起来for循环正在运行,将
QueryTable
放在一行中,然后在数据填充之前,将下一行放在下一行,可能会覆盖它。我会将每个代码放在一个单独的工作表中。

当我第一次运行代码时,我有与您描述的相同的体验。我等了大约2分钟,结束了进程,发现只有前100个加载了

我走进去,把这一行改为
false
,这样我就可以看到它正在加载

.Refresh BackgroundQuery:=False

我还在
Next I
之前添加了一个调试行,这样我就可以观察它是否真的遍历了所有地址

    End With
  Debug.Print "next " & i
Next i

现在,当我运行它时,只花了大约30秒就完成了所有18个地址。excel中超过3000行的结果

然后我添加了一个简单的计时器,以查看每一步需要多长时间。这次总共只用了12秒

next 0 - 0 seconds
next 1 - 1 seconds
next 2 - 1 seconds
next 3 - 1 seconds
next 4 - 0 seconds
next 5 - 0 seconds
next 6 - 3 seconds
next 7 - 1 seconds
next 8 - 0 seconds
next 9 - 1 seconds
next 10 - 0 seconds
next 11 - 0 seconds
next 12 - 2 seconds
next 13 - 1 seconds
next 14 - 0 seconds
next 15 - 0 seconds
next 16 - 1 seconds
next 17 - 0 seconds
Total Time: 12

接下来,将backgroundQuery更改回true。计时器在不到1秒的时间内完成了18次计数,仅显示前100次结果。这就像excel在设置所有连接之前运行代码,所以它只有足够的时间设置第一个连接

因此,我建议将背景查询设置为false。每次我尝试时,时间都在12到30秒之间

在这里你可以看到,它通过一个宽的接收器一路前进


嵌套循环问题

将外部循环写为您的年度循环。因此,在i=0到17之前,添加以下内容:

  For x = 2006 to 2013
    For i = 0 To 17

     '...continue your code

     ' Change With line to this:
     With ActiveSheet.QueryTables.Add(Connection:="URL;http://espn.go.com/college-sports/football/recruiting/playerrankings/_/position/" & array_example(i) & "/class/" & CStr(x) & "/view/position" & "", Destination:=Range("" & Cell & ""))

     '...continue your code

   Next i
  Next x
End Sub

当我第一次运行代码时,我有与您描述的相同的体验。我等了大约2分钟,结束了进程,发现只有前100个加载了

我走进去,把这一行改为
false
,这样我就可以看到它正在加载

.Refresh BackgroundQuery:=False

我还在
Next I
之前添加了一个调试行,这样我就可以观察它是否真的遍历了所有地址

    End With
  Debug.Print "next " & i
Next i

现在,当我运行它时,只花了大约30秒就完成了所有18个地址。excel中超过3000行的结果

然后我添加了一个简单的计时器,以查看每一步需要多长时间。这次总共只用了12秒

next 0 - 0 seconds
next 1 - 1 seconds
next 2 - 1 seconds
next 3 - 1 seconds
next 4 - 0 seconds
next 5 - 0 seconds
next 6 - 3 seconds
next 7 - 1 seconds
next 8 - 0 seconds
next 9 - 1 seconds
next 10 - 0 seconds
next 11 - 0 seconds
next 12 - 2 seconds
next 13 - 1 seconds
next 14 - 0 seconds
next 15 - 0 seconds
next 16 - 1 seconds
next 17 - 0 seconds
Total Time: 12

接下来,将backgroundQuery更改回true。计时器在不到1秒的时间内完成了18次计数,仅显示前100次结果。这就像excel在设置所有连接之前运行代码,所以它只有足够的时间设置第一个连接

因此,我建议将背景查询设置为false。每次我尝试时,时间都在12到30秒之间

在这里你可以看到,它通过一个宽的接收器一路前进


嵌套循环问题

将外部循环写为您的年度循环。因此,在i=0到17之前,添加以下内容:

  For x = 2006 to 2013
    For i = 0 To 17

     '...continue your code

     ' Change With line to this:
     With ActiveSheet.QueryTables.Add(Connection:="URL;http://espn.go.com/college-sports/football/recruiting/playerrankings/_/position/" & array_example(i) & "/class/" & CStr(x) & "/view/position" & "", Destination:=Range("" & Cell & ""))

     '...continue your code

   Next i
  Next x
End Sub

我试过你的代码,它运行正常。你得到所有的观察结果了吗?还是只有100左右(按等级衡量?当我尝试的时候,一个职位我只得到100。我尝试了你的代码,它工作了。你得到了所有的观察结果吗?还是只有100左右(按等级衡量?当我尝试时,一个职位我只得到100。谢谢你的评论。你能告诉我你是否得到了所有的观察结果吗?如果是,需要多长时间?当我检查时,我最多只得到100个观察结果(按等级衡量)。我希望得到所有位置的大约100个观测值,总计约900个OB。请让我知道。感谢更新。我需要一年的所有数据(本例中为2013年)在一张工作表中。最好是,我希望先填写一个职位的观察结果,然后再在它前面的行中填写另一个职位。你知道实现这一点的方法吗?@SidharthMoktan如果你确定只有100个,那么你可以每110行间隔一个表格。但这不是很有程序性。你的方法搜索最后一行并向上移动是一种方法,除非您需要等待每个查询表完成后再转到下一行。没有刷新属性(在excel vba中)但是我可以找到停止等待的方法。你认为如果我使用计时延迟会有帮助吗?我在StackOverflow中四处查看,发现以下命令。Application.Wait(现在+时间值(“0:00:01”)))。Cou