Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


8088 / 13644 ツリー ←次へ | 前へ→

【35028】Webの検索窓などのデータを含めてテキス... Dai 06/2/19(日) 16:05 質問[未読]
【35029】Re:Webの検索窓などのデータを含めてテキス... かみちゃん 06/2/19(日) 16:17 発言[未読]
【35034】Re:Webの検索窓などのデータを含めてテキ... Dai 06/2/19(日) 17:48 発言[未読]
【35036】Re:Webの検索窓などのデータを含めてテキ... Kein 06/2/19(日) 18:46 発言[未読]
【35051】Re:Webの検索窓などのデータを含めてテキ... Dai 06/2/20(月) 13:10 発言[未読]
【35060】Re:Webの検索窓などのデータを含めてテキ... Kein 06/2/20(月) 15:19 回答[未読]
【35077】Re:Webの検索窓などのデータを含めてテキ... Dai 06/2/21(火) 8:23 お礼[未読]
【35178】Re:Webの検索窓などのデータを含めてテキ... Dai 06/2/23(木) 10:06 お礼[未読]
【35188】Re:Webの検索窓などのデータを含めてテキ... Kein 06/2/23(木) 14:11 発言[未読]
【35192】Re:Webの検索窓などのデータを含めてテキ... Dai 06/2/23(木) 14:50 発言[未読]
【35194】Re:Webの検索窓などのデータを含めてテキ... Kein 06/2/23(木) 16:01 発言[未読]

【35028】Webの検索窓などのデータを含めてテキス...
質問  Dai  - 06/2/19(日) 16:05 -

引用なし
パスワード
   はじめまして。Daiです。
よろしくお願いします。

WebのページをExcelのWorksheetsにテキスト形式で貼り付けて
データを利用しているのですが、
不具合がありまして、みなさんのお知恵を拝借したいです。

下のマクロを貼り付け用のsheetに作成し、
1.Web画面を全て選択してクリップボードにコピー
2.貼り付けsheetのA列をダブルクリック
3.テキスト形式でデータが貼り付く
この仕様で利用していてソコソコ上手くいっていたのですが、
文の途中に入力欄がある場合、
その中身のデータがテキストで貼り付いてないことがわかりました。
Formatを"html"にすると入力枠と共に貼り付きますので
クリップボードのデータとしてはあるようです。

例としては、
こちらのサイトの"Microsoft Office の使い方に困ったら・・・"の後にある
入力欄のデータも一緒にテキスト形式で貼り付くようにするには、
どう改版したら良いのでしょうか?


以下現在のマクロ

'Sheetに対するダブルクリックの設定
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Excel.Range,Cancel As Boolean)
  
  'ダブルクリックした場所が1列目(A列)ならば実行
  If Target.Column = 1 Then
    'データが残ってないかチェック
    If WorksheetFunction.CountA(ActiveSheet.Range("A:A")) > 0 Then
    MsgBox "データが既にあります。確認してください。"
    
    Else
    
    'テキスト形式でクリップボードのデータを貼り付け
     ActiveSheet.PasteSpecial Format:="テキスト",Link:=False,DisplayAsIcon:=False
  
    End If
  End If
  
End Sub

【35029】Re:Webの検索窓などのデータを含めてテキ...
発言  かみちゃん E-MAIL  - 06/2/19(日) 16:17 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>こちらのサイトの"Microsoft Office の使い方に困ったら・・・"の後にある
>入力欄のデータも一緒にテキスト形式で貼り付くようにするには、

