都道府県穴埋めゲーム

事前にIEとExcelが開いている状態で、

表示されているWEBページを全選択(Ctrl+A)→コピー(Ctrl+C)して
Excelに切り替えて、最終行の一番左A列(Ctrl+End →Ctrl+左矢印キーですか?)で
値で貼り付けするにはどうすれば良いでしょうか?

その後、IEに戻って次のページに進んで(「次の20件」というリンクテキストをクリック)して、
WEBページのコピーをExcelの最終行に値で貼り付け・・・を繰り返そうと思っています。

本当は、「次の20件」というテキストががリンク無しテキストになるまで繰り返したいのですが、
分からないので、For文で適当に100回とか繰り返そうと思っています。

一番教えて欲しいのは、
・Excel最終行のA列に値で貼り付ける方法

もし次に分かると嬉しいのは
・これ以上次のページが見つからない場所まで自動で繰り返す方法
です。
よろしくお願いいたします。

A 回答 (1件)

>表示されているWEBページを全選択(Ctrl+A)→コピー(Ctrl+C)して


>Excelに切り替えて、最終行の一番左A列(Ctrl+End →Ctrl+左矢印キーですか?)で
>値で貼り付けするにはどうすれば良いでしょうか?

前回のご質問ではEXCELシートを「Shift+F11」で追加しながらコピーを貼り付けるという方針だったように思いますが、方針転換し一つのシートに次々とコピーを貼り付けるということのようです。

ただ、実際にやってみるとわかるのですが、WEBページをコピーすると当然テキストリンクや一部画像もコピーされますので、「形式を選択して貼り付け」から「値」は選択できません。
また、リンクを含むセルを値コピーするとリンク情報がなくなって、文字情報のみコピーされます。
ご質問者の最終意図はCSVファイルを取得することだと理解していますので、これではCSVファイルのダウンロードができないと思います。

というわけで、値コピーではなくHTMLでコピーすることとします。

EXCELにIEの画面のHTMLを貼り付けるサンプルを作成してみました。
EXCELを起動し、最小化してタスクトレイに入れた状態にしてから、UWSCを起動してください。

このサンプルの動作は、
①「教えて!goo」の「コンピュータ・テクノロジー」のカテゴリの質問一覧ページにIEでアクセスし、CTRL+AおよびCTRL+CでHTMLを取得
②EXCEL画面を表示し、最終行を探してその次の行を開始行として、HTMLを貼り付け
③IEに戻り「次の結果→」をクリック、①に戻り「次の結果→」がなくなったら終了
という動きをするものです。

従って
(1)URLを「コピー対象WEBのURL」に書き換える。
(2)「次の結果→」を「次の20件 >>」に書き換える
(3)EXCELを起動し、最小化してタスクトレイに入れた状態からスタート
とすれば、ご希望の動作になるのではないかと思いますが、EXCELとIEを組み合わせるならUWSCではなく、VBAで記述したほうがよいような気もします。
なお、以下のご要望
>「次の20件」というテキストががリンク無しテキストになるまで繰り返し
>たいのですが、
これも、対象WEBの構造が不明ですので、一応対応したつもりですが、実際動かしてみないとわかりません。

IE = CreateOLEObj("InternetExplorer.Application")
URL = "https://oshiete.goo.ne.jp/articles/qa/2012/"
IE.Visible = True
IE.Navigate (URL)
BusyWait (IE)
SLEEP(0.2)
IE2EXCEL()
flag0 = 1
While true
IF flag0 = 0 Then Break
KeyWordClick(IE,"次の結果→",Flag0)
Wend
MsgBox ("終了しました")

Procedure BusyWait(IE)
Repeat
Sleep (0.2)
until (! ie.busy) and (ie.readyState=4)
Fend

Procedure KeyWordClick(IE, KeyWord,Var Flag)
flag = 0
a_tag = IE.Document.getElementsByTagName("a")
For i=0 to GETOLEITEM(a_tag)-1
COM_ERR_IGN
If ALL_OLE_ITEM[i].innerText = KeyWord Then
flag = 1
ALL_OLE_ITEM[i].Click()
BALLOON("次ページへのリンクを見つけました。遷移します。")
BusyWait (IE)
BALLOON()
IE2EXCEL()
BREAK
EndIf
COM_ERR_RET
Next
Fend

