Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Home : Excel 2016)
Yahoo!メールを使った一括送信のプログラムについて、分からない箇所があります。
投稿日時: 20/03/19 06:24:34
投稿者: かつん

初めて投稿いたします。かつんと申します。
皆様どうぞよろしくお願いいたします。
 
インプレス社の、「Excel VBAでIEを思いのままに操作できるプログラミング術」という書籍内にあるYahoo!メールを使った一括送信のプログラムについて分からないところがあります。先日、インプレス社様に分からない箇所を質問したのですが、「掲載しておりますサイト、サービスについては本書の発行当時から再三の仕様変更が行われており、現時点では検証およサポートが非常に難しくなっております。」との回答でしたので、解決には至っておりません。
 
Yahoo!メールの「宛先」、「件名」、「本文」それぞれにソースコード内の内容を反映させます。特にエラーなく動きます。ただ、「本文」に反映させる部分のソースコードで分からない箇所があります。
・以下のソースコードは、Yahoo!メールのメール作成画面(最初の画面から、「メールの作成」ボタンを押下して表示される画面)で実行するものです。
・Yahoo!メールのバージョンは、2.0.1.447
・ブラウザはInternet Explorer11、バージョンは、11.719.18362.0
 
 
//以下、該当部分のソースコード//
Public Sub sendMail()
    Dim ie As InternetExplorer
    Set ie = getIE("Yahoo!メール")
    Dim htdoc As HTMLDocument
    Set htdoc = ie.document
 
    Dim i2
    Dim idoctitle As String
    Dim idoc As HTMLDocument
 
    For i2 = 0 To htdoc.frames.Length - 1
        idoctitle = ""
        On Error Resume Next
        idoctitle = htdoc.frames(i2).document.Title
        On Error GoTo 0
        If idoctitle = "Rich Text Editor" Then
            Set idoc = htdoc.frames(i2).document
            idoc.body.innerHTML = "ああああああ"
            Exit For
        End If
    Next
End Sub
 
Private Function getIE(arg_title As String) As InternetExplorer
    Dim ie As InternetExplorer
    Dim sh As Object
    Dim win As Object
    Dim document_title As String
     
    Set sh = CreateObject("shell.Application")
    For Each win In sh.Windows
        document_title = ""
        On Error Resume Next
        document_title = win.document.Title
        On Error GoTo 0
         
        If InStr(document_title, arg_title) > 0 Then
            Set ie = win
            Exit For
        End If
    Next
     
    Set getIE = ie
End Function
//ソースコード終わり//
 
(1)「frame要素」の数だけ、Forループを回す
(2)「frame要素」の属性「document.Title」を変数「idoctitle」に格納
(3)「idoctitle」に、"Rich Text Editor"の文字列が含まれていたら、変数「idoc」に格納
(4)「idoc」の「body.innerHTML」に、記載したい本文が入力される
 
以上(1)〜(4)の流れとなります。ただ、(3)の"Rich Text Editor"の文字列が何処にも見当たりません。
にも関わらず、実行するとyahooメールの本文欄に文章("ああああああ")が表示されるので、問題無く処理されています。
調べてみると、iframe及びframe要素は全部で8つありました。その中で、"Rich Text Editor"を持っているのは、6番目のframe要素でした。それが下記になります。
 
//コード//
<iframe width="100%" height="99%" title="メール本文" src="javascript:;" border="0" frameborder="0" marginwidth="0" marginheight="0" style="visibility: inherit;" allowtransparency="true" topmargin="0" leftmargin="0"></iframe>
//コード終わり//
 
何処にも"Rich Text Editor"の記述がありませんが、このiframeタグの「document.Title」を、出力するコードを走らせると、"Rich Text Editor"と出力されます。
 
この部分だけどうしても理解出来ません。VBAやHTML以外の言語などで特殊なことを行っているのでしょうか?
以上、お手数をおかけしますが何方か解明いただけると幸いです。
よろしくお願いいたします。

回答
投稿日時: 20/03/19 21:35:21
投稿者: MMYS

HTMLは門外漢ですが、値は
 src属性