ブラウザは、何をお使いでしょうか?
発想を変えて、ブラウザ連携のコードが必要かと思いますが、INPUTタグ(入力
欄)の内容を取得したいという事情がよくわかりません。
INPUTタグに対して、データをセットしたいというご質問ならよくあるのですが、
まずは、その場合であれば、過去ログ[#32262]の内容または、[#34717]からのご
質問が参考になりますでしょうか?
なお、何らかの事情でINPUTタグの内容を取得したいのであれば、この過去ログ
を少し変えることで対応は出来るかと思います。

【35034】Re:Webの検索窓などのデータを含めてテキ...
発言  Dai  - 06/2/19(日) 17:48 -

引用なし
パスワード
   Daiです。早速の反応ありがとうございます。

>ブラウザは、何をお使いでしょうか?
>発想を変えて、ブラウザ連携のコードが必要かと思いますが、INPUTタグ(入力
>欄)の内容を取得したいという事情がよくわかりません。

IE6.0を使用しています。
INPUTタグの件ですが、実際にはformかもしれません。
事情を説明しますと複数のWebベースグループウェアのデータを
Excelでリスト化するマクロの一部となってます。
現状は、Excelにテキストで貼り付いた文字列から
findとMidで必要な部分だけを取り出してリスト化しています。

1つのグループウェアでは全てweb本文になって送付されてくるので
このマクロで問題なく動作します。

もう1つのグループウェアでは、
formかInputか(現在接続できないので明日、確認します)の中に
値として入ってきているようなのです。
Web画面から見ると枠の中にデータがある感じです。
(知識不足な回答ですいません・・)

過去ログを拝見しました。
ObjectとしてIEをコントロールしているのですが、
URLの値が可変になってしまいそうです。
クリップボードのデータからhtmlソースを引き出すことは
難しいでしょうか?

>INPUTタグに対して、データをセットしたいというご質問ならよくあるのですが、
>まずは、その場合であれば、過去ログ[#32262]の内容または、[#34717]からのご
>質問が参考になりますでしょうか?
>なお、何らかの事情でINPUTタグの内容を取得したいのであれば、この過去ログ
>を少し変えることで対応は出来るかと思います。

【35036】Re:Webの検索窓などのデータを含めてテキ...
発言  Kein  - 06/2/19(日) 18:46 -

引用なし
パスワード
   >クリップボードのデータからhtmlソースを引き出す
普通は、そんな煩わしいことをとなくても

Dim MyHTML As String

と、文字列型変数を用意して、IE のインスタンスを作成後に

MyHTML = IE.Document.DocumentElement.InnerHTML

などとすれば、Navigateしたサイトの全HTMLソースを取得できます。
ただしそこには、FormのTextBoxの入力値などが含まれているかどうかは分かりません。
ちなみに 〜 InnerText とすれば、タグを除いた画面の表示文字列のみを取得できます。
さらに HTMLソースの取得に限れば、IEをCreateObjectしなくても、↓のXLMHTTP
を使う方法で高速処理が出来ます。
http://www.f3.dion.ne.jp/~element/msaccess/AcTipsVbaXMLHTTP.html
(いちおう私が使っているコードは、↑とはちょっと違って
  Set oHttp = CreateObject("Microsoft.XMLHTTP")
  oHttp.Open "GET", URL, False
  oHttp.Send
  HtSt = oHttp.ResponseText
のようになりますが)

【35051】Re:Webの検索窓などのデータを含めてテキ...
発言  Dai  - 06/2/20(月) 13:10 -

引用なし
パスワード
   Daiです。

Keinさん、情報提供ありがとうございます。
IEのObjectについて知識が乏しく
"IE.Document.DocumentElement.InnerHTML"ですが、
Webやヘルプなど調べてみてもよくわかりませんでした・・
もう少し勉強します。

すでに開いているIEのページに対して
ExcelへソースをEUCからS-JISにエンコードして
取り出すのは可能ですか?

該当のページから"ソースの表示"を選ぶと文字コードが"EUC"の為、
文字化けしてしまいます。
Shift-JISで編集したところ、以下のサンプルのようになります。
実際は"<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=euc-jp">
でした。
"山田" "太郎" をStringとして取り込みたいです。

サンプル.htmlの中身
-----ここから
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=s-jis-jp">
<TITLE>サンプル</TITLE>
<BODY bgcolor="#ffffff" text="#000000" link="#0000ff" vlink="#000099" alink="#ff0000" leftmargin="0" topmargin="0" marginwidth="0" marginheight="0">
<BR>
氏名
*<INPUT type="text" value="山田"127" size="20" readonly>
*<INPUT type="text" value="太郎" maxlength="127" size="20" readonly>
<BR>

</FORM>
</BODY>
</HTML>
-------ここまで

【35060】Re:Webの検索窓などのデータを含めてテキ...
回答  Kein  - 06/2/20(月) 15:19 -

引用なし
パスワード
   >文字コードが"EUC"の為、文字化けしてしまいます。
Shift-JIS等へ変換するソフトは、↓にあります。
http://www.vector.co.jp/vpack/filearea/win95/util/text/conv/code/index.html
なおこちらにはBASP21コンポーネントがインストールされているので、Kconvメソッドで
変換テストをしてみましたが、それはうまくいきませんでした。
>"山田" "太郎" をStringとして取り込みたいです。
ということなら

Sub Get_MyHTML()
  Dim oHttp As Object
  Dim HtSt As String, Nm As String
  Dim x As Long, y As Long
  Const URL As String = "http://xxxxxxxx"
 
  Set oHttp = CreateObject("Microsoft.XMLHTTP")
  oHttp.Open "GET", URL, False
  oHttp.Send
  HtSt = oHttp.ResponseText
  x = InStr(1, HtSt, "value=")
  If x = 0 Then
   MsgBox "検索値が見つかりません", 48: GoTo ELine
  End If
  x = x + 7: y = InStr(x, HtSt, """")
  Nm = Mid$(HtSt, x, y - x)
  x = InStr(y, HtSt, "value=")
  x = x + 7: y = InStr(x, HtSt, """")
  Nm = Nm & Mid$(HtSt, x, y - x)
  MsgBox Nm
ELine:
  Set oHttp = Nothing
End Sub

というようにして、HTMLソースから目的の文字列を切り出すことができる
と思います。

【35077】Re:Webの検索窓などのデータを含めてテキ...
お礼  Dai  - 06/2/21(火) 8:23 -

引用なし
パスワード
   Daiです。

Keinさん、ありがとうございました。
作成して頂いたマクロで実行してみたのですが、
Valueの値が文字化けしてしまい、ほとんどが"?"になってしまいます。
MsgBoxでoHttpの中身をみても"???"です。
Nmの値は"??????"となっており、マクロが正常に動作していることは確認できました。
他のWebでも調べてみたのですがExcelのバージョンが2000だと、
ResponseTextが、うまくいかないような事が書いてありました。

他の作業とのカラミもありまして
クリップボードからのソースの取り出しに再度、チャレンジしてみようと思います。
いろいろ調べた結果、DataObjectを使って、Excel内のObjectにすれば、
できるかもしれないと思ってます。(使い方はこれから研究ですが・・)

【35178】Re:Webの検索窓などのデータを含めてテキ...
お礼  Dai  - 06/2/23(木) 10:06 -

引用なし
パスワード
   Daiです。おはようございます。
クリップボードからの抜き出しはできませんでした。
ですが、かみちゃんさん、Keinさんのアドバイスを参考にして
目的は達成することができました。
本当にありがとうございました。
いままでウマくいかなかったのは、
変数を宣誓するのをすべて"Dim"でやってたからでした。
(独学のためPubilcの使い方をしりませんでした。はすがしい)

かみちゃんさん
過去ログ、大変参考になりました。
ありがとうございました。

Keinさん
35036でご指摘の通りIEのインスタンスを作成後に
HTMLソースを抜くパターンがはるかに楽でした。
別のマクロで起動した後に画面が変わっても
インスタンスが継続されることが理解できました。
FormのTextBoxの入力値についても、.InnerHTMLなら
入力したばかりのデータでも無事取得できました。
ありがとうございました。

下のマクロで改良したほうが良い点があれば
ぜひぜひ、教えてください。


Public objIE As Object 'IEオブジェクト参照用

Sub IECreate()

 Dim strURL As String
 
 strURL = "http://www.google.co.jp/"

 'インターネットエクスプローラーのオブジェクトを作る
 Set objIE = CreateObject("InternetExplorer.application")
 
objIE.Visible = True '見えるようにする
objIE.Navigate strURL


  '表示終了まで待つ
  Do While objIE.Busy = True
  '何もしないループ
   DoEvents
  Loop

End Sub


Sub SuIE()

Dim Su As String

  '表示終了まで待つ(念のため)
  Do While objIE.Busy = True
  '何もしないループ
   DoEvents
  Loop

With objIE.Document
    'ソースをSuへ
    Su = .Body.innerHTML
End With
 
Call ListMake(Su) 'Suのデータからリストを作る
    
'HTMLソースの取得テスト
'    Open "C:\SampleSu.txt" For Output As #1
'      Print #1, Su
'    Close #1
'ソーステストEnd

End Sub


Sub ListMake(Su As String)

Dim Getdata As String  '取得文字列
Dim SWord As String 'ソースの切り出したい直前の文字列
Dim EWord As String ''エンドの直後の文字列
Dim x As Long, y As Long
  
SWord = "Value="
EWord = ">"
x = InStr(1, Su, SWord)
  If x = 0 Then
    MsgBox "検索値が見つかりません"
    Exit Sub
  Else
    MsgBox "検索成功"
    x = x + Len(SWord): y = InStr(x, Su, EWord)
    Getdata = Mid$(Su, x, y - x)
    x = y + Len(EWord)
    MsgBox Getdata
  End If

End Sub

【35188】Re:Webの検索窓などのデータを含めてテキ...
発言  Kein  - 06/2/23(木) 14:11 -

引用なし
パスワード
   >下のマクロで改良したほうが良い点
とくにありませんが、なぜ処理を二つに分けたのかが分かりません。
もしそのように分割処理する必要があるなら

Public objIE As Object

Sub IECreate()
  Const strURL As String = "http://www.google.co.jp/"

  If Not objIE Is Nothing Then Exit Sub
  Set objIE = CreateObject("InternetExplorer.application")
  objIE.Navigate strURL
  Do While objIE.Busy = True: DoEvents: Loop
  Do While objIE.ReadyState <> 4: DoEvents: Loop
End Sub

Sub SuIE()
  Dim Su As String

  If objIE Is Nothing Then Exit Sub
  Su = objIE.Document.Body.innerHTML
  Call ListMake(Su) 'Suのデータからリストを作る
  'HTMLソースの取得テスト
  'Open "C:\SampleSu.txt" For Output As #1
  'Print #1, Su
  'Close #1
  'ソーステストEnd
End Sub

というようにすれば良いかとおもいます。あくまで個人的なスタイルの問題ですが。

【35192】Re:Webの検索窓などのデータを含めてテキ...
発言  Dai  - 06/2/23(木) 14:50 -

引用なし
パスワード
   Daiです。

実際に使ってみるとエラー処理がないことに気がつきました。

使い方としてはIECreateでブラウザを開いておいて、
開いたブラウザ上でデータを入力したり、リンクをクリックしたり
画面を進めていきます。

その後、ほしい情報の画面になったらSuIEを起動させて
ソースからデータを取り込む と2つに分けて使ってます。

IECreateで作成されたインスタンスだけは、
With objIE 
  .AddressBar = False
  .MenuBar = False
  .StatusBar = False
  .Toolbar = False
End With
を追加してメニューバーを消して、
他のブラウザ画面と差別化してるのですがこのインスタンスにだけ、
右クリックにSuIEを起動させるメニューを追加することも
できるのでしょうか?


▼Kein さん:
>>下のマクロで改良したほうが良い点
>とくにありませんが、なぜ処理を二つに分けたのかが分かりません。
>もしそのように分割処理する必要があるなら
>
>Public objIE As Object
>
>Sub IECreate()
>  Const strURL As String = "http://www.google.co.jp/"
>
>  If Not objIE Is Nothing Then Exit Sub
>  Set objIE = CreateObject("InternetExplorer.application")
>  objIE.Navigate strURL
>  Do While objIE.Busy = True: DoEvents: Loop
>  Do While objIE.ReadyState <> 4: DoEvents: Loop
>End Sub
>
>Sub SuIE()
>  Dim Su As String
>
>  If objIE Is Nothing Then Exit Sub
>  Su = objIE.Document.Body.innerHTML
>  Call ListMake(Su) 'Suのデータからリストを作る
>  'HTMLソースの取得テスト
>  'Open "C:\SampleSu.txt" For Output As #1
>  'Print #1, Su
>  'Close #1
>  'ソーステストEnd
>End Sub
>
>というようにすれば良いかとおもいます。あくまで個人的なスタイルの問題ですが。

【35194】Re:Webの検索窓などのデータを含めてテキ...
発言  Kein  - 06/2/23(木) 16:01 -

引用なし
パスワード
   IEの右クリックメニューへExcel・VBAのプロシージャを登録したい、ということ
ですか ? 例えば↓のようなところを参考にして、自作する事ができますか ?
http://www.geocities.co.jp/SilkRoad/4511/vb/ieright.htm#script
できるならやってみて下さい。

8088 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free