VBAについて質問です。


現在VBAで、ページのログイン処理を施し、ログイン後にページへ移動するということを行っています。

ログイン処理を施す所まで、出来たのですが、ログイン後に、ログイン状態を維持したままにして再度ほかのページへ移動する事ができません。

実際に自分で objIE.Navigate を使用して、移動してみたのですが うまくいく事ができませんでした。

大変お手数をおかけしますが、ログイン後のページ移動処理を、プログラムの詳しい方に見ていただければと考えております。

お手数をおかけしますがよろしくお願いいたします。

回答の条件
  • 1人2回まで
  • 登録:2009/12/11 10:31:19
  • 終了:2009/12/11 18:38:25

ベストアンサー

id:HALSPECIAL No.1

HALSPECIAL回答回数407ベストアンサー獲得回数862009/12/11 11:55:54

ポイント100pt

確認してみましたが、

ログイン後に、ウオッチリストとか落札分のページに移動することができました。

(セッションを維持しているということ)

おそらくリクエストが正しくないので、希望のページに移動できないのでしょう。

★ここに変数を入れたいです。★

のところは、YahooIDではないと思います。

また、取引連絡の詳細のページのURLは、

HTML中から抜き出して、そのURLに移動(Navigate)するか、

取引連絡のボタンを押して移動(ClickとかSubmitとか)することになります。

id:aiomock

ご回答ありがとうございます。

私の説明不足で、URLを作成するには4つの要素が必要でした。


1つは page の値を自動で変更する要素

2つは オークション商品のIDを入れる要素

3つは お客様のヤフーIDを入れる要素

4つは crumbというランダムな値を入れる要素


この4つの要素を含むURLを作成して移動、移動後htmlの情報を取得したいと考えています。


説明不足で申し訳ありません。。