かと思いす。
"Rich Text Editor"は
自身のHTMLではなく外部だと思います。
 

回答
投稿日時: 20/03/19 21:43:05
投稿者: 月

(こちらIEとVBAでの確認ができていないのですが)
 
Yahoo!メールの本文で右クリックして「要素の検査」とすると、<iframe>の中のHTMLが表示されますか?表示されたら<head>の中に<title>Rich Text Editor</title>があると思います。
 

win.document.all(0).outerHTML

こうすると<iframe>の中のHTMLが取れそうです。

投稿日時: 20/03/21 05:56:46
投稿者: かつん

MMYSさん
 
ということは、iframeタグ内にある『src="javascript:;"』に"Rich Text Editor"がいるということですかね?
そして、HTMLの.document.Titleから"Rich Text Editor"を引っ張ってこれるということは、『src="javascript:;"』と.document.Titleが紐づいているから。ということなんですかね?
 
 
月さん
 要素の検査したら<head>の中に確かにありました!
そして、document.all(0).outerHTMLを走らせて、テキストエディタに出力したのですがやっぱりいません。6番目のframe要素には表示上は、やはりいないのですが、htdoc.frames(i2).document.Titleを出力すると、"Rich Text Editor"と出ます。
何か突破口が見つかったと思ったのですが、現状変わらずですね。
 
 
もし、MMYSさんの説が有力なら、javascriptの技術を使っていることになりますよね?そうなると私はもう無理だなぁ・・・

回答
投稿日時: 20/03/21 12:58:35
投稿者: 月

かつん さんの引用:
そして、document.all(0).outerHTMLを走らせて、テキストエディタに出力したのですがやっぱりいません。

そうでしたか...
 
idoc.body.innerHTML = "ああああああ"

これができるなら取れると思うんですけどね(コードは上のとは違うかもしれませんが)。
週明けでよければ確認してみます。

投稿日時: 20/03/21 21:33:40
投稿者: かつん

月さん
 
急いでないので是非お願いしたいです。
このままでは気持ちが悪すぎます。

回答
投稿日時: 20/03/22 17:14:57
投稿者: baoo

う〜ん、ご質問の意図がいまいちわかりません。
Rich Text Editorの文言を取得したいということでしょうか?
この文言はプログラムを書いた人がたまたまメール本文のオブジェクトを取得するのに
利用しているだけで、特に意味は無いかと思いますが。
それにループして探しているのも意味が分からない。
このメール本文の位置が可変で変わってしまうというなら分かりますが、
どうもそうでもないようです。
そのへんについて本には説明は無かったんでしょうか?
 
単純に6番目のIFRAMEのBODYの子供のテキストノードが本文になるということで
以下で良いと思うんですけど。

Public Sub sendMail()
    
    Dim ie As InternetExplorer
    Dim idoc As HTMLDocument
    
    Set ie = getIE("Yahoo!メール")
    
    '6番目のIFRAME
    Set idoc = ie.document.getElementsByTagName("IFRAME").Item(5)
    
    'IFRAMEのBODYの子供のテキストノード
    idoc.body.ChildNodes.Item(0).NodeValue = "いいいいいいいい"
    
End Sub

 

回答
投稿日時: 20/03/22 22:27:16
投稿者: baoo

今、再度やってみたら動きませんね。
一旦、入力したりinnerHTMLで入ったら動いたりするけど。
なので、やっぱりinnerHTMLですべきですね。

Public Sub sendMail()
    
    Dim ie As InternetExplorer
    Dim idoc As HTMLDocument
    
    Set ie = getIE("Yahoo!メール")
    
    '6番目のIFRAME
    Set idoc = ie.document.getElementsByTagName("IFRAME").Item(5)
    
    idoc.body.innerHTML = "おおおおおおおお"
    
End Sub

投稿日時: 20/03/23 06:23:05
投稿者: かつん

baooさん
 

baoo さんの引用:
う〜ん、ご質問の意図がいまいちわかりません。
Rich Text Editorの文言を取得したいということでしょうか?

