VBAについて質問です。


現在 getElementsByName を使用しIEからデータの出力を行っています。
<input type="text">形式のものはなんとか出力が出来るようになったのですが、

ラジオボックス、セレクトフォーム、チェックボックス形式のものがうまく出力が出来ず困っております。

お手数をおかけしますが、ラジオボックス、セレクトフォーム、チェックボックスの出力の仕方をわかるかたおりましたら
教えていただければと思います。

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

回答の条件
  • 1人2回まで
  • 登録:2009/12/15 17:44:47
  • 終了:2009/12/16 12:17:00

ベストアンサー

id:kn1967 No.1

kn1967回答回数2915ベストアンサー獲得回数3012009/12/15 18:49:50

ポイント100pt

(1)テストに使った a.html ファイル・・・かなり手抜き

<html>
<head>
</head>
<body>
</body>
        <input type="radio" name="iconCode" value="1">美品
        <input type="radio" name="iconCode" value="2">限定
        <input type="radio" name="iconCode" value="3">非買
        <input type="radio" name="iconCode" value="4">新製
        <input type="radio" name="iconCode" value="5">全巻
        
        <br />

        <input type="radio" name="usedFlag" value="0">新品
        <input type="radio" name="usedFlag" value="1" checked="checked">中古

        <br />
        
        <select name="prefectures"><option value="1">北海道</option>
        <option value="2">青森県</option>
        <option value="3">岩手県</option>
        <option value="4">宮城県</option>
        <option value="13">東京</option>
        <option value="27">大阪</option>
        </select>

        <br />

        <table border="0" cellspacing="0" cellpadding="0" style="margin-bottom:2px;">
        <tr>
        <td valign="top"><font size="-1">
        <input type="checkbox" name="companyAndService[16]" value="9000/999">
        </font></td>
        <td valign="middle"><font size="-1">
        送料無料&nbsp;
        (出品者負担)<input type="hidden" name="sizeAndWeight[16]" value="999/999">
        </font></td>
        </tr>
        </table>
</html>

(2)VBAコード

Sub Macro2()
    Const READYSTATE_COMPLETE = 4
    Dim objIE As Object
    Set objIE = CreateObject("InternetExplorer.Application")
    objIE.Visible = True
    
    objIE.Navigate2 "z:\a.html":' テストファイルを書いてます。
    While objIE.ReadyState <> READYSTATE_COMPLETE Or objIE.Busy = True
    'Sleep (200)
    Wend
    
    Dim Doc As Object
    Set Doc = objIE.Document

    ' iconCodeラジオボタン 0美品 / 1限定 / 2非買 / 3新製 / 4全巻
    objIE.Document.getElementsByName("iconCode")(2).Checked = True: 'この例では2なので「非買」

    ' usedFlagラジオボタン 0新品 / 1中古
    objIE.Document.getElementsByName("usedFlag")(0).Checked = True: 'この例では0なので「新品」

    ' prefecturesセレクトボックス 1北海道 / 2青森 以下続く。
    objIE.Document.getElementsByName("prefectures")(0).selectedIndex = 5: 'この例では5を選択

    ' companyAndServiチェックボックス true もしくは false
    objIE.Document.getElementsByName("companyAndService[16]")(0).Checked = True: 'この例では「送料無料」
End Sub

※注意して欲しいのはセレクトボックス。

この例では値として 5 を与えているが、これはvalueの値ではなく、並び順を差している。

この2つのファイルでテストできるようにしてあるので、

数値をいろいろ変えてみてテスト結果を見て欲しい。

id:aiomock

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

