tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルエクセル動作確認後、VB6でのエラーにつきまして
記事No16284
投稿日: 2017/03/16(Thu) 17:48
投稿者susu
この度、お世話になります。

以下につきまして宜しくお願い致します。

タイトル:エクセル動作確認後、VB6でのエラーにつきまして

環境
OS:Windows 7  Microsoft Office Excel 2000   Microsoft Visual Basic 6.0
VB歴は長いのですが詳しくはありません。

概要

webページ起動後に既存フォームチェックボックスを選択するものです。

「参照設定」
「Microsoft HTML Object Library」
「Microsoft Internet Controls」
「Micrsoft Excel 9.0 Object Library 」
にチェックが付けました。
エクセルでは問題なく動作確認できました。

操作手順
1.Command1ボタン ⇒ webページ起動 ⇒ フォームチェックボックス表示

2.フォームチェックボックスの選択
  ・Command2ボタン⇒ 既存フォームチェックボックス ⇒ 赤のフォームチェックボックスを選択
  ・Command3ボタン⇒ 既存フォームチェックボックス ⇒ 青のフォームチェックボックスを選択
  ・Command4ボタン⇒ webページを閉じる

VB6で動作しますとPublic Sub Command2_Click()、Public Sub Command3_Click()内の
objIE.Document.Forms("form1").lcolor(0).Checked = True
objIE.Document.Forms("form1").lcolor(1).Checked = True
の所で[実行時エラー '424':オブジェクトが必要です。]エラーになります。
オブジェクトに関して試し記述、検索してみましたが解決できませんでした。

質問
objIE.Document.Forms("form1")・・・・でエラーにつきまして
ご教示願えますと幸いであります。


'
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'
Option Explicit

Public Sub Command1_Click()
    Dim objIE1 As New InternetExplorer
    Dim BusyCnt As Long
    
    'IE表示
    objIE1.Visible = True
    
    '指定したURLのページを表示する
    objIE1.Navigate URL:="http://www.vba-ie.net/code/test.html"
  
    '表示待ち
    BusyCnt = 0
    Do While (1)
        If objIE1.Busy Then
            Application.Wait (Now() + TimeValue("00:00:01"))
            DoEvents
            BusyCnt = 0
        Else
            BusyCnt = BusyCnt + 1
        End If
        Application.Wait (Now() + TimeValue("00:00:01"))
        If BusyCnt > 3 Then '連続3秒以上busyで無かったら、次へ
            Exit Do
        End If
    Loop

    Set objIE = objIE1
    
  
    MsgBox "表示完了", vbOKOnly

End Sub


Public Sub Command2_Click()
    '赤選択
    objIE.Document.Forms("form1").lcolor(0).Checked = True
  End Sub

Public Sub Command3_Click()
    '青選択
    objIE.Document.Forms("form1").lcolor(1).Checked = True
End Sub

Public Sub Command4_Click()
    'IE終了
    objIE.Quit
End Sub

'
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'

[ツリー表示へ]
タイトルRe: エクセル動作確認後、VB6でのエラーにつきまして
記事No16285
投稿日: 2017/03/16(Thu) 21:47
投稿者魔界の仮面弁士
>  OS:Windows 7  Microsoft Office Excel 2000   Microsoft Visual Basic 6.0
Office 2000 は Windows XP までの対応なので、
Vista や 7 での動作保証はありません。

そもそもサポート切れの製品ではあるので、どちらにしても
自己責任での利用ということになります。

また、IE のバージョンは 11 になっているでしょうか。
それとも IE8/9/10 のままだったりしますか?


> エクセルでは問題なく動作確認できました。
VBA では動作するものの、
VB6 からの制御がうまく行かない、ということでしょうか。

でも、そもそも VB6 には Application.Wait メソッドが存在しないはず…?



> 操作手順
> 1.Command1ボタン ⇒ webページ起動 ⇒ フォームチェックボックス表示
このフォームとは、Excel の UserForm ではなく、VB6 の Form のことでしょうか。



> Do While (1)
無限ループが目的なら、正しくは「Do While True」あるいは単に「Do」ですよ。



>     '指定したURLのページを表示する
>     objIE1.Navigate URL:="http://www.vba-ie.net/code/test.html"
今回のページは、IE11 ではEdge モードでレンダリングされるようですね。
Web ページが後方互換であるのか標準準拠であるのかで、
Document 配下のオブジェクトの操作手順が異なる可能性がありますのでご注意下さい。