"取得したい"のではなく、文言が見当たらないにもかかわらず取得出来てしまう。それが何故か分からない。それを"解明したい"ということです。
 
baoo さんの引用:
それにループして探しているのも意味が分からない。
このメール本文の位置が可変で変わってしまうというなら分かりますが、
どうもそうでもないようです。

それは予め6番目のiframeタグにメール本文欄があるとは分からないから、ループで走査しているのだと思います。
 
baoo さんの引用:
そのへんについて本には説明は無かったんでしょうか?

書籍の該当部分は、発刊された2013年4月以後、yahoo!メールが数回にわたってリニューアルされているので、当初の内容からコードが変更されています。変更後のコードはインプレス社のホームページからダウンロード出来ます。そして、以下がその説明部分です。
 
'ID変更への対応、および、大幅な方式変更。TextAreaではなく、iframe内のHTMLドキュメントのBodyを編集する内容に変更。
'このライブラリを使用するようにYahoo!メールの仕様変更があった模様です→ https://yuilibrary.com/yui/docs/editor/

'【変更前】
'htdoc.getElementById("compose_editorArea").Value = MessageBody

'【変更後】
        Dim i2
        Dim idoctitle As String
        Dim idoc As HTMLDocument
        For i2 = 0 To htdoc.frames.Length - 1
            idoctitle = ""
            On Error Resume Next
            idoctitle = htdoc.frames(i2).document.Title
            On Error GoTo 0
            If idoctitle = "Rich Text Editor" Then
                Set idoc = htdoc.frames(i2).document
                idoc.body.innerHTML = "<p>" & MessageBody & "</p>"
                Exit For
            End If
        Next

回答
投稿日時: 20/03/23 08:46:33
投稿者: baoo

取り急ぎ、文言は見つかります。
IEのF12開発者ツールで該当のIFRAMEの中身を見ると、
そのタイトルにはRich Text Editorとあります。

回答
投稿日時: 20/03/23 09:47:46
投稿者: 月

all(0) ではなかったです。
 

' <html>...</html>
Debug.Print idoc.all(1).outerHTML
Debug.Print idoc.documentElement.outerHTML
Debug.Print idoc.querySelector("html").outerHTML

' <head>...</head>
Debug.Print idoc.all(2).outerHTML
Debug.Print idoc.head.outerHTML
Debug.Print idoc.querySelector("head").outerHTML

' <title>Rich Text Editor</title>
Debug.Print idoc.all(3).outerHTML
Debug.Print idoc.querySelector("title").outerHTML

投稿日時: 20/03/25 06:00:13
投稿者: かつん

月さん
 
ありがとうございます。
今日、明日とPCに触れる時間が無いので、後日しっかり確認させていただきます。

投稿日時: 20/03/27 06:10:08
投稿者: かつん

月さん
 
確認させていただきました。
月さんは、以下のコードで、<title>Rich Text Editor</title>と取得できたということですよね?
 

月 さんの引用:
idoc.querySelector("title").outerHTML

 
同じように私も走らせたのですが、取得結果は、
<title>未読651件 - Yahoo!メール</title>
となってしまいました。
 
何が違うのですかね?因みに、
ie.document.all(3).outerHTMLL
の取得結果は、下記です。
 
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
 
そして、やはり
htdoc.frames(5).document.Title
であれば、"Rich Text Editor"は取得できます。
 

回答
投稿日時: 20/03/27 06:20:39
投稿者: 月

どこで取得していますか?
 

If idoctitle = "Rich Text Editor" Then
    Set idoc = htdoc.frames(i2).document

    ' <html>...</html>
    Debug.Print idoc.all(1).outerHTML
    Debug.Print idoc.documentElement.outerHTML
    Debug.Print idoc.querySelector("html").outerHTML

    ' <head>...</head>
    Debug.Print idoc.all(2).outerHTML
    Debug.Print idoc.head.outerHTML
    Debug.Print idoc.querySelector("head").outerHTML

    ' <title>Rich Text Editor</title>
    Debug.Print idoc.all(3).outerHTML
    Debug.Print idoc.querySelector("title").outerHTML
    
    idoc.body.innerHTML = "ああああああ"
    Exit For
