Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


4941 / 13644 ツリー ←次へ | 前へ→

【51833】WEBクエリできないサイト ぶどう 07/10/6(土) 18:08 質問[未読]
【51856】Re:WEBクエリできないサイト ichinose 07/10/8(月) 8:59 発言[未読]
【51868】Re:WEBクエリできないサイト ぶどう 07/10/8(月) 20:44 お礼[未読]
【51873】Re:WEBクエリできないサイト ichinose 07/10/9(火) 7:39 発言[未読]
【51892】Re:WEBクエリできないサイト ぶどう 07/10/9(火) 20:13 お礼[未読]

【51833】WEBクエリできないサイト
質問  ぶどう  - 07/10/6(土) 18:08 -

引用なし
パスワード
   このURの表: ht:/portal.xfnj.com/msn/index.php?option=com_xfn_company&Itemid=39&action=finance&code=0001_HK

がWEBクエリで取り込みできないのですが、何かいい方法はないでしょうか?(直接コピーペースト以外の方法)
文字コードがUTF8であることが関係しているのでしょうか。

【51856】Re:WEBクエリできないサイト
発言  ichinose  - 07/10/8(月) 8:59 -

引用なし
パスワード
   ▼ぶどう さん:
こんばんは。

>このURの表: ht:/portal.xfnj.com/msn/index.php?option=com_xfn_company&Itemid=39&action=finance&code=0001_HK

↑これの「会計年度・・・」という表が取得できれば良いのですか?

だとしたら、

>がWEBクエリで取り込みできないのですが、何かいい方法はないでしょうか?(直接コピーペースト以外の方法)

Webクエリは使ったことがないのですが,
直接コピーペーストでなければ良いのなら・・・。

新規ブックの標準モジュールに

'===============================================================
Sub main()
  On Error Resume Next
  Dim ie As Object
  Dim tbl As Object
  Dim rw As Object
  Dim cll As Object
  Dim g0 As Long, g1 As Long
  Dim cnt As Long
  Set ie = CreateObject("InternetExplorer.Application")
  With ie
    .Visible = True
    .navigate "HTTP://portal.xfnj.com/msn/index.php?option=com_xfn_company&Itemid=39&action=finance&code=0001_HK"
'         ↑頭のHTTPを半角小文字に修正後、実行すること
    Do While .Busy = True Or .readyState <> 4
     Loop
    For Each tbl In .document.body.all
     If TypeName(tbl) = "HTMLTable" Then
       If tbl.Rows(0).Cells(0).innertext = "会計年度" Then
        cnt = tbl.Rows(0).Cells.Length
        For Each rw In tbl.Rows
          g1 = 0
          For Each cll In rw.Cells
            Cells(g0 + 1, g1 + 1).Value = cll.innertext
            g1 = g1 + 1
            Next
          g0 = g0 + 1
          Next
        End If
       End If
     Next
    .Quit
    End With
  Range(Columns(1), Columns(5)).AutoFit
  Set tbl = Nothing
  Set ie = Nothing
  Set rw = Nothing
  Set cll = Nothing
End Sub


上記のmainの実行でアクティブシートに会計年度以下の表が表示されます。
(** URLのHTTPを半角小文字に修正すること)

Win2000 & Excel2002にて確認しました。

試してみてください。

【51868】Re:WEBクエリできないサイト
お礼  ぶどう  - 07/10/8(月) 20:44 -

引用なし
パスワード
   ichinose さん、ありがとうございます。
すばらしいです。
特定の表のみ取り込むこともできるんですね。
とりあえずやりたいことはできるようになりました。時々取り込みできないサイトがあったのですがこれで応用が効くようになりました。

あとは、この処理を1000回繰り返すとして高速化のために、

1. WEBの画像を表示しないで文字のみ取り込みできるか。又は画像が表示されるのを完全に待つことなく取り込み始めることができるか。

2. 1セル毎の記入式の取り込みではなく、WEBの文字部分全体(特定の表だけでなくてよいので)一括取り込みできるか。


例えば、以下のコードですと全体が一括取得できて、その後に必要な部分のみ取り出すということができますが、同じ感覚で CreateObject("InternetExplorer.Application") 方式でWEBページ全体を一括取り込みできないでしょうか? 複数の必要な表が含まれているWEBページですと、一旦全部取り込んだ方が簡単かと思いまして。

Sub main()
With ActiveSheet.QueryTables.Add(Connection:= _
    "URL;HTTP://stock.searchina.ne.jp/data/code.cgi?market=&code=0001", Destination:=Worksheets("Sheet1").Range("A1"))