>     Set objIE = objIE1
そもそも変数 objIE は宣言されていないので、
文法エラーになるはずなのですが…。



> 質問
> objIE.Document.Forms("form1")・・・・でエラーにつきまして
> ご教示願えますと幸いであります。

ループ中で DoEvents を呼び出しているので(本来は望ましくない)、
ループ中に他のボタンを押せてしまう可能性があります。

その場合、objIE が Nothing (あるいは Empty) という未設定の状態や、
.forms("form1") が ロードされきる前に処理されてしまう可能性もありえます。
(今回の事象がそうだといっているわけでは無いですが)


ひとまず Command2_Click の内容を下記のようにすると、何が出力されてきますか?

Debug.Print "objIE => "; TypeName(objIE)
Debug.Print "objIE.Document =>"; TypeName(objIE.Document)
Debug.Print "forms.length="; objIE.Document.forms.length
Debug.Print "forms['form1'] is nothing?", objIE.Document.forms("form1") Is Nothing
Debug.Print "lcolor =>"; TypeName(objIE.Document.forms("form1").lcolor)
Debug.Print "lcolor[0] =>"; TypeName(objIE.Document.forms("form1").lcolor(0))
Debug.Print objIE.Document.forms("form1").lcolor(0).outerHTML





> objIE.Document.Forms("form1").lcolor(0).Checked = True
>  objIE.Document.Forms("form1").lcolor(1).Checked = True
> の所で[実行時エラー '424':オブジェクトが必要です。]エラーになります。
> オブジェクトに関して試し記述、検索してみましたが解決できませんでした。

ドキュメントの読み込みを待ち合わせるために、ループ待機を用いないようにしましょう。
かわりに DocumentComplete イベントを使い、それが呼び出された後で
objIE.Document の処理を許可するようにします。


Option Explicit

Private WithEvents IE As InternetExplorer

Private Sub Form_Load()
    Command2.Enabled = False
    Command3.Enabled = False
    Command4.Enabled = False
End Sub

Public Sub Command1_Click()
    Set IE = New InternetExplorer
    IE.Visible = True
    IE.Navigate "http://www.vba-ie.net/code/test.html"
    Command4.Enabled = True
End Sub

Public Sub Command2_Click()
    IE.Document.Forms("form1").lcolor(0).Checked = True
End Sub

Public Sub Command3_Click()
    IE.Document.Forms("form1").lcolor(1).Checked = True
End Sub

Public Sub Command4_Click()
    IE.Quit
End Sub

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    If Not IE Is Nothing Then
        IE.Quit
    End If
End Sub

Private Sub IE_DocumentComplete(ByVal pDisp As Object, URL As Variant)
    Command2.Enabled = True
    Command3.Enabled = True
End Sub

Private Sub IE_OnQuit()
    Set IE = Nothing
    Command2.Enabled = False
    Command3.Enabled = False
    Command4.Enabled = False
End Sub

[ツリー表示へ]
タイトルRe^2: エクセル動作確認後、VB6でのエラーにつきまして
記事No16286
投稿日: 2017/03/16(Thu) 23:31
投稿者susu
魔界の仮面弁士 さん

返答をして頂きまして、ありがとうございました。

>Office 2000 は Windows XP までの対応なので、Vista や 7 での動作保証はありません。
はい、分かりました。

>IE のバージョンは
IE のバージョンは 11です。

>VBA では動作するものの、VB6 からの制御がうまく行かない、ということでしょうか。
はい、VBA では動作しますがVB6のCommand2、Command3のIE.Document.Forms("form1").lcolorでエラーになります。

>このフォームとは、Excel の UserForm ではなく、VB6 の Form のことでしょうか。
不十分で済みません。 "http://www.vba-ie.net/code/test.html"のwebページのことでした。

>ひとまず Command2_Click の内容を下記のようにすると、何が出力されてきますか?

Debug.Print "objIE => "; TypeName(objIE)                   結果  objIE => Empty(空白)
Debug.Print "objIE.Document =>"; TypeName(objIE.Document)  結果  実行時エラー '424':オブジェクトが必要です。