End If

投稿日時: 20/03/27 06:36:31
投稿者: かつん

月さん
 

idoctitle = htdoc.frames(i2).document.Title
は、
 
    Dim ie As InternetExplorer
    Set ie = getIE("Yahoo!メール")
    Dim htdoc As HTMLDocument
    Set htdoc = ie.document

 
なので、メール作成画面のhtmlソース全体から探して取得しているという認識なのですが。
私が何か勘違いしていますかね?

回答
投稿日時: 20/03/27 08:23:36
投稿者: baoo

htdoc.frames(i2).document.Title
にはdocumentの文字が入っていますね。
基本的にFRAMEは別ドキュメントです。
MMYSさんが言っているように外部です。
従ってメール作成画面のdocumentであるhtdocには含まれません。
例えば画像のタグなどでもsrc=で画像ファイルが指定されてたりしますが、
htmlテキストの中に画像そのものが無いのと同じです。
 
しかし、別ドキュメントであっても
Set idoc = htdoc.frames(i2).document
として新たに中身を取得出来ます。
その後はメール作成画面の
Set htdoc = ie.document
と同様に扱える。
 
ちなみにjavascriptは今回全く関係ありません。
普通にsrc=hoge.htmlでも同様です。

回答
投稿日時: 20/03/27 11:43:02
投稿者: 月

かつん さんの引用:
メール作成画面のhtmlソース全体から探して取得しているという認識なのですが。

今回は<iframe>が使われているのでhtmlソースが複数あるということです。
 
htmlは通常、このような構造をしています。
 
<!DOCTYPE html>
<html>
    <head></head>
    <body></body>
</html>

<iframe>は<body>の中にあるのでこのような形です。
 
<!DOCTYPE html>
<html>
    <head></head>
    <body>
        <iframe src="url"></iframe>
    </body>
</html>

<iframe>はsrcで指定したページを埋め込むので、埋め込まれた状態はこのようなイメージになります。
 
<!DOCTYPE html>
<html>
    <head></head>
    <body>
        <iframe src="url">
            <!DOCTYPE html>
            <html>
                <head></head>
                <body></body>
            </html>
        </iframe>
    </body>
</html>

IEの開発者ツールのDOM Explorerでもこのように表示されます。
しかし、親のページから見たソースはあくまでこちらです。
 
<!DOCTYPE html>
<html>
    <head></head>
    <body>
        <iframe src="url"></iframe>
    </body>
</html>

そのため、<iframe>で埋め込まれたページのソースは親のページのソースに含まれていません。

投稿日時: 20/03/28 05:46:11
投稿者: かつん

baooさん
説明ありがとうございます。大変よく分かりました。特に、下記の画像ファイルの例は分かり易かったです。

baoo さんの引用:
例えば画像のタグなどでもsrc=で画像ファイルが指定されてたりしますが、
htmlテキストの中に画像そのものが無いのと同じです。

月さん
ご丁寧に例まで表示していただきありがとうございます。baooさんの説明の理解がより深まりました。親のページから直接は見えないのですね。だから、いないのに取得出来たのですね。
 
お二人の説明で原因は分かりました。"Rich Text Editor"の文言自体は別ファイルに存在し、それを実際にはいない親のページから引っ張ってくるように取得していたということですね。だから文言が無いのに、取得出来た。
 
下記コードから取得できるということは、「src="javascript:;"」の中にあるということなんですかね?この外部ファイル?は何処にあるのですかね?可能であれば自分の目で見て見たいです。不可能なら諦めます。
引用:
<iframe width="100%" height="99%" title="メール本文" src="javascript:;" border="0" frameborder="0" marginwidth="0" marginheight="0" style="visibility: inherit;" allowtransparency="true" topmargin="0" leftmargin="0"></iframe>

そして、これはコードを書いた著者にしか分からないことかもしれませんが、メール本文欄の取得を何故このような条件にしたのですかね?
引用:
For i2 = 0 To htdoc.frames.Length - 1
        idoctitle = ""
        On Error Resume Next
        idoctitle = htdoc.frames(i2).document.Title
        On Error GoTo 0
        If idoctitle = "Rich Text Editor" Then
            Set idoc = htdoc.frames(i2).document

