2

次の Web サイトから NFL の新兵に関するデータを抽出しようとしています。

http://espn.go.com/college-sports/football/recruiting/rankings/_/class/2013

すべてのポジションにアクセスし、情報を Excel スプレッドシートにコピー/貼り付け/抽出する必要があります。以下に示すように、これらの各位置の URL の唯一の違いは大文字の VARIABLE です。アスリートからコーナーバック、ワイドレシーバーに変更するには、この変数が必要です。

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 がスタックすることです (カーソルのために回転し続ける小さな円形ディスクがあります)。Esc キーを押してコードを停止すると、Excel スプレッドシートにコピーされた位置が 1 つしかないことがわかりました。私のコードを見て、すべての位置をループし、すべての情報を(次々に)スプレッドシートにコピーするために変更できることを教えてください。

ありがとうございます。

4

2 に答える 2

4

私が最初にコードを実行したとき、あなたが説明したのと同じ経験をしました。約 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 秒の間でした。

ここでは、ワイドレシーバーを完全に通過したことがわかります。

ここに画像の説明を入力


ネストされたループの質問

外側のループを年ループとして記述します。したがってFor i = 0 To 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
于 2013-11-01T02:41:38.763 に答える
0

あなたのコードは正常に動作しています。データを取得するためのインターネット接続が遅い/ない可能性があります。

これはそれがどのように見えるかです

エクセルページ

100WRを獲得しています。初めてループを実行して停止すると、100 ATH が得られます。

for ループが実行QueryTableされて 1 つの行に配置され、データがいっぱいになる前に次の行が 1 行下に配置され、上書きされる可能性があるようです。代わりに、それぞれを別のワークシートに入れます。

于 2013-11-01T00:35:24.430 に答える