提示されて頂きました下記の記述でVB6を起動しましたら
Command1ボタンが起動後にCommand2〜Command4が許可され、Command2(赤)Command3(青)が動作できました。

Option Explicit

   ↓
   ↓
Command4.Enabled = False
End Sub

ご指導、ご指摘
>ドキュメントの読み込みを待ち合わせるために、ループ待機を用いないようにしましょう。
>かわりに DocumentComplete イベントを使い、それが呼び出された後で
>objIE.Document の処理を許可するようにします。
>ループ中で DoEvents を呼び出しているので(本来は望ましくない)、
>ループ中に他のボタンを押せてしまう可能性があります。

>その場合、objIE が Nothing (あるいは Empty) という未設定の状態や、
>.forms("form1") が ロードされきる前に処理されてしまう可能性もありえます。
>(今回の事象がそうだといっているわけでは無いですが)

> >    Set objIE = objIE1
>そもそも変数 objIE は宣言されていないので、
>文法エラーになるはずなのですが…。

ご指導、ご指摘は勉強させてもらいます。自分が考えた以上のものになりました。
心より感謝を申し上げます。

[ツリー表示へ]
タイトルRe^3: エクセル動作確認後、VB6でのエラーにつきまして
記事No16287
投稿日: 2017/03/16(Thu) 23:58
投稿者susu
魔界の仮面弁士 さん

済みません追加分です。Debug.Print全ての(7個)"objIE”で
[コンパイル エラー:変数が定義されていません。]になりました。

>Debug.Print "objIE => "; TypeName(objIE)
>Debug.Print "objIE.Document =>"; TypeName(objIE.Document)
>Debug.Print "forms.length="; objIE.Document.forms.length
>Debug.Print "forms['form1'] is nothing?", objIE.Document.forms("form1") Is Nothing
>Debug.Print "lcolor =>"; TypeName(objIE.Document.forms("form1").lcolor)
>Debug.Print "lcolor[0] =>"; TypeName(objIE.Document.forms("form1").lcolor(0))
>Debug.Print objIE.Document.forms("form1").lcolor(0).outerHTML

[ツリー表示へ]
タイトルRe^4: エクセル動作確認後、VB6でのエラーにつきまして
記事No16288
投稿日: 2017/03/17(Fri) 00:14
投稿者susu
魔界の仮面弁士 さん

度々、済みません。

Debug.Print全ての(7個)"objIE”を"IE"にしましたら

IE => IWebBrowser2
objIE.Document =>HTMLDocument
forms.length= 1
forms['form1'] is nothing?  False
lcolor =>DispHTMLElementCollection
lcolor[0] =>HTMLInputElement
<input name="lcolor" type="checkbox" value="赤">

大変、勉強になりました。

[ツリー表示へ]
タイトルRe^3: エクセル動作確認後、VB6でのエラーにつきまして
記事No16289
投稿日: 2017/03/17(Fri) 10:55
投稿者魔界の仮面弁士
> > >    Set objIE = objIE1
> >そもそも変数 objIE は宣言されていないので、
> >文法エラーになるはずなのですが…。
>
> Debug.Print "objIE => "; TypeName(objIE)                   結果  objIE => Empty(空白)
> Debug.Print "objIE.Document =>"; TypeName(objIE.Document)  結果  実行時エラー '424':オブジェクトが必要です。

この状態になるということは、
Set objIE = objIE1 が実行される前に Command2 が押されたか、
もしくは Command1 内の objIE と Command2 の objIE が
異なるスコープの変数であったことを意味します。


また、結果が Empty であったということは、objIE は変数名に反して As Object ではなく
As Variant 相当のデータ型であった事になります。

当初のコードには「Option Explicit」が記載されていましたが、
この場合、objIE 変数が未宣言としてコンパイルエラーになるはずなので、
実行すらできないように思います。

実際のソースには Option Explicit は記載されていなかったということでしょうか。
それとも標準モジュール等で Public objIE などの変数宣言が行われていたのでしょうか。

[ツリー表示へ]
タイトルRe^4: エクセル動作確認後、VB6でのエラーにつきまして
記事No16290
投稿日: 2017/03/17(Fri) 17:18
投稿者susu
魔界の仮面弁士 さん

お世話になります。

返信して頂きましてありがとうございます。