回答
投稿日時: 20/03/28 08:29:56
投稿者: 月

かつん さんの引用:
下記コードから取得できるということは、「src="javascript:;"」の中にあるということなんですかね?この外部ファイル?は何処にあるのですかね?可能であれば自分の目で見て見たいです。不可能なら諦めます。

"javascript:;" は実際にはどのページも指していません。
<iframe>の中のhtmlはJavaScriptで組み立てたものだと思います。
(組み立て後のhtmlは前に挙げたコードで取得できます。)
(ついでに言うとこの<iframe>タグ自体JavaScriptで挿入されたものだと思います。)
 
かつん さんの引用:
これはコードを書いた著者にしか分からないことかもしれませんが、メール本文欄の取得を何故このような条件にしたのですかね?

誤って他の要素が取得されない堅い方法だと思われたのでしょうね。
<iframe>のtitle属性を使っても良さそうです。
※以下のコードは動作確認できていません。
 
Public Sub sendMail()
    Dim ie As InternetExplorer
    Set ie = getIE("Yahoo!メール")
    Dim htdoc As HTMLDocument
    Set htdoc = ie.document

    Dim iframe ' As HTMLIFrameElement (この型があれば)
    Set iframe = idoc.querySelector("iframe[title=メール本文]")
    ' もしくは
    ' Set iframe = idoc.querySelector("iframe[title='メール本文']")
    iframe.document.body.innerHTML = "ああああああ"
End Sub

回答
投稿日時: 20/03/28 18:52:56
投稿者: baoo

引用:
この外部ファイル?は何処にあるのですかね?

その前にインプレス社のコードって何をやってると思います?
つまり、innerHTMLって何をしているかです。
  
そこで、Googleを表示させた状態で下記を実行してみてください。
    Set ie = getIE("Google")
    ie.document.body.innerHTML = "ぐーぐるページ"

これを見てわかるようにページを書き換えているんです。
ここで使われているinnerHTMLとかgetElementsByTagNameなどは
DOMというものに合わせて実装されています。
逆に言うと他言語でもDOMに合わせた実装があれば同様に書き換えたりできるということです。
  
そこで、改めてGoogleを表示させて(F5キーで戻ります)、下記を実行してみてください。
    Dim ie As InternetExplorer
    Dim idoc As HTMLDocument
    Dim idoc2 As HTMLDocument
    Dim ifrm As IHTMLElement
    Dim iForm As HTMLFormElement
    
    Set ie = getIE("Google")
    Set idoc = ie.document
    
    'IFrameの作成
    Set ifrm = idoc.createElement("IFRAME")
    ifrm.ID = "New_IFrame_Id"
    ifrm.Style.Width = "200px"
    ifrm.Style.Height = "50px"
    
    '見た目上、丁度良いFormの中に追加
    Set iForm = idoc.getElementsByName("f").Item(0)
    iForm.appendChild ifrm
    
    Set idoc2 = idoc.getElementById("New_IFrame_Id")
    idoc2.head.Title = "Poor Text Editor"
    idoc2.body.innerHTML = "テストページ"

もうお分かりかと思いますが、外部ファイルはありません。
しかし、動的に外部ページを生成しているということです。
実際Yahooメールの場合も生成しているのでしょう。
しかしその中身はF12開発者ツールで見ることが出来る。
"Poor Text Editor"の文言も開発者ツールなら見えます。
javascriptなどでパスワード入力画面を表示し、正しいパスワードの時だけ
ページを生成するなどという作りになっていたらお手上げかもしれませんが、
Yahooメールの場合は既に見えていますからお手上げではないでしょう。

投稿日時: 20/03/29 07:59:28
投稿者: かつん

月さん
 
動的に生成されたページということですね。
JavaScriptが絡んでくると正直お手上げです。
いずれは勉強したいと思いますが・・・
 