2009/12/15 19:17:54
  • id:aiomock
    作成したコードですが以下になります。

    Sub Macro()

    'IEの起動
    Dim objIE As Object '変数を定義します。
    Set objIE = CreateObject("InternetExplorer.Application") 'オブジェクトを作成します。
    objIE.Visible = True '可視、Trueで見えるようにします。

    '処理したいページを表示します。
    objIE.Navigate "https://auction.item.rms.rakuten.co.jp/rms/c2c/item/DI01P004_002?genreId=100837&d_id=9214aa4c86f6fb3b96da3073bd25082e"

    'ページの表示完了を待ちます。
    While objIE.ReadyState <> 4 Or objIE.Busy = True '.ReadyState <> 4の間まわる。
    DoEvents '重いので嫌いな人居るけど。
    Wend

    '商品名の入力

    objIE.Document.getElementsByName("itemName")(0).Value = "三流"

    'アイコンのチェック(イメージ表示のラジオボックス)

    objIE.Document.getElementsByName("iconCode")(0).Value = "2"

    'アイコンのチェック(文字表示のラジオボックス)

    objIE.Document.getElementsByName("usedFlag")(0).Value = "0"

    '都道府県の選択(セレクトフォーム形式)

    objIE.Document.getElementsByName("prefectures")(0).Value = "北海道"


    '発送方法の選択(チェックボックス形式)

    objIE.Document.getElementsByName("companyAndService[16]")(0).Value = "9000/999"



    End Sub
  • id:aiomock

    ラジオボックスは

    ○ イメージ
    ○ 文字

    の形式があります。

    二つの出力形式わからない状況です。

    例えば

    ○ イメージ のnameタグなどは以下になっており

    <input type="radio" name="iconCode" value="1">
    <img src="https://auction.item.rms.rakuten.co.jp/com/img/icon/user_icon/info01.gif">

    <input type="radio" name="iconCode" value="2">
    <img src="https://auction.item.rms.rakuten.co.jp/com/img/icon/user_icon/info02.gif">

    <input type="radio" name="iconCode" value="3">
    <img src="https://auction.item.rms.rakuten.co.jp/com/img/icon/user_icon/info03.gif">

    <input type="radio" name="iconCode" value="4">
    <img src="https://auction.item.rms.rakuten.co.jp/com/img/icon/user_icon/info04.gif">

    <input type="radio" name="iconCode" value="5">
    <img src="https://auction.item.rms.rakuten.co.jp/com/img/icon/user_icon/info05.gif">

    Value値を入れるのではないか?と思い

    objIE.Document.getElementsByName("iconCode")(0).Value = "2"

    としたのですが、無理でした。
  • id:aiomock
    ○文字

    表示のラジオボックスは以下になります。

    <tr valign="top">
    <td bgcolor='#FFFFCC'><b><font size="-1" color='#000000'>商品状態</font></b></td>
    <td bgcolor="#FFFFFF">
    <font size="-1">

    <input type="radio" name="usedFlag" value="0">
    新品

    <input type="radio" name="usedFlag" value="1" checked="checked">
    中古

    </font>

    </td>
    </tr>

    以下のようにしてみたのですが、無理のようです。。

    objIE.Document.getElementsByName("usedFlag")(0).Value = "0"

  • id:aiomock
    セレクト形式の都道府県は以下のようになっており

    <b><font size="-1" color='#000000'>発送地域</font></b>
    <a href="javascript:void(window.open('http://help.rakuten.co.jp/mw/?hid=166','help','scrollbars=yes,resizable=yes,width=410,height=300,left=5,top=5'))">
    <img src="/acom/pc/img/item/help_icon.gif" alt="ヘルプ" width="15" height="11" hspace="2" border="0">
    </a>
    </td>
    <td width="439" bgcolor="#FFFFFF">
    <select name="prefectures"><option value="1">北海道</option>

    <option value="2">青森県</option>
    <option value="3">岩手県</option>
    <option value="4">宮城県</option>
    以下続きます・・・・・・・・・・

    objIE.Document.getElementsByName("prefectures")(0).Value = "北海道"

    としたのですが、無理でした。
    出力画面のSELECTの部分を見たら空白になっていました。
  • id:aiomock
    チェックボックス形式に関しては

    <table width="100%" height="24">
    <tr>
    <td><font size="-1">送料無料</font></td>
    </tr>
    </table>


    <table width="100%" border="0" cellspacing="3" cellpadding="0">
    <tr>
    <td>

    <table border="0" cellspacing="0" cellpadding="0" style="margin-bottom:2px;">
    <tr>
    <td valign="top"><font size="-1">
    <input type="checkbox" name="companyAndService[16]" value="9000/999">
    </font></td>
    <td valign="middle"><font size="-1">
    送料無料&nbsp;



    (出品者負担)<input type="hidden" name="sizeAndWeight[16]" value="999/999">





    </font></td>
    </tr>

    </table>


    objIE.Document.getElementsByName("companyAndService[16]")(0).Value = "9000/999"

    としてみたのですが、無理でした。

    <input type="check">と<input type="hidden">の二つありvalue値がそれぞれ違うのが、ちょっと混乱しています。
  • id:aiomock
    ラジオボックス、セレクト、チェックボックスの3つのタイプの出力形式をなんとかできればうまく出来るのですが、なかなかうまくいかず困惑しております。知っているかたおりましたらご回答いただければと思います。自分でもなんとか試してみたいと思います。
  • id:ken3memo
    セレクト形式の都道府県は
    人は北海道を入れたいところだけど
    objIE.Document.getElementsByName("prefectures")(0).Value = "北海道"
    <option value="3">岩手県</option>
    とか、option value="3"で代入されるので、
    objIE.Document.getElementsByName("prefectures")(0).Value = "3"
    で、やるか、
    .SelectedIndex=nで選択かなぁ。
    objIE.Document.getElementsByName("prefectures")(0).SelectedIndex = 5
    で上から6番目(たぶん0からなので5は6番目)

    チェツクボックスは、Checked = True でチェック状態をtrueにするので、
    objIE.Document.getElementsByName("usedFlag")(0).Checked = True
    かなぁ。

    どちらか1つでも動くことを願いつつ、失礼します。

    ---
    <input type="radio" name="iconCode" value="1">
    <img src="https://auction.item.rms.rakuten.co.jp/com/img/icon/user_icon/info01.gif">

    <input type="radio" name="iconCode" value="2">
    <img src="https://auction.item.rms.rakuten.co.jp/com/img/icon/user_icon/info02.gif">

    これは、あまり自信ないけど、name="iconCode"で同じ名前になっているので、
    objIE.Document.getElementsByName("iconCode")(1).Checked = True
    objIE.Document.getElementsByName("iconCode")(2).Checked = True
    と、(1)や(2)の配列を.Checked = True するイメージかなぁ。

    あとは、1つ1つクリアーしてからで、、、何かの参考となれば、幸いです。
  • id:kn1967
    別質問と平行していたら、コメント欄に先に書き込みがあったのね・・・。

    a)objIE.Document.getElementsByName("prefectures")(0).Value = "3"
    b)objIE.Document.getElementsByName("prefectures")(0).SelectedIndex = 5
    しまった・・・回答にSelectedIndexほうだけ書いちゃったよ(涙)
    valueのほうがミスがなくていいよね。絶対。あとで訂正してもらお。
    (どっちも動きます。SelectedIndexの問題点だけは回答に書いてありますが何という手落ち・・・。)

    c)objIE.Document.getElementsByName("usedFlag")(0).Checked = True
    これもOKですよ。

    d)objIE.Document.getElementsByName("iconCode")(2).Checked = True
    これももちOK。

    残りのひとつ
    companyAndService[16] は Value じゃなくて Checked ・・・

    回答欄に投稿なさっておられれば恥ずかしいコード書かなくてすんだのに(グスン)
  • id:aiomock
    ご回答ありがとうございます。

    練習のしすぎでサイトにアクセスできなくなったので、時間をおいてもう一度練習してみようと思います。
  • id:kn1967
    >練習のしすぎでサイトにアクセスできなくなった

    先の質問でも、今回でもサンプルを作ってあるのはなぜだと思います?

    面倒なようでも、これから利用しようという対象を、
    よくよく分析することから始めないといけないため、
    まずは通常どおり手動でアクセスして、
    表示された各ページのソースを、パソコン上に保管し、
    不要な部分を削って、何時でも、何度でも、
    チャレンジできるようにしておくのです。

    そのために、
    VBAサンプルではローカルのファイルを読みに行くようにしてあるのです。
    本番環境に頻繁にアクセスに行くのは迷惑行為だし、
    何より、失敗した時が面倒なので、基本動作がしっかり確認できるまでは、
    ローカルファイルを相手にテストするようにしましょう。

    これも、Debug.PrintやEcho同様、開発の基本中の基本ですから、
    ぜひとも身に付けてください。
    対象をシンプルにしておけば、間違いも探しやすくなりますしね。

    だから、
    次にアクセスできるようになったら、まずは手動でアクセスして、
    それぞれのページのソースをローカル(パソコン)に保存しましょう。

    では、ひとまず失礼。
  • id:aiomock
    お手数をおかけします。。
    自分で練習場所を作ってみました。 http://aiomock2008.kage-tora.com/rakuten.html

    皆さんのおかげで、テキスト形式、ラジオボックス形式、セレクト形式、チェックボックス形式の入力ができるようになりました。ありがとうございます^^。

    後、大変お手数をおかけするのですがお聞きしたいことが2つほどあります。

    テキストを出力するところで、今回、説明文を記入するところがあるのですが、txtファイルに書いてある説明文をリンクさせて持ってきたいと考えております。テキストファイルはD:\test.txtの位置にあります。

    objIE.Document.getElementsByName("caption")(0).Value = "D:\test.txt"

    では、うまくできなく、お手数をおかけしますが、リンクのやり方を知っておりましたら教えていただければと思います。

    また今回最後にSUBMITボタンを押す場合にですが、

    nameだけ書いてあるSUBMIT形式が初めてで

    <input type="submit" name="subConfirm" value=" 商品情報を確認する ">

    このボタンを押す場合は、

    objIE.Document.getElementsByName("subConfirm")(0).Submit

    のようにしてみましたが、無理でした。

    お手数をおかけしますが上記2点を知っている方おりましたら、よろしくお願いいたします。
  • id:kn1967
    (a)submit
    ボタンをクリックするという方法もあるけど、
    objIE.document.forms(0).Submit
    のほうが楽かな。

    ところで・・・
    prefectures の value と SelectedIndex の違いは判りました?

    (b)ファイルの中身を書き込みたい
    上記はフォームの続きだけど、これは異質の部分を含んでいる問題。

    VBAで D:\test.txtファイルの中身を読み取って、
    それを文字列として Value に代入しなければなりません。
    さらに、D:\test.txt の中にタグなどが紛れ込んでないかなど、
    もろもろのチェックも必要になる。

    最初から質問に書いてあれば答えたかもしれないけど、
    「後だしでも、何でも、そしてどこまでも答える」というような、
    そんな風習になっても困るので、別質問が妥当としコメントは控えさせてください。
  • id:aiomock
    ご回答ありがとうございます。

    無事にボタンを押すことが出来ました。

    prefectures の value と SelectedIndex の違いですが、valueだと1から数えるのに対して、SelectedIndexですと0から数えるのが違いだと思います。

    後、ほかのセレクト形式入力を試してみたのですが、Valueでは対応できないものがあったので、SelectedIndexの方が優れていると認識しました。

    ファイルの中身に関しては別質問にて質問させていただければと思います。

    ご回答本当にありがとうございます^^。
  • id:kn1967
    >valueだと1から
    >SelectedIndexですと0から

    違いますよ。
    value は optionタグのvalueの値で対象を決めます。
    SelectedIndex は optionの並び順で0から連番になります。

    回答欄で、間をとばして東京と大阪だけ書いてあるのはそのためです。

    value="1" 北海道
    value="2" 青森県
    value="3" 岩手県
    value="4" 宮城県
    value="13" 東京
    value="27" 大阪

    私は、テストコードの中では SelectedIndex = 5 と書きました。
    ゼロから番号が振られるので、5は実際には6番目を表し、
    出力されるのは"大阪"となっていたはずです。
    value で"大阪"をしめしたい場合は value = 27 とします。

    value であれば

    value="2" 青森県
    value="27" 大阪
    value="4" 宮城県
    value="13" 東京
    value="1" 北海道

    といった具合に並び順番が変わったり、
    抜けたりしても対象をしっかりとフォローしてくれますが、
    SelectedIndex だとどうなりますか?
    やってみるまでも無いと思いますが、出来ればやってみてください。

    value="" --関東--
    value="13" 東京
    value="" --近畿--
    value="27" 大阪

    見やすいようにと、余計な行が入ったりしても、困りますよね。
    「valueのほうがミスがなくていいよね。」というのは、
    こういった点を考慮しての事です。


    >Valueでは対応できないものがあった

    その失敗したものを上記に照らし合わせて確認してみてください。
    基礎をしっかり身に付けてシステムを作成していかないと、
    小さなミスが、やがて大きなミスになって、
    間違ったデータを大量に書き込んでしまい、
    大赤字どころか弁償になる可能性もはらんでいるので、
    重々、確認していってくださいね。
  • id:aiomock
    本日、実サイトで実行してみたところ、きちんと入力は出来たのですが ボタン移動をした際に

    大変申し訳ございません。システムエラーのため、処理を中断させていただきます。大変ご迷惑をおかけしますが、しばらくたってから商品登録手続きをお願いいたします。

    というページへ移動しました。

    これはもしかして登録出来ないということでしょうか。。

    詳しい方おりましたらご回答いただければと思います。。
  • id:aiomock
    ご回答ありがとうございます。

    貴重なご意見もありがとうございます。

    実際に試してみたいと思います。
  • id:aiomock
    Valueでも実行出来ました。

    私の勘違いでした。。。ご指摘ありがとうございます。

    以降Valueで行きたいと思います。

    後、VBAでデータを渡してページ移動が出来ない原因ですが、処理速度の速さにあるのではないかと考えています。

    入力速度が非常に速すぎるので、楽天サイドでそういった出品をする人をはじいているのではないか
    と思います。

    一つ一つのデータにある程度の入力速度を持たせて、出力したいのですがそのようなことは可能でしょうか?

    コード一つ実行して 1秒間間を持たせる 等

    質問してみたいと思います。。

    間違えているかもしれませんが、、原因について詳しい方おりましたらご指摘いただければと思います。よろしくお願いいたします。。

  • id:kn1967
    手動でもエラーが出るとなれば、
      システム側の問題なので、時をおいて再テスト。
    自動の際だけエラーが出るとなれば、
      送った内容の見直し。
      プログラムの動作見直し。

    具体的に、どこがおかしいのかは、即答できる材料をもってません。ごめんなさい。
  • id:kn1967
    >楽天サイドでそういった出品をする人をはじいている

    それはあるかもしれませんね。
    (はてなも5分以内の連続投稿は・・・)

    >1秒間間を持たせる

    過去に書いておられたコードの Sleep 200 の箇所でエラーが出ていないなら
    Sleepが使えるようになってますから、
    Sleep 1000 (ミリ秒で指定するので1秒だと 1000)
    といった指定ができます。

    sleepでエラーになっていたようであれば全てのコードの先頭に、
    下記の一行を書き加えて、
    Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    さらに、下記のようなコードで動作確認してみてください。
    Sub Macro3()
    Debug.Print "スタート!"
    Sleep 3000
    Debug.Print "3秒待ったよ!"
    End Sub

    最初は、1秒じゃなくて30秒くらいにしておいて、
    値を徐々に小さくしていったほうがいいかも・・・。
  • id:aiomock
    Sleep試してみましたが無理でした。。。

    30秒数えてみましたが無理でした。。

    しかし、手動でボタンを押すと実行可能でした。

    手動に近いボタンの押し方の命令というのはありますでしょうか?

    詳しいかたおりましたらよろしくお願いいたします。

  • id:kn1967
    スリープ・・・
    別質問になってましたね。回答投稿タイミングほぼ同じだし(笑)

    ファイルに関しては中身のチェックは無しですか・・・。
    経緯を示さないから、ああなってしまうのですよね。
    何のために、別質問にしてもらってるのか・・・勿体無いですよ。

    もう少し、有効に使いましょ。
  • id:aiomock
    ご回答ありがとうございます。

    確かに経緯を話していないため HALSPECIALさん にうまく伝わっておりませんでした。
    スリープに関してはうまく起動しました。

    kn1967さん の説明でうまく飲み込めたからです。。

    中身のファイルに関してですが、楽天サイトでうまく値の受け渡しは出来ていたので、
    その他の部分に問題があるのではないかと思い質問をしました。

    一度ファイルには問題がないことをここに書けばよかったと思います。

    申し訳ありません。。

  • id:kn1967
    >ファイルには問題がない

    そうでしたか。勝手な憶測による過剰な心配でした。申し訳ないです。

    submitの件は、まだ判らないのですが(いつになるやら判りません)
    新質問は回答のついてないうちに一度キャンセルして、
    「ExcelVBAからIEを開いて、
    楽天オークションサイトに自動投稿しようとしています。」
    といったような書き出しにされたほうがよろしいかと思います。
    他のサイト用のものを持ち出されても困るだけだと思いますしね。
    こう書き出しておけば「xxでは動きましたけど」といった一言が、
    加わると思うので、悩みすぎる心配はないと思います。
    それと、質問投稿の改行は少なめに出来ませんか?
    長文回答ばかりするkn1967の言うことではないかもしれませんが・・・。

    内容は次のステップに進んだようですし、
    この質問は、ひとまず、この辺で失礼させていただこうと思います。
    では、またいずれ。
  • id:aiomock
    ご回答ありがとうございます。

    kn1967さん の質問の仕方のほうがいいと思い質問変更してみました。
    ご指摘ありがとうございます。

    質問投稿の改行すくなめ非常に参考になりました。
    以降少なめにしたいと思います。

    ご指摘いつも本当にありがとうございます^^。

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

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

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

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