'    "URL;HTTP://stock.searchina.ne.jp/data/code.cgi?market=&code=" + code + "", Destination:=Worksheets("Sheet1").Range("A1"))
    .FieldNames = True
    .RowNumbers = False
    .FillAdjacentFormulas = False
    .PreserveFormatting = True
    .RefreshOnFileOpen = False
    .BackgroundQuery = True
    .RefreshStyle = xlInsertDeleteCells
    .SavePassword = False
    .SaveData = True
    .AdjustColumnWidth = False
    .RefreshPeriod = 0
    .WebSelectionType = xlAllTables
    .WebFormatting = xlWebFormattingNone
    .WebPreFormattedTextToColumns = True
    .WebConsecutiveDelimitersAsOne = True
    .WebSingleBlockTextImport = False
    .WebDisableDateRecognition = False
    .Refresh BackgroundQuery:=False
  End With
End Sub

【51873】Re:WEBクエリできないサイト
発言  ichinose  - 07/10/9(火) 7:39 -

引用なし
パスワード
   ▼ぶどう さん:
おはようございます。


>あとは、この処理を1000回繰り返すとして高速化のために、
>
>1. WEBの画像を表示しないで文字のみ取り込みできるか。又は画像が表示されるのを完全に待つことなく取り込み始めることができるか。

IE自体は非表示でも可能ですが、時間的な差はありませんでしたよ!!
但し、読み込みは全ての表示が完了しないと駄目ですよ!!

>2. 1セル毎の記入式の取り込みではなく、WEBの文字部分全体(特定の表だけでなくてよいので)一括取り込みできるか。

テキストデータの一括での取得は可能です。



ie.document.body.innertext

等とすると表示されているテキストを一括で取得できますが、
それぞれの内容に分割しなければなりません
(いや、分割できれば良いですが、区切り文字がなくてできない場合もあります)。

よって、表の要素を一つずつ取得する方法しか思い浮かびませんでした。
但し、以下のコードで私の環境ではWebクエリと大きい時間差はありませんでしたよ!!


'======================================
Sub main2()
  On Error Resume Next
  Dim ret As Long
  Dim ie As Object
  Dim tbl As Object
  Dim rw As Object
  Dim cll As Object
  Dim idx As Long
  Dim g0 As Long, g1 As Long
  Dim wk1, wk2
  Application.ScreenUpdating = False
  Set ie = CreateObject("InternetExplorer.Application")
  With ie
    .Visible = False
    idx = 1
    For idx = 1 To 5 '←これで 0001〜0005までを表示
     .navigate "HTTP://stock.searchina.ne.jp/data/code.cgi?market=&code=" & Format(idx, "0000")
'         ↑頭のHTTPを半角小文字に修正後、実行すること
     Do While .Busy = True Or .readyState <> 4
       Loop
     For Each tbl In .document.body.all
       If TypeName(tbl) = "HTMLTable" Then
        Err.Clear
        wk1 = "": wk2 = ""
        wk1 = Trim(tbl.Rows(0).Cells(0).innertext)
        wk2 = Trim(tbl.Rows(1).Cells(0).innertext)
        ret = 1
        If Mid(wk1, 1, 4) = Format(idx, "0000") Then
          Cells(g0 + 1, 1).Value = tbl.Rows(0).Cells(0).innertext
          g0 = g0 + 1
          ret = 1
        ElseIf wk2 = "現在値" Then
          ret = 0
        ElseIf wk2 = "売り気配" Then
          ret = 0
        ElseIf wk2 = "現在値の円換算" Then
          ret = 0
          End If
        If ret = 0 Then
          For Each rw In tbl.Rows
           g1 = 0
           For Each cll In rw.Cells
             Cells(g0 + 1, g1 + 1).Value = cll.innertext
             g1 = g1 + 1
             Next
           g0 = g0 + 1
           Next
          End If
        End If
       Next
     g0 = g0 + 1
     Next
    .Quit
    End With
  Range(Columns(1), Columns(2)).AutoFit
  Set tbl = Nothing
  Set ie = Nothing
  Set rw = Nothing
  Set cll = Nothing
  Application.ScreenUpdating = True
End Sub

私は、他人が作ったサイトからデータを取り出す というコードは遊びでしか
作ったことがありません。
もっと速い方法があるかもしれません。

【51892】Re:WEBクエリできないサイト
お礼  ぶどう  - 07/10/9(火) 20:13 -

引用なし
パスワード
   ▼ichinose さん:ありがとうございます。

With ActiveSheet.QueryTables.Add(Connection:= _
 "URL;HTTP://anysite.com/code.cgi?market=&code=0001", Destination:=Worksheets("Sheet1").Range("A1"))


で取り込みできないサイトの時のみ、
CreateObject("InternetExplorer.Application")
方式を使うのが簡単そうですね。

4941 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free