0

これが私のジレンマです。36 の異なるアルバムの位置を得るために、一連の 606 週間分のビルボード 200 チャートを解析する必要があります。これが私がこれまでに持っているものです...

https://docs.google.com/file/d/0B_tgNfDq0kXAakR5eHZ3bzJQVkk/edit?usp=sharing

Billboard は Web サイトを作り直したばかりなので、Excel の Web クエリは非常にきれいでクリーンなテーブルを返すようになりました。ワークシートの列 A と B に 2 つの数式を作成しました。A には関連する日付のリスト (具体的には 2001 年 8 月 18 日から今週までの毎週土曜日) があり、B は日付に基づいてチャートへのハイパーリンクを作成します。チャートの残りの部分は、シートをレビューするアドバイザーのために色分けされています。

また、2001 年 8 月 18 日の日付の最初のグラフを手動で Web クエリし、独自のワークシートにしました。このワークシートは変更されていません。まさに Web クエリが返したものです。

ご覧のとおり、テーブルは列 G にまたがり、各エントリは 3 行を占めます。私は列 C と D に注目しています。各エントリの列 D の行は、(上から順に) タイトル、アーティスト、インプリント|ラベルです。各エントリの列 C の最初の行には、その週の位置が 1 から 200 まで含まれています。出現するパターンは、4 から始まる 3 行ごと (つまり 7、10、13...) に位置とアルバムのタイトルが含まれていることです (列 C & D、それぞれ)、5 から始まる 3 番目のセルごとにアーティストが含まれます。

私が想像していることを平易な英語で説明しようとしますが、これは惨めに失敗する可能性があることをあらかじめご承知おきください.

したがって、マクロは入力として 2 つのセル (入力を受け取ることさえできますか?)、アルバム タイトル、および対応するアーティストを受け取ります。この入力は、各セルに格納されている文字列とセルの場所 (E1、C2 など) の両方をマクロに伝える必要があります。マクロは、行 3 から 608 までの列 A の各 URL をループし、URL を新しいシートにクエリします。この新しいシートをアクティブにし、4 から始まる 3 行ごとに順番にアルバム タイトル文字列を検索する必要があります。一致が見つかったら、一致するクエリ セルの 1 行下のセルをアーティスト名の文字列と比較する必要があります。両方の文字列が対応するクエリ セルの内容と一致する必要がある場合は、列 C の数字 (1 から 200 まで) と、一致するアルバム タイトルのセルと同じ行を「bb200」のセルにコピーする必要があります。クエリされた URL と検索されたアルバム タイトルに対応するシート。ループは、シーケンス内の次の URL で繰り返されるはずです。一致するものが見つからない場合 (アルバムがその週にチャートに表示されなかった場合、または BB が不安定なテーブルを返した場合)、対応するセルは空白のままにする必要があります。URL のリストがなくなると、マクロは終了します。

私の問題は 2 つあります。まず、マクロに関する私の思考プロセスは根本的に健全ですか? そして 2 番目に重要なことですが、VBA でこれをどこから書き始めればよいのか、まったく手がかりがありません。Java、C、そして最近では C++ (具体的には OpenGL) を勉強しました。私は VBA の構文と API にまったく慣れていません。率直に言って、これに取り組む時間は短すぎて、座って言語を正式に学習することはできません。この後、手短に行う予定ですが、この課題は月曜日が期限であり、それがどれほど大規模な事業になるか見当がつきませんでした。

記録のために、マクロは割り当てではありませんが、収集されるデータはそれを完了するために不可欠です。好奇心旺盛な方へ、課題は月曜日までに卒業論文の完全な草案を作成することです。このデータは、私のアドバイザーが私の執筆に含めるように指示したいくつかのグラフを作成するために使用されます。論文自体は、各アルバムの販売実績をサイトから読み取るだけですでに書かれています。

他の卒業生のほとんどが真剣に中途半端なグラフィック表現を提出しているので、あなたは私が上を行くのを手伝ってくれるでしょう. ここまで進んだ唯一の他の学生は、器具を発明し、回路図と AutoCAD 図面を提供しました。しかし、それについては脱線します。

事前に助けてくれてありがとう!!

4

1 に答える 1

3

これで90%くらいは取れると思います。これができない唯一のことは、Web クエリです。

その部分については、マクロ レコーダーを使用して Web クエリを実行し、そのコードをリビジョンに投稿することをお勧めします。それを追加して、ニーズに合わせて調整します。あなたはこれについていくつかの仕事をしなければなりません:)

Option Explicit

Sub TestMacro()
Dim inputVal As String
Dim artistCell As Range
Dim artistName As String
Dim albumCell As Range
Dim albumName As String
Dim ws As Worksheet: Set ws = Sheets("thesisData")
Dim r As Long 'this will be our row iterator variable
Dim hLink As String 'string for each hyperlink in the iteration
Dim wsNew As Worksheet 'this will be used when we create new worksheets
Dim foundRange As Range 'this is how we will locate the album
Dim weekRank As Long 'weekly rank from column C


On Error GoTo InvalidRange  'This error handling is for the input box, to trap invalid arguments.'
'Use an input box to capture the cell address'
inputVal = InputBox("Please enter the cell location containing the ARTIST name", "Input Range")
Set artistCell = Range(inputVal)  'set a Range variable for the artist'
artistName = artistCell.Value  'string variable for artist name'

inputVal = vbNullString 'clear out the inputVal'
'Use an input box again...'
inputVal = InputBox("Please enter the cell location containing the ALBUM name", "Input Range")
Set albumCell = Range(inputVal)  'set a Range variable for the song cell'
albumName = albumCell.Value  'string for song name'
On Error GoTo 0

For r = 3 To 608  'iterate over rows 3 to 608
    hLink = ws.Cells(1, r).Value

    'Add a new sheet after the last sheet in this file'

    Set wsNew = Sheets.Add(After:=Sheets(ThisWorkbook.Sheets.Count))
    wsNew.Name = Format(ws.Cells(r, 2).Value, "YYYY-MM-DD")

    '''' add VBA for web query, here.'
    ''''
    '''' try using the macro recorder and we can tweak it to your needs.'
    ''''
    ''''
    ''''

    'Rather than looping over all the cells in web query...'
    Do
        'Use the FIND method to look for matching album title in column D.'
        ' this uses exact text match, non-case-sensitive.
        Dim fnd

        Set foundRange = wsNew.Columns(4).Find(What:=albumName, After:=ActiveCell, LookIn:= _
            xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:= _
            xlNext, MatchCase:=True, SearchFormat:=False)

        If Not foundRange Is Nothing Then
            'if we've found a match, then just offset by 1 row and check against artist name'
            If foundRange.Offset(1, 0) = artistName Then
                'likewise, just offset the foundRange cell by -1 columns to get the weekly rank'
                weekRank = foundRange.Offset(0, -1)

                'At this point I'm not sure what cell you want to put this value in, '
                ' but I think you want row designated by "r" and the column of the '
                ' album name, so we can do that like this:

                ws.Cells(r, albumCell.Column).Value = weekRank

            End If
        End If
    Loop While Not foundRange Is Nothing


Next

Exit Sub 'before error handling
InvalidRange:     'error handling

MsgBox inputVal & " is not a valid range", vbCritical, "Error!"

End Sub

幸運を!

編集これは、各 Web クエリで一致するものが 1 つだけであることも前提としています。複数ある場合は、最後の一致のみが返されます。データの性質を考えると、これは安全な仮定のように思えますが、そうでない場合はお知らせください。微調整できます。

于 2013-03-31T01:25:05.440 に答える