書いてくれたコードですが、真っ白の画面に"あああああ"と表示されてしまいます。
何かおかしいですね。
 
 
baooさん
 
ご説明の意味は理解出来ました。
ただ書いてくれたコードに自分の知らないメソッドとかあるので、少し調べたりして、きちんと理解したいと思います。せっかく丁寧にコードまで載せてもらってますので、全部吸収したいと思います。少々お待ちください。

回答
投稿日時: 20/03/29 13:08:42
投稿者: 月

かつん さんの引用:
動的に生成されたページということですね。

そうです。
 
かつん さんの引用:
書いてくれたコードですが、真っ白の画面に"あああああ"と表示されてしまいます。

変数が idoc ではなく htdoc でした。
この修正を行った上でそうなりましたかね?であれば週明けに確認してみます。
 
Public Sub sendMail()
    Dim ie As InternetExplorer
    Set ie = getIE("Yahoo!メール")
    Dim htdoc As HTMLDocument
    Set htdoc = ie.document

    Dim iframe As HTMLFrameElement ' もしくは As Object
    Set iframe = htdoc.querySelector("iframe[title=メール本文]")
    ' もしくは
    ' Set iframe = htdoc.querySelector("iframe[title='メール本文']")
    iframe.document.body.innerHTML = "ああああああ"
End Sub

投稿日時: 20/03/30 05:31:36
投稿者: かつん

月さん

月 さんの引用:
変数が idoc ではなく htdoc でした。
この修正を行った上でそうなりましたかね?

 
htdocで走らせてます。変数の間違いは無いです。

回答
投稿日時: 20/03/30 09:48:37
投稿者: 月

Public Sub sendMail()
    Dim ie As InternetExplorer
    Set ie = getIE("Yahoo!メール")
    Dim htdoc As HTMLDocument
    Set htdoc = ie.document

    Dim iframe As HTMLIFrame
    Set iframe = htdoc.querySelector("iframe[title='メール本文']")
    iframe.contentDocument.body.innerHTML = "ああああああ"
End Sub

iframe.documentではなくiframe.contentDocumentでした。
iframe.documentは自身が属するdocumentにアクセスするプロパティで、htdocと同じものを指していました。
iframe自身が持つdocumentにアクセスするのはiframe.contentDocumentでした。

回答
投稿日時: 20/03/30 13:38:35
投稿者: 月

上のコードは、自分だったらこうするというだけで、こちらの方が優れているという意味ではありません。
Webページの作りはいつ変わってもおかしくないので、どう書いたとしてもいつ動かなくなってもおかしくはありません。

回答
投稿日時: 20/03/30 19:53:18
投稿者: baoo

すみません。
どうしてHTMLDocumentで受けられるのかわかりませんが、
HTMLIFrameをHTMLDocumentで受けても動きますね。

Public Sub sendMail()
    Dim ie As InternetExplorer
    Set ie = getIE("Yahoo!メール")
    Dim htdoc As HTMLDocument
    Set htdoc = ie.document

    Dim iframe As HTMLDocument 'HTMLIFrame
    Set iframe = htdoc.querySelector("iframe[title='メール本文']")
    
    'iframe.contentDocument.body.innerHTML = "ああああああ"
    iframe.body.innerHTML = "いいいいいい"
    '↑iframe.document.body.innerHTMLではないことに注意
End Sub
どうしてなのかは少し調べてみたんですが、分かりませんでした。

回答
投稿日時: 20/03/31 10:59:42
投稿者: 月

baoo さんの引用:
どうしてHTMLDocumentで受けられるのかわかりませんが、
HTMLIFrameをHTMLDocumentで受けても動きますね。

本当ですね。
htdoc.querySelector("iframe[title='メール本文']") の戻り値のオブジェクトがHTMLDocumentと互換性があるようですね。
 
Function querySelector(v As String) As IHTMLElement

オブジェクトブラウザで見るとquerySelectorの型定義はこうなっていて、戻り値はIHTMLElement型と互換性があれば良い(IHTMLElementインターフェイスを実装していれば良い)ので、他のインターフェイスを実装していても問題ありませんが、色々実装しているオブジェクトだなぁという印象です(クラスに親子関係があるのかもしれません)。
 
