質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Internet Explorer

Internet Explorer(IE;MSIE)はマイクロソフトが開発したウェブブラウザです。Microsoft Windowsに組み込まれています。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

解決済

4回答

3880閲覧

VBAマクロエラー「オブジェクトが必要です」

hatsuk0i1216

総合スコア14

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Internet Explorer

Internet Explorer(IE;MSIE)はマイクロソフトが開発したウェブブラウザです。Microsoft Windowsに組み込まれています。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

0クリップ

投稿2017/03/03 07:57

編集2017/03/08 08:07

###前提・実現したいこと
在庫数確認のため、WEBページにアクセス

ログイン

在庫確認ページへアクセス

商品コードをセルから取り出し貼り付け
問い合わせボタンを押す

出力された情報をエクセルへ貼り付け

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

技術に関する回答ではありませんが一言。

他社の会員制のWebサービスに対してスクレイピングのような動作をしようとしていると見受けられますが
一般的に、会員制のWebサービスには利用規約が設けられています。
その利用規約には、いわゆるスクレイピングや機械的な操作を禁止している場合があります。
それに反する行為を行った結果、そのサービスを利用できなくなったり、規約に定められた罰則をうける可能性がありますのでご注意ください。
VBAの使用者=ログイン者=あなたなら責任は自身で負えますが、そうでない場合は他人も巻き込むことになります。

簡単にいうと

stock.aspへ直接アクセスしようとすると、index.htmlへ強制的に飛ばされる。

という動作から察して、あまり変な処理はしない方がよいと思います。

投稿2017/03/08 07:53

can110

総合スコア38266

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hatsuk0i1216

2017/03/08 08:10

ご丁寧にご教授いただきありがとうございました。 上記につきましては一旦会社側と相談させていただきます。
can110

2017/03/08 08:20

たとえ規約で禁止されてなくても、誤動作で「注文」ボタンを押しちゃった、ということもありえるので慎重に進めるべき事案かと思います。
guest

0

ベストアンサー

stock.aspへ直接アクセスしようとすると、index.htmlへ強制的に飛ばされる。

これが原因なのでは?
VBA 関係なく。
飛ばされないように設定してもらって下さい。

投稿2017/03/08 06:44

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hatsuk0i1216

2017/03/08 06:49

>飛ばされないように設定してもらって下さい。 →該当のページは他社メーカーのページになり、こちらではHTMLやJavaの設定変更は  できかねるのですが、VBA上でそのような設定が可能ということでしょうか?
Zuishin

2017/03/08 06:52

他社のページならそれは無理ですね。しかしデータの入っているページを取得できなければどうにもなりませんが、できていますか?
Zuishin

2017/03/08 07:03

objIE から objFrame そして objDoc と取得しようとされていますが、そのどの段階で失敗しているのかを調べる必要があると思います。
hatsuk0i1216

2017/03/08 07:57

フレーム内のオブジェクトが取得できていないことが原因でした。 functionを追加して無事にできました!ありがとうございました。
guest

0

objIEがそもそも適切に宣言されてないのではないですか。

検証したところ、ページに要素が無い場合はDocumentメソッドは失敗しました等、もう少し具体的なエラーになりました。

以下のように型を指定せず、オブジェクトもセットしなかった場合に「オブジェクトが必要です」というエラーになりました。

VBA

1Sub hoge() 2 Dim objIE 3 objIE.Document.Forms(0).Item("strNUMBER").Value = Cells(1, 2).Value 4End Sub

つまり、変数名の間違いなどの単純ミスかと推測します。

投稿2017/03/04 10:02

thom.jp

総合スコア686

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hatsuk0i1216

2017/03/04 18:00