> Debug.Print "objIE => "; TypeName(objIE)                   結果  objIE => Empty(空白)
> Debug.Print "objIE.Document =>"; TypeName(objIE.Document)  結果  実行時エラー '424':オブジェクトが必要です。

>ひとまず Command2_Click の内容を下記のようにすると、何が出力されてきますか?
私の誤りで自分が送りましたCommand2_Click内に追加するところ魔界の仮面弁士さんのCommand2_Click内に追加してしまいました。
その為、オブジェクトが違う為に上記の実行時エラー '424':オブジェクトが必要です。になりました。

また、自分が送りました記述で「Public objIE As InternetExplorer」が抜けていました。

「Public objIE As InternetExplorer」を追加後のDebug.Print結果です。

Command2_Click に以下の内容を追加しました。
                                                                                           '結果
Debug.Print "objIE => "; TypeName(objIE)                      'objIE => IWebBrowser2
Debug.Print "objIE.Document =>"; TypeName(objIE.Document)                           'objIE.Document =>HTMLDocument
Debug.Print "forms.length="; objIE.Document.Forms.length                            'forms.length= 1
Debug.Print "forms['form1'] is nothing?", objIE.Document.Forms("form1") Is Nothing  'forms['form1'] is nothing?  False
Debug.Print "lcolor =>"; TypeName(objIE.Document.Forms("form1").lcolor)             'lcolor =>DispHTMLElementCollection
Debug.Print "lcolor[0] =>"; TypeName(objIE.Document.Forms("form1").lcolor(0))       'lcolor[0] =>HTMLInputElement
Debug.Print objIE.Document.Forms("form1").lcolor(0).outerHTML                       '<input name="lcolor" type="checkbox" value="赤">


魔界の仮面弁士さが送られましたCommand2_Click内に追加してみました。
                                                     '結果
Debug.Print "IE => "; TypeName(IE)                                                  'IE => IWebBrowser2
Debug.Print "IE.Document =>"; TypeName(IE.document)                                 'IE.Document =>HTMLDocument
Debug.Print "forms.length="; IE.document.Forms.Length                               'forms.length= 1
Debug.Print "forms['form1'] is nothing?", IE.document.Forms("form1") Is Nothing     'forms['form1'] is nothing?  False
Debug.Print "lcolor =>"; TypeName(IE.document.Forms("form1").lcolor)                'lcolor =>DispHTMLElementCollection
Debug.Print "lcolor[0] =>"; TypeName(IE.document.Forms("form1").lcolor(0))          'lcolor[0] =>HTMLInputElement
Debug.Print IE.document.Forms("form1").lcolor(0).outerHTML                          '<input name="lcolor" type="checkbox" value="赤">


vb6で「Option Explicit」と「Public objIE As InternetExplorer」両方を省いた状態で行いましたら
質問しましたobjIE.Document.Forms("form1")・・・・でエラーになりました。従いまして省いで行っていたと思います。
「Option Explicit」「Public objIE As InternetExplorer」追加しますとVB6,VBA が問題なく動作しました。

私の基本的な誤り注意等に欠けていたので大変なお手数、時間を費やしてしまい本当に申し訳ありませんでした。

恐縮ですが、今後は魔界の仮面弁士さんの送って頂きました方法を使わせてもらいたいと思いますので宜しくお願い致します。

[ツリー表示へ]
タイトルRe^5: エクセル動作確認後、VB6でのエラーにつきまして
記事No16291
投稿日: 2017/03/18(Sat) 14:29
投稿者susu
魔界の仮面弁士 さん

お世話になります。

ご報告

エラーの一つでる原因も分かりました。
チエックボックスを自動入力マクロにしますと
objIE.Document.Forms("form1").lcolor・・・のところで
「実行時エラー '424':

オブジェクトが必要です。」なります。

エラー対策
>ドキュメントの読み込みを待ち合わせるために、ループ待機を用いないようにしましょう。
>かわりに DocumentComplete イベントを使い、それが呼び出された後で
>objIE.Document の処理を許可するようにします。

WEB ページの読み込み完了のイベント発生(待機)はループ待機を用いない方法を初めて知りました。
以下を使用することでエラーの原因の一つを知り解決することができました。
>Private WithEvents IE As InternetExplorer
>Private Sub IE_DocumentComplete(ByVal pDisp As Object, URL As Variant)

重ねになりますが感謝申し上げます。ありがとうございました。

[ツリー表示へ]