Sub test1()
    Dim ie As InternetExplorer
    Set ie = getIE("Yahoo!メール")
    Dim htdoc As HTMLDocument
    Set htdoc = ie.document

    Dim iframe
    Set iframe = htdoc.querySelector("iframe[title='メール本文']")

    ' ローカルウィンドウ上はiframeはHTMLIFrame
    Debug.Print TypeOf iframe Is IHTMLElement ' => True
    Debug.Print TypeOf iframe Is HTMLIFrame   ' => True
    Debug.Print TypeOf iframe Is HTMLDocument ' => True
    Debug.Print TypeOf iframe Is HTMLWindow2  ' => True
End Sub

Sub test2()
    Dim ie As InternetExplorer
    Set ie = getIE("Yahoo!メール")
    Dim htdoc As HTMLDocument
    Set htdoc = ie.document
 
    Dim i2
    Dim idoctitle As String
    Dim iframe
 
    For i2 = 0 To htdoc.frames.Length - 1
        idoctitle = ""
        On Error Resume Next
        idoctitle = htdoc.frames(i2).document.Title
        On Error GoTo 0
        If idoctitle = "Rich Text Editor" Then
            Set iframe = htdoc.frames(i2)

            ' ローカルウィンドウ上はiframeはHTMLWindow2
            Debug.Print TypeOf iframe Is IHTMLElement ' => False
            Debug.Print TypeOf iframe Is HTMLIFrame   ' => True
            Debug.Print TypeOf iframe Is HTMLDocument ' => True
            Debug.Print TypeOf iframe Is HTMLWindow2  ' => True
            Exit For
        End If
    Next
End Sub

JavaScriptでもいきなりbodyにアクセスできるのか確認してみましたが、できませんでした。
 
var iframe = document.querySelector('iframe[title="メール本文"]');
console.log(iframe.body); // => undefined

for (var i = 0, n = document.frames.length; i < n; i++) {
    try {
        var frame = document.frames[i];
        if (frame.document.title === 'Rich Text Editor') {
            console.log(frame.body);     // => undefined
            console.log(frame.document); // => object
        }
    } catch (e) {
        //
    }
}

投稿日時: 20/04/01 05:51:37
投稿者: かつん

月さん

月 さんの引用:
iframe.documentではなくiframe.contentDocumentでした。
iframe.documentは自身が属するdocumentにアクセスするプロパティで、htdocと同じものを指していました。
iframe自身が持つdocumentにアクセスするのはiframe.contentDocumentでした。

本文欄に表示されました。ご丁寧にありがとうございます。
 
 
baooさん、月さん
月 さんの引用:
Function querySelector(v As String) As IHTMLElement

こういう時は、自分でオブジェクトブラウザで調べてみるのが大事なんですね(なんか取っつきにくくてあまり使いこなせていません)。勉強になります。

投稿日時: 20/04/05 06:23:04
投稿者: かつん

皆さま
色々とご指導いただきありがとうございます。
 
一先ず、Rich Text Editorの文言は動的に生成されたページにあること。それは親のページにはいないが、引っ張ってこれる。だから取得出来た。と、当初の目的である「何故、記載が無いにも関わらず取得できてしまうのか?」については解決したので、皆さまがよろしければクローズしようと思います(2、3日中に何も投稿が無ければ閉めようと思います)。
 
特に、月さん、baooさんご丁寧に何度もありがとうございました。
appendChildなど調べてみたのですが主にJavaScriptで使われるもののようで、私の知識ではかなり時間が掛かりそうなのでまだ理解が完了していない部分がありますが一旦終わります。
 
また、今回の件ついてはもう一つインプレス社に質問しようとしていたことがありまして、近日中にまた質問させていただこうと思っております。

投稿日時: 20/04/08 06:41:40
投稿者: かつん

特に無さそうなので、これにてクローズいたします。
皆様ありがとうございました。
 
近日中にまた質問させていただきます。
その時は、またお力を貸していただけると幸いです。