Sub 自動ログイン値取得() Dim objIE As Object Dim obj As Object Dim obj3 As Object Dim objIE2 As Object Dim strNUMBER As String Dim strURL As String 'IEを起動 URLを指定 Set objIE = CreateObject("InternetExplorer.Application") objIE.Visible = True objIE.Navigate "http://XXXXXXXXXXXXXXXXXXXXXXXXX" 'ページ表示待機 'IDとパスワードの入力 For Each obj In objIE.Document.getElementsByTagName("input") If obj.Name = "LOGON" Then obj.Value = "********" '←正しいものに変更 End If If obj.Name = "PASSWORD" Then obj.Value = "********" '←正しいものに変更 End If Next 'ログインボタンをクリック For Each obj In objIE.Document.getElementsByTagName("input") If obj.Name = "SUBMIT" Then obj.Click End If Next '在庫確認ページへ遷移 objIE.Navigate "http://XXXXXXXXXXXXXXXXXXXXXXXXX" 'セルB2の商品名を代入 obj.Document.Forms(0).Name("strNUMBER").Value = Cells(2, 2).Value (このあとSUBMITするつもりですが、) End Sub
jawa

2017/03/08 07:44 編集

※自分の回答と間違えてコメントつけてしまいました。スミマセン。 ※自分の回答にコメントを移させていただきますm(__)m
hatsuk0i1216

2017/03/08 06:38

jawaさま ご返信ありがとうございました。 本件につきまして、質問本文を変更させていただきました。 引き続きご教授いただきますようお願いいたします。
guest

0

エラー発生行なのだと思いますが、1行のみのコード提示ではなんとも言えません。
現時点で言えることは、提示いただいた1文のどこかでオブジェクトに結びついていないものがあるので怒られているのでは?というくらいです。

一般的に見て一番あやしそうなのは.Item("strNUMBER")の部分です。
・開いたページに"strNUMBER"が存在しない
・そもそもページを開き終わる前に参照してしまい見つからない
など考えられますが、推測の域を出ません。

もう少しコードを提示いただければより具体的なアドバイスができると思うのですが。。ご検討ください。

投稿2017/03/03 09:19

jawa

総合スコア3013

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hatsuk0i1216

2017/03/04 18:01

Sub 自動ログイン値取得() Dim objIE As Object Dim obj As Object Dim obj3 As Object Dim objIE2 As Object Dim strNUMBER As String Dim strURL As String 'IEを起動 URLを指定 Set objIE = CreateObject("InternetExplorer.Application") objIE.Visible = True objIE.Navigate "http://XXXXXXXXXXXXXXXXXXXXXXXXX" 'ページ表示待機 'IDとパスワードの入力 For Each obj In objIE.Document.getElementsByTagName("input") If obj.Name = "LOGON" Then obj.Value = "********" '←正しいものに変更 End If If obj.Name = "PASSWORD" Then obj.Value = "********" '←正しいものに変更 End If Next 'ログインボタンをクリック For Each obj In objIE.Document.getElementsByTagName("input") If obj.Name = "SUBMIT" Then obj.Click End If Next '在庫確認ページへ遷移 objIE.Navigate "http://XXXXXXXXXXXXXXXXXXXXXXXXX" 'セルB2の商品名を代入 obj.Document.Forms(0).Name("strNUMBER").Value = Cells(2, 2).Value (このあとSUBMITするつもりですが、) End Sub
jawa

2017/03/08 07:44

ソースコードの提示ありがとうございます。 できれば ・回答する人全員が見たいものであること ・ソース全体を```で囲んで投稿いただくことでネストの段組みなどがきれいに表現できること といった理由から、個々の回答欄へのメッセージでなく質問本文への追記としていただいたほうがうれしいです。 今後のご参考までに。 --- 提示いただいたコードでは2回のページ遷移(Naviagte)を行っているようですね。 1回目のNavigate後は待機処理のコメントがありますが、実装が見当たりません。 2回目のNavigate後も待機処理がなく、次行ですぐに"strNUMBER"の参照を試みています。 2回目のNavigate後に問題が発生するのであれば、1回目で参照しているページはさほど表示に時間が掛からないページなのかもしれませんし、たまたま運がよかったのかもしれません。 ネットの混み具合によっては1回目でアウトとなる場合もありそうです。 改善策として待機処理を追加してみてはどうでしょうか? 方法としては、Navigate後に例えば5秒待機してから参照する、といった方法もありますが、IEオブジェクトのBusy状態を確認するのが一般的だと思います。 例えば ``` Do While objIE.Busy Or objIE.ReadyState < READYSTATE_COMPLETE Debug.Print objIE.Busy & "/" & objIE.ReadyState DoEvents Loop ``` というような処理になります。 お試しください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問