procedure IE2EXCEL()
While true
ID0=GETID(" - Internet Explorer")
if id0>0 then break
SLEEP(0.2)
Wend
SLEEP(0.2)
CTRLWIN(ID0,MAX)
CTRLWIN(ID0,ACTIVATE)
SLEEP(0.2)
MOUSEORG(ID0)
BTN(LEFT,CLICK,84,15,300) //IEのウィンドウの上部枠をクリック(実際の画面にあわせてクリック位置を調整する)
SLEEP(0.2)
SENDSTR(0,"")
While true
IF GETSTR(0)<>"" then break
SCKEY(ID0,VK_CTRL,A,C)
SLEEP(0.2)
WEND
//buff=GETSTR(0) 本当に値コピーでよいなら頭のスラッシュ2つを削除
While true
ID1=GETID("- Excel")
if id1>0 then break
SLEEP(0.2)
Wend
SLEEP(0.2)
CTRLWIN(ID1,MAX)
CTRLWIN(ID1,ACTIVATE)
//SENDSTR(0,buff) 本当に値コピーでよいなら頭のスラッシュ2つを削除
SLEEP(0.2)
SCKEY(ID1,VK_CTRL,VK_HOME)
SLEEP(0.2)
SCKEY(ID1,VK_CTRL,VK_END)
SLEEP(0.2)
SCKEY(ID1,VK_CTRL,VK_LEFT)
SLEEP(0.2)
SCKEY(ID1,VK_DOWN)
SLEEP(0.2)
SCKEY(ID1,VK_CTRL,V)
SLEEP(0.3)
Fend

EXCELに貼り付けするのではなく、HTMLをそのまま保存する方法もありますが、当該ページのリンクの記述方法によっては取得したHTMLが正しく機能しない場合もあります。以下はC:\ログ出力というフォルダを作成しておけば、そのフォルダに上記のEXCELに貼り付ける内容をそのままページ毎にHTMLで、LOG1,html、LOG2.html・・・というように保存するスクリプトです。
(1)URLを「コピー対象WEBのURL」に書き換える。
(2)「次の結果→」を「次の20件 >>」に書き換える
(3)「C:\ログ出力\」の部分を実際に保存するフォルダ名に変更する
を実施してご利用ください。

No = 0
IE = CreateOLEObj("InternetExplorer.Application")
URL = "https://oshiete.goo.ne.jp/articles/qa/2012/"
IE.Visible = True
IE.Navigate (URL)
BusyWait (IE)
SLEEP(0.2)
No=No+1
save_html(IE,No)
flag0 = 1
While true
IF flag0 = 0 Then Break
KeyWordClick(IE,"次の結果→",Flag0,No)
Wend
MsgBox ("終了しました")

Procedure BusyWait(IE)
Repeat
Sleep (0.2)
until (! ie.busy) and (ie.readyState=4)
Fend

Procedure KeyWordClick(IE, KeyWord,Var Flag,var No)
flag = 0
a_tag = IE.Document.getElementsByTagName("a")
For i=0 to GETOLEITEM(a_tag)-1
COM_ERR_IGN
If ALL_OLE_ITEM[i].innerText = KeyWord Then
flag = 1
ALL_OLE_ITEM[i].Click()
BALLOON("次ページへのリンクを見つけました。遷移します。")
BusyWait (IE)
BALLOON()
No=No+1
save_html(IE,No)
BREAK
EndIf
COM_ERR_RET
Next
Fend

Procedure save_html(IE,No)
BaLLOON("LOG"+No+".htmlを保存中です。")
body = IEGetSrc(IE, "BODY")
body= replace(body,'//','https://')
body= replace(body,'https:https://','https://')
f_Name ="Log"+No+".html"
fid0=fopen("c:\ログ出力\"+F_Name,F_WRITE8)
FPUT(fid0,body,F_ALLTEXT)
FCLOSE(fid0)
BaLLOON()
fend

この投稿サイトでは「"」が変換されてしまうので、「'」で記述してあります。上記スクリプトの「'」は全て「"」に置換してからご利用ください。

保存されたHTMLをFireFoxやChromeで開くと正しく表示されるようですが、IEで開いたらが文字化けする場合は「エンコード」を「UTF-8」にしてください。
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報

このQ&Aを見た人がよく見るQ&A