2009/12/11 13:41:43
  • id:aiomock
    コードは以下になります。

    Option Explicit

    Dim objIE As InternetExplorer
    Const READYSTATE_COMPLETE = 4
    Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)


    Sub LoginTest()
    Set objIE = CreateObject("InternetExplorer.Application")
    objIE.Visible = True

    objIE.Navigate2 "https://login.yahoo.co.jp/config/login?.lg=jp&.intl=jp&.src=auc&.done=http://auctions.yahoo.co.jp/jp"
    While objIE.ReadyState <> READYSTATE_COMPLETE Or objIE.Busy = True
    Sleep 200
    Wend

    Dim objDoc As HTMLDocument
    Set objDoc = objIE.Document 'ドキュメントのオブジェクトに一旦入れてみたり、

    objDoc.getElementById("username").Value = "xxxxxx"

    Dim pwd As HTMLInputElement
    Set pwd = objDoc.getElementById("passwd") 'INPUT要素のオブジェクトに入れてみたり、
    pwd.Value = "zzzzzzz"

    objDoc.login_form.submit

    Set pwd = Nothing
    Set objDoc = Nothing


    While 条件式(Aに入っている最終データまでの処理を行う)

    Dim A As Integer '整数型 A1~A最終までのデータをひとつずつ整数に入れる。

    objIE.Navigate2 "http://page9.auctions.yahoo.co.jp/show/contact_detail?aID=★ここに変数を入れたいです。★&target=auction_id&no=3&.crumb=iKH9AY0EVII"

    ↑条件として大変お手数をおかけしますが、URLが自動で移り変わるようにしたいです。

    http://page9の所が、ページによっては http://page4 や http://page11 になったりするため。


    Wend

    A1に入っているオークションIDを入力して、取引ナビ(ヤフオクの掲示板になります。)に移動したいと考えています。

    End Sub
  • id:HALSPECIAL
    HALSPECIAL 2009/12/11 12:13:58
    'すみません。書き忘れました。
    'URLに埋め込むとなるとこんな感じになります。

    'A1に入っているオークションIDを入力して、取引ナビ(ヤフオクの掲示板になります。)に移動したいと考えています。
    Const BASE_URL As String = "http://{0}.auctions.yahoo.co.jp/show/contact_detail?aID={1}&target=auction_id&no=3&.crumb=iKH9AY0EVII"

    Range("A1").Select
    Do Until ActiveCell.Value = ""
    Dim url As String
    url = Replace(BASE_URL, "{0}", "page9") 'page9とかpage1とか
    url = Replace(BASE_URL, "{1}", ActiveCell.Value)
    ActiveCell.Offset(1, 0).Activate
    objIE.Navigate2 url
    While objIE.ReadyState <> READYSTATE_COMPLETE Or objIE.Busy = True
    Sleep 200
    Wend
    '何かの処理
    Loop
  • id:aiomock
    ご回答ありがとうございます。

    Const BASE_URL As String = "http://{0}.auctions.yahoo.co.jp/show/contact_detail?aID={1}&target=auction_id&no=3&.crumb=iKH9AY0EVII"

    ですが、大変申し訳ありません。

    http://{0}.auctions.yahoo.co.jp/show/contact_detail?aID={1}&target=auction_id&no=3&.crumb=iKH9AY0EVII



    http://{0}.auctions.yahoo.co.jp/show/contact_detail?aID={1}&target={2}&no=3&.crumb={3}

    が付け加えられ

    A列に商品ID、B列にオークションIDをC列にcrumbの値を入力しないといけないことがわかりました。

    crumbの値ですが、一回ブラウザを起動してログインして、またログアウトして、ログインすると値がランダムに変わってしまいます。商品ごとに Crumbの値は変わったりするのかなと思っていたのですが、使用しているブラウザでログインしている間はずっと同じCrumbがURLの後ろにつきます。

    そこでまず、前回ご回答いただいたやり方で、最初にログインした後、ログインした後に適当に商品ページのCrumbの値をhtmlソースを見て、Crumbの値をC列に入力してその後に処理を施せればと現在考えています。(正規表現で抜け出す方法も理想ではあるのですが、現在わからない為・・。)

    A列とB列にはあらかじめの値が入力されていて、前回までのやり方でログインしたらcrumbの値を見つけ次第C列にコピー&ペースト

    その後にきちんとしたURLを作成し

    http://{0}.auctions.yahoo.co.jp/show/contact_detail?aID={1}&target={2}&no=3&.crumb={3}

    移動。

    移動した後に移動先のHTMLを取得し、自分がお客様に指定した型で入力いただいた顧客情報を正規表現で抜き出す。
    ということをしたいと考えています。
  • id:aiomock
    今回マクロを使用したい流れですが、

    前回ご回答いただいたやり方をログインまでのマクロにして、

    ①ログインマクロでログインする。

    ②ログインが完了したら、今回のブラウザのCrumbの値を手動で取得。←出来れば自動でやりたいです。。

    ③その後、Crumbの値をC列に入力して、エクセルA列、B列、C列を完全に作成します。

    ④次のマクロを起動。

    次のマクロは A列、B列、C列の値を元にURLへ移動し、URLのHTMLを取得。そしてお客様情報をエクセルD列~N列までに正規表現で取得していく。

    という流れで持っていきたいと考えています。


  • id:aiomock
    現在④の段階なのですが、コードがまったく想像できません。。。
    コードは以下の用でいいでしょうか?。。

    'A1に入っているオークションIDを入力して、取引ナビ(ヤフオクの掲示板になります。)に移動したいと考えています。
    Const BASE_URL As String = "http://{0}.auctions.yahoo.co.jp/show/contact_detail?aID={1}&target={2}&no=3&.crumb={3}"

    Range("A1").Select
    Range("B1").Select
    Range("C1").Select
    Do Until ActiveCell.Value = ""
    Dim url As String
    url = Replace(BASE_URL, "{0}", "page9") 'page9とかpage1とか
    url = Replace(BASE_URL, "{1}", ActiveCell.Value)
    url = Replace(BASE_URL, "{2}", ActiveCell.Value)
    url = Replace(BASE_URL, "{3}", ActiveCell.Value)
    ActiveCell.Offset(1, 0).Activate
    objIE.Navigate2 url
    While objIE.ReadyState <> READYSTATE_COMPLETE Or objIE.Busy = True
    Sleep 200
    Wend

    ここに次に正規表現を持ってきたいと考えています。

    Loop
  • id:aiomock
    私の説明不足で混乱を招き申し訳ありません。

    詳しい方おりましたら、ご回答いただければと思います。

    お手数をおかけしますがよろしくお願いいたします。
  • id:HALSPECIAL
    HALSPECIAL 2009/12/11 14:14:27
    Offsetを使って、こんな感じでしょうか。
    http://www.sanynet.ne.jp/~awa/excelvba/kouza/chapt_02/007.html




    'A1に入っているオークションIDを入力して、取引ナビ(ヤフオクの掲示板になります。)に移動したいと考えています。
    Const BASE_URL As String = "http://{0}.auctions.yahoo.co.jp/show/contact_detail?aID={1}&target={2}&no=3&.crumb={3}"

    Range("A1").Select
    Do Until ActiveCell.Value = ""
    Dim url As String
    url = Replace(BASE_URL, "{0}", "page9") 'page9とかpage1とか
    url = Replace(BASE_URL, "{1}", ActiveCell.Value)
    url = Replace(BASE_URL, "{2}", ActiveCell.Offset(0,1).Value)
    url = Replace(BASE_URL, "{3}", ActiveCell.Offset(0,2).Value)
    ActiveCell.Offset(1, 0).Activate
    objIE.Navigate2 url
    While objIE.ReadyState <> READYSTATE_COMPLETE Or objIE.Busy = True
    Sleep 200
    Wend

    ここに次に正規表現を持ってきたいと考えています。

    Loop
  • id:aiomock
    お手数をおかけします。
    ログインマクロを実行し、ログイン後にCrumbの値をC列に入れて、マクロを実行したところ

    オブジェクト変数またはwithブロック変数が設定されていません。

    というエラーが発生してしまいます。エラーが発生しているのは記入したコード

    Sub Macro()

    Const BASE_URL As String = "http://{0}.auctions.yahoo.co.jp/show/contact_detail?aID={1}&target={2}&no=3&.crumb={3}"

    Range("A1").Select
    Do Until ActiveCell.Value = ""
    Dim url As String
    url = Replace(BASE_URL, "{0}", "page9") 'page9とかpage1とか
    url = Replace(BASE_URL, "{1}", ActiveCell.Value)
    url = Replace(BASE_URL, "{2}", ActiveCell.Offset(0, 1).Value)
    url = Replace(BASE_URL, "{3}", ActiveCell.Offset(0, 2).Value)
    ActiveCell.Offset(1, 0).Activate
    objIE.Navigate2 url
    While objIE.ReadyState <> READYSTATE_COMPLETE Or objIE.Busy = True
    Sleep 200
    Wend

    Loop

    End Sub


    の objIE.Navigate2 url の所です。

    これは Navigate2 url をどうにかして定義をしないといけないということなのでしょうか?

    初歩的な質問で申し訳ありませんが、わかるかたおりましたらご回答をおまちしております。

  • id:HALSPECIAL
    HALSPECIAL 2009/12/11 15:31:05
    IEがCreateObjectされていないのが原因ではないでしょうか?



    Option Explicit

    Dim objIE As InternetExplorer
    Const READYSTATE_COMPLETE = 4
    Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

    Sub Macro()

    Const BASE_URL As String = "http://{0}.auctions.yahoo.co.jp/show/contact_detail?aID={1}&target={2}&no=3&.crumb={3}"

    Set objIE = CreateObject("InternetExplorer.Application")
    objIE.Visible = True

    Range("A1").Select
    '・・・
  • id:aiomock
    ご回答ありがとうございます。
    無事に実行することができました。

    IEを定義しないといけないと思っていたのは CreateObjectでインターネットエクスプローラーを定義すればよかったのですね^^。

    しかし、実行をしてみたのですが

    IEを起動したら

    http://%7B0%7D.auctions.yahoo.co.jp/show/contact_detail?aID={1}&target={2}&no=3&.crumb=tnQZWzSFtNl

    のURLへ移動しました。。

    ページ表記は

    エラー: このリンクは無効です。  

    となっております。

    見たところ

    ①ページ指定の所 %7B0%7D
    ②商品IDの所 {1}
    ③お客様のヤフーIDの所 {2}

    がうまくいっていないです。

    C列に入れていたCrumbの値はうまく入力されていたみたいですが、A列の商品ID、そしてB列のオークションIDがうまく入っていません。そしてページ指定が文字化けのようになっております。

    これらは変数の定義が間違っているから起こっているのでしょうか?

    大変お手数をおかけしますが、詳しい方おりましたらご指摘をよろしくお願いいたします。
  • id:HALSPECIAL
    HALSPECIAL 2009/12/11 16:18:03
    まずはURL変数の中身をデバッグ出力等して、
    クリップボードにコピーして、ブラウザのアドレスバーに貼り付けて
    ページが表示されることを確認してください。

    それがダメであればURLが正しくないということです。

    パラメタ引数は、文字によってはエスケープが必要です。
    つまり、URLエンコードをかけます。

    その辺の知識は、これまでPHP(Webプログラミング)をやっていて
    持ち合わせていないのでしょうか?

    言語が変わっても方法は同じですよ^^;


  • id:aiomock
    ご回答ありがとうございます。

    やってみます。
  • id:HALSPECIAL
    HALSPECIAL 2009/12/11 17:05:05
    吉岡 照雄氏の
    http://www.vector.co.jp/soft/win95/util/se350148.html
    が良いと思いますが、

    JavaScriptを利用したこんなのもあります。
    http://komet163.blog36.fc2.com/blog-entry-18.html

    検索すると出てきますよ~
  • id:aiomock
    調べてやってみようとしたのですができませんでした。。

    デバッグ出力なのですが、これは

    Debug.Print url としてみてやってみたのですが、

    出力されませんでした。(やり方がおかしいのでしょうか。。)

    Range("A1").Select
    Do Until ActiveCell.Value = ""
    Dim url As String
    url = Replace(BASE_URL, "{0}", "page9") 'page9とかpage1とか
    url = Replace(BASE_URL, "{1}", ActiveCell.Value)
    url = Replace(BASE_URL, "{2}", ActiveCell.Offset(0, 1).Value)
    url = Replace(BASE_URL, "{3}", ActiveCell.Offset(0, 2).Value)
    ActiveCell.Offset(1, 0).Activate
    Debug.Print url ←★★ここに入れてみました。
    objIE.Navigate2 url
    While objIE.ReadyState <> READYSTATE_COMPLETE Or objIE.Busy = True
    Sleep 200
    Wend

    また、

    MsgBox Range("A1").Value
    MsgBox Range("B1").Value

    をしてみたのですが、これはきちんと情報が入っていると出力されます。

    URLエンコードですが申し訳ありません。

    url = Replace(BASE_URL, "{0}", "page9") 'page9とかpage1とか

    の部分の

    url = Replace(BASE_URL, "{0}", ★ここに関数を使う("page9")) 'page9とかpage1とか

    のではないかと思っているのですが、イマイチ関数を探すことができませんでした。。
    また今回(URL)の場合は何進数でデータを保存するか。少しわからないです。(16進数でいいのでしょうか?。。)

    初心者すぎて申し訳ありません。。。
  • id:aiomock
    URLエンコードについて大変お手数をおかけしますが質問します。

    今回エンコードが必要な場所は page4 等を示している場所の所のみだと思うのですが、

    これを変換するにはVBAには関数がないと書いてあったので、一つずつエンコーディングをしていって処理をするということなのでしょうか?

    HALSPECIAL さんからご紹介頂いた vector のソフトですが 

    これは今回であれば出力された 

    %7B0%7D を page9 に変換しなおしてくれるものでしょうか?

    ソフトをVBAのプログラムに組み込んで処理ができるのかという、

    ソフトとプログラムとの関連性が今一掴めず、困惑しております。。

    初心者過ぎて申し訳ありません。。
  • id:HALSPECIAL
    HALSPECIAL 2009/12/11 17:29:05
    >Debug.Print url としてみてやってみたのですが、
    あっています。

    そもそも、そのコードでは、urlは空ですよ。
    良く見直して下さいw

    URLエンコードとは
    http://ja.wikipedia.org/wiki/URL%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%89

    >また今回(URL)の場合は何進数でデータを保存するか。少しわからないです。(16進数でいいのでしょうか?。。)
    自身で作ることはないです。先ほど照会したページからパクればいいです。

    吉岡さんの
    decodeURL.HTA
    が参考になるでしょう。
  • id:HALSPECIAL
    HALSPECIAL 2009/12/11 17:39:31
    >今回エンコードが必要な場所は page4 等を示している場所の所のみだと思うのですが、
    URLエンコードは必要ないかもしれませんね。

    もう一度、プログラムで生成したURLを確認してみてください。
    正解のURLと生成したURLを見比べれば良いかと。

  • id:aiomock
    吉岡さんのソフトを使用させていただきました。

    http://{0}.auctions.yahoo.co.jp/show/contact_detail?aID={1}&target={2}&no=3&.crumb={3}

    をエンコード変換してみたのですが

    http://%7B0%7D.auctions.yahoo.co.jp/show/contact_detail?aID=%7B1%7D&target=%7B2%7D&no=3&.crumb=%7B3%7D

    の様に表示されました。


    プログラムを起動すると現在も インターネットエクスプローラーには

    http://%7B0%7D.auctions.yahoo.co.jp/show/contact_detail?aID={1}&target={2}&no=3&.crumb=tnQZWzSFtNl

    の様なURLが表示されてしまいます。


    http://%7B0%7D の 部分ですが {0}がエンコードされての値なのですが

    url = Replace(BASE_URL, "{0}", "page9")

    このコードで {0} が page9 に変更されているはずなのに、なぜ{0}がエンコード変更されてしまうのでしょうか?

    また、{1}と{2}がコードで置換されないのに対して {3}だけきちんと置換されているのはどういった現象なのでしょうか??
  • id:aiomock
    Sub Macro()

    Const BASE_URL As String = "http://{0}.auctions.yahoo.co.jp/show/contact_detail?aID={1}&target={2}&no=3&.crumb={3}"

    Set objIE = CreateObject("InternetExplorer.Application")
    objIE.Visible = True

    Range("A1").Select
    Do Until ActiveCell.Value = ""
    Dim url As String
    url = Replace(BASE_URL, "{0}", "page9") 'page9とかpage1とか
    url = Replace(BASE_URL, "{1}", ActiveCell.Value)
    url = Replace(BASE_URL, "{2}", ActiveCell.Offset(0, 1).Value)
    url = Replace(BASE_URL, "{3}", ActiveCell.Offset(0, 2).Value)
    ActiveCell.Offset(1, 0).Activate
    Debug.Print url ←★★ここに入れました。
    objIE.Navigate2 url
    While objIE.ReadyState <> READYSTATE_COMPLETE Or objIE.Busy = True
    Sleep 200
    Wend



    Loop

    End Sub

    この流れで Debug.Print url ←★★ここに入れました。 を入れてみました。

    最初の

    Const BASE_URL As String = "http://{0}.auctions.yahoo.co.jp/show/contact_detail?aID={1}&target={2}&no=3&.crumb={3}"

    で文字を定義して

    url = Replace(BASE_URL, "{0}", "page9") 'page9とかpage1とか
    url = Replace(BASE_URL, "{1}", ActiveCell.Value)
    url = Replace(BASE_URL, "{2}", ActiveCell.Offset(0, 1).Value)
    url = Replace(BASE_URL, "{3}", ActiveCell.Offset(0, 2).Value)

    で置換を行って url に値が入っているので

    http://page9.auctions.yahoo.co.jp/show/contact_detail?aID=A1の値&target=B1の値&no=3&.crumb=C1の値

    が出力されると思っていたのですが、無理でした。。

    私の Debug.Print url は間違えているのでしょうか?

    初心者過ぎて申し訳ありません。。。
  • id:aiomock
    何度もミスばかりで申し訳ありません。。

    Debug.Print url が出来れば、解決できそうなのですが・・・。

    お手数をおかけしますが、わかるかたおりましたらよろしくお願いいたします。。
  • id:ken3memo
    良くある話だけど、

    url = Replace(BASE_URL, "{0}", "page9") 'page9とかpage1とか
    url = Replace(BASE_URL, "{1}", ActiveCell.Value)
    url = Replace(BASE_URL, "{2}", ActiveCell.Offset(0, 1).Value)
    url = Replace(BASE_URL, "{3}", ActiveCell.Offset(0, 2).Value)

    だと、最後のReplace(BASE_URL, "{3}", ActiveCell.Offset(0, 2).Value)
    が変数URLに入るので、

    url = Replace(BASE_URL, "{0}", "page9") 'page9とかpage1とか
    url = Replace(url, "{1}", ActiveCell.Value)
    url = Replace(url, "{2}", ActiveCell.Offset(0, 1).Value)
    url = Replace(url, "{3}", ActiveCell.Offset(0, 2).Value)

    と、1-3は、変換したurlを置き換える、※ベースは初めの1回で良いのでは?

    横からスミマセンでした。
  • id:aiomock
    ご回答ありがとうございます。

    無事プログラムが実行できました^^。

    ありがとうございます。

    何度も私の質問に付き合っていただいた HALSPECIALさん 本当にありがとうございます。

    感謝してます^^。
  • id:HALSPECIAL
    HALSPECIAL 2009/12/11 21:47:51
    ken3memoさん、フォローありがとうございます。
    もともと提供した私のソースが悪かったのだと思います。
    aiomock さん、困惑させてすみませんでした。
    道のりはまだありそうですが、がんばってください。
  • id:aiomock
    HALSPECIAL さん 

    ご回答本当にありがとうございます。

    道のりまだまだありますが、完成できるように頑張ります^^。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません