[ 掲示板に戻る ]

過去ログ閲覧モード

CREATEOLEOBJとGETACTIVEOLEOBJの条件式の書き方について / シスイ
EXCEL1 = CREATEOLEOBJ("Excel.Application")を開いていたらGETACTIVEOLEOBJで処理、そうでない場合はCREATEOLEOBJで処理というコードを書きたいのですが、条件式の書き方が分かりません。どういう風に書けば良いでしょうか?
下記がコードです。


if 条件式 then
EXCEL1 = GETACTIVEOLEOBJ("EXCEL.Application","Microsoft Excel - Book2.xls [互換モード]")
WHILE IEGETDATA(IE1,"TAG=h3",cnt ) <> EMPTY
data1=IEGETDATA(IE1,"TAG=h3",cnt)
XLSETDATA(EXCEL1, data1, "a"+cnt)
data2=IEGETDATA(IE1,"TAG=table",cnt)
XLSETDATA(EXCEL1, data2, "b"+cnt)
cnt = cnt + 1
WEND
else
EXCEL1 = CREATEOLEOBJ("Excel.Application")
EXCEL1.visible = True
EXCEL1.WorkBooks.Open(FileName :=path1)
WHILE IEGETDATA(IE1,"TAG=h3",cnt ) <> EMPTY
data1=IEGETDATA(IE1,"TAG=h3",cnt)
XLSETDATA(EXCEL1, data1, "a"+cnt)
data2=IEGETDATA(IE1,"TAG=table",cnt)
XLSETDATA(EXCEL1, data2, "b"+cnt)
cnt = cnt + 1
WEND

endif

No.3021 2016/10/11(Tue) 11:10:08

Re: CREATEOLEOBJとGETACTIVEOLEOBJの条件式の書き方について / シスイ
id=getid("Microsoft Excel - Book2.xls [互換モード]","XLMAIN")
ifb id=1 then
上記を加えて試しても、サイト上でスクリプト起動するとエクセルファイルが2つ開いて、1つ目はデータの出力はされますが、なぜか2つ目のエクセルファイルも開いてしまいます。
エクセルファイルを開いている状態でスクリプト起動してもGETACTIVEOLEOBJでやっているのに、既存のエクセルに出力せず、path1のエクセルが新ウィンドウとして開いてしまいます。
既存エクセルとして判定してデータ出力する方法ないでしょうか?

cnt=1
path1="C:\Users\aruke\Desktop\Book2.xls"
id=GETID(GET_ACTIVE_WIN)
変数=STATUS( id,ST_TITLE)
IE1 = GETACTIVEOLEOBJ("InternetExplorer.Application",変数)
EXCEL1 = CREATEOLEOBJ("Excel.Application")
EXCEL1.visible = True
EXCEL1.WorkBooks.Open(FileName :=path1)
//XLACTIVATE( Excel1, "Sheet2")

WHILE IEGETDATA(IE1,"TAG=h3",cnt ) <> EMPTY
data1=IEGETDATA(IE1,"TAG=h3",cnt)
XLSETDATA(EXCEL1, data1, "a"+cnt)
data2=IEGETDATA(IE1,"TAG=table",cnt)
XLSETDATA(EXCEL1, data2, "b"+cnt)
cnt = cnt + 1
WEND

id=getid("Microsoft Excel - Book2.xls [互換モード]","XLMAIN")


ifb id=1 then
EXCEL1 = GETACTIVEOLEOBJ("EXCEL.Application","Microsoft Excel - Book2.xls [互換モード]")
WHILE IEGETDATA(IE1,"TAG=h3",cnt ) <> EMPTY
data1=IEGETDATA(IE1,"TAG=h3",cnt)
XLSETDATA(EXCEL1, data1, "a"+cnt)
data2=IEGETDATA(IE1,"TAG=table",cnt)
XLSETDATA(EXCEL1, data2, "b"+cnt)
cnt = cnt + 1
WEND
else
EXCEL1 = CREATEOLEOBJ("Excel.Application")
EXCEL1.visible = True
EXCEL1.WorkBooks.Open(FileName :=path1)
WHILE IEGETDATA(IE1,"TAG=h3",cnt ) <> EMPTY
data1=IEGETDATA(IE1,"TAG=h3",cnt)
XLSETDATA(EXCEL1, data1, "a"+cnt)
data2=IEGETDATA(IE1,"TAG=table",cnt)
XLSETDATA(EXCEL1, data2, "b"+cnt)
cnt = cnt + 1
WEND

No.3022 2016/10/11(Tue) 11:53:12

Re: CREATEOLEOBJとGETACTIVEOLEOBJの条件式の書き方について / しろまさ
Try
  XL = GetActiveOleObj("Excel.Application")
Except
  XL = CreateOleObj("Excel.Application")
EndTry

GetでエラーしたらCreate。

No.3024 2016/10/11(Tue) 12:52:09

Re: CREATEOLEOBJとGETACTIVEOLEOBJの条件式の書き方について / しろまさ
id=GETID(GET_ACTIVE_WIN)
してるから、

id=getid("Microsoft Excel - Book2.xls [互換モード]","XLMAIN")
では id=2 になってるのでは?(uwsc id は使った回数の連番)

評価式は ifb id>0 が妥当かと。(これも変数を確認すれば済む話)

No.3025 2016/10/11(Tue) 13:10:25

Re: CREATEOLEOBJとGETACTIVEOLEOBJの条件式の書き方について / シスイ
しろまさ様、いつもありがとうございます。
下記のコードの意味が分かりません。ググってしてみると、実行時エラーが起きた時に実行されるとありますが、どうつかうのかがいまいち分かりません。

Try
  XL = GetActiveOleObj("Excel.Application")
Except
  XL = CreateOleObj("Excel.Application")
EndTry

GetでエラーしたらCreate。

No.3034 2016/10/13(Thu) 22:40:09

Re: CREATEOLEOBJとGETACTIVEOLEOBJの条件式の書き方について / シスイ
しろまさ様、id=getid("Microsoft Excel - Book2.xls [互換モード]","XLMAIN")
では id=2 にたしかになってました。
EXCEL1 = GETACTIVEOLEOBJ("EXCEL.Application",ida)のidaの変数にするとうまくいきましたが、これを直接タイトル入力だとなぜかうまくいきませんでした、このような感じです。EXCEL1 = GETACTIVEOLEOBJ("EXCEL.Application","Microsoft Excel - Book2.xls [互換モード]")


cnt=1
path1="C:\Users\aruke\Desktop\Book2.xls"
id=GETID(GET_ACTIVE_WIN)
変数=STATUS( id,ST_TITLE)
IE1 = GETACTIVEOLEOBJ("InternetExplorer.Application",変数)

ida=getid("Microsoft Excel - Book2.xls [互換モード]","XLMAIN")


ifb ida>0 then
EXCEL1 = GETACTIVEOLEOBJ("EXCEL.Application",ida)
WHILE IEGETDATA(IE1,"TAG=p",cnt ) <> EMPTY
data1=IEGETDATA(IE1,"TAG=p",cnt)
XLSETDATA(EXCEL1, data1, "a"+cnt)
data2=IEGETDATA(IE1,"TAG=table",cnt)
XLSETDATA(EXCEL1, data2, "b"+cnt)
cnt = cnt + 1
WEND
else


EXCEL1 = CREATEOLEOBJ("Excel.Application")
EXCEL1.visible = True
EXCEL1.WorkBooks.Open(FileName :=path1)
WHILE IEGETDATA(IE1,"TAG=p",cnt ) <> EMPTY
data1=IEGETDATA(IE1,"TAG=p",cnt)
XLSETDATA(EXCEL1, data1, "a"+cnt)
data2=IEGETDATA(IE1,"TAG=table",cnt)
XLSETDATA(EXCEL1, data2, "b"+cnt)
cnt = cnt + 1
WEND

endif

No.3035 2016/10/13(Thu) 22:46:39

Re: CREATEOLEOBJとGETACTIVEOLEOBJの条件式の書き方について / 俄プログラマー
>どうつかうのかがいまいち分かりません。

ヘルプファイルは見ない方ですか?
解りやすい例がありますよ。

No.3036 2016/10/14(Fri) 00:14:50

Re: CREATEOLEOBJとGETACTIVEOLEOBJの条件式の書き方について / しろまさ
>どうつかうのかがいまいち分かりません。

使ってみれば解りますよ。

ポイントは、オブジェクトが存在しないときに Get を使うとエラーを起こすということです。
その挙動を利用して条件判断をすれば良いわけで・・後は自分で考えましょう!

No.3038 2016/10/14(Fri) 09:01:28
連続してサイトを2つ開いてスクレイピングについて / シスイ
下記のコードでやってみると1つ目のサイトのIEGETDATAの変数
data1とdata2は取得できますが、2つ目に開いたサイトのdata1とdata2は取得できません。
GETACTIVEOLEOBJでつかめていないからでしょうか?

path="C:\Users\aruke\Desktop\Book1.xls" //データ読込用
path1="C:\Users\aruke\Desktop\Book2.xls" //データ出力用
Y = 1
cnt = 1

//エクセルのファイルを開く
EXCEL = CREATEOLEOBJ("Excel.Application")
EXCEL.visible = True
Excel.WorkBooks.Open(FileName :=path)
XLACTIVATE( Excel, "Sheet1")

SLEEP(2.0)
EXCEL1 = CREATEOLEOBJ("Excel.Application")
EXCEL1.visible = True
EXCEL1.WorkBooks.Open(FileName :=path1)


for i = 1 to 3

tek = "B"+i
Excel.Range(tek).select
URL = EXCEL.selection.value


XLACTIVATE( EXCEL1, "Sheet"+Y)
Y=Y+1
//インターネットエクスプローラーを開く
Dim IE = CreateOleObj("InternetExplorer.Application");
IE.visible = TRUE;
IE.Navigate(URL);
REPEAT
SLEEP(0.1)
UNTIL !IE.busy AND IE.readystate = 4
IE = GETACTIVEOLEOBJ("InternetExplorer.Application")
WHILE IEGETDATA(IE,"TAG=h3",cnt ) <> EMPTY
data1=IEGETDATA( IE,"TAG=h3",cnt)
XLSETDATA(EXCEL1, data1, "a"+cnt)
data2=IEGETDATA( IE,"TAG=table",cnt)
XLSETDATA(EXCEL1, data2, "b"+cnt)
cnt = cnt + 1
WEND

next

xlclose(EXCEL)

No.3018 2016/10/11(Tue) 04:56:28

Re: 連続してサイトを2つ開いてスクレイピングについて / しろまさ
IE = GETACTIVEOLEOBJ("InternetExplorer.Application")
この行、不要じゃないですか?

どうしても必要なら、第二引数でIEのタイトル指定するとか、
先にCreateしたIEは IE.Quit で消すとか。

Createを繰り返す場合はメモリ面からも先のIEを消したほうがよろしいかと。

No.3019 2016/10/11(Tue) 08:54:44

Re: 連続してサイトを2つ開いてスクレイピングについて / シスイ
しろまさ様、IE.Quitでやってみましたがエクセルに出力が2つ目開いたサイトができません。
配列に入れて他の方法でやってみましたが下記のコードでもできないです。

path="C:\Users\aruke\Desktop\Book1.xls"
path1="C:\Users\aruke\Desktop\Book2.xls"
cnt = 1

EXCEL = CREATEOLEOBJ("Excel.Application")
EXCEL.visible = True
Excel.WorkBooks.Open(FileName :=path)
XLACTIVATE( Excel, "Sheet1")
dat = XLGETDATA( Excel, "b1:b10")

//インターネットエクスプローラーを開く


Dim IE = CreateOleObj("InternetExplorer.Application");
IE.visible = TRUE;
IE.Navigate(dat[1,1]);
REPEAT
SLEEP(0.1)
UNTIL !IE.busy AND IE.readystate = 4
変数 = IE.LocationName
EXCEL1 = CREATEOLEOBJ("Excel.Application")
EXCEL1.visible = True
EXCEL1.WorkBooks.Open(FileName :=path1)
XLACTIVATE( Excel1, "Sheet1")
WHILE IEGETDATA(IE,"TAG=h3",cnt ) <> EMPTY
data1=IEGETDATA( IE,"TAG=h3",cnt)
XLSETDATA(EXCEL1, data1, "a"+cnt)
data2=IEGETDATA( IE,"TAG=table",cnt)
XLSETDATA(EXCEL1, data2, "b"+cnt)
cnt = cnt + 1
WEND
IE.Quit

Dim IE1 = CreateOleObj("InternetExplorer.Application");
IE1.visible = TRUE;
IE1.Navigate(dat[2,1]);
REPEAT
SLEEP(0.1)
UNTIL !IE1.busy AND IE1.readystate = 4

XLACTIVATE( Excel1, "Sheet2")

WHILE IEGETDATA(IE1,"TAG=h3",cnt ) <> EMPTY
data1=IEGETDATA( IE1,"TAG=h3",cnt)
XLSETDATA(EXCEL1, data1, "a"+cnt)
data2=IEGETDATA( IE1,"TAG=table",cnt)
XLSETDATA(EXCEL1, data2, "b"+cnt)
cnt = cnt + 1
WEND

No.3020 2016/10/11(Tue) 09:52:59

Re: 連続してサイトを2つ開いてスクレイピングについて / しろまさ
こうあるはずだから・・というような思い込みは捨て、取得した全ての変数を msgbox などで確認して下さい。
どこで取得できていないかが解れば、なぜ取得できないかを調べることが出来ます。
オブジェクトが取れていない、タグが違う、URLが違う、Sheetが違う、等々。

URL不明のためこちらで検証は出来ません。もっと自分でがんばって下さい。

No.3023 2016/10/11(Tue) 12:44:28

Re: 連続してサイトを2つ開いてスクレイピングについて / シスイ
しろまさ様
何度も返信頂きありがとうございます。MSGBOXで調べてみたのですが、forで2回目を繰り返す際のdata1=IEGETDATA( IE,"TAG=p",cnt)が取得できていないというのが判明しました。data1=IEGETDATA( IE,"TAG=h2",cnt)でするとシート2にも2つ目に開いたサイトのh2のデータが出力されますがこれを"TAG=p"ですると出力するデータが多いのかシート1には1つ目に開いたサイトは出力されるのですが、2つ目に開いたサイトのデータはシートには出力されません。
SLEEPを入れてみたりと試したのですが、うまくいきません。なにか良い方法ご教授願いませんでしょうか?

開いているサイトが下記になります。
[1つ目サイト]
http://keiri-note.com/%E7%B5%8C%E7%90%86%E3%81%AE%E8%BB%A2%E8%81%B7%E3%81%AB%E5%BC%B7%E3%81%84%E8%BB%A2%E8%81%B7%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88

[2つ目サイト]
http://career.jusnet.co.jp/support/

下記がコードになります。

// h2だとデータが少ないのでシート1、2で取得できたがpタグのデータが多い場合はシート1しか取得できずシート2はデータ出力なし。

path="C:\Users\aruke\Desktop\Book1.xls"
path1="C:\Users\aruke\Desktop\Book2.xls"
Y = 1
cnt = 1

//Excelデータ取得用
EXCEL = CREATEOLEOBJ("Excel.Application")
EXCEL.visible = True
Excel.WorkBooks.Open(FileName :=path)
XLACTIVATE( Excel, "Sheet1")

SLEEP(2.0)
//Excelデータ出力用
EXCEL1 = CREATEOLEOBJ("Excel.Application")
EXCEL1.visible = True
EXCEL1.WorkBooks.Open(FileName :=path1)
hazime=input("始め")
owari=input("終わり")

for i = hazime to owari
tek = "B"+i
Excel.Range(tek).select
URL = EXCEL.selection.value
XLACTIVATE( EXCEL1, "Sheet"+Y)
Y=Y+1
//インターネットエクスプローラーを開く
Dim IE = CreateOleObj("InternetExplorer.Application");
IE.visible = TRUE;
IE.Navigate(URL);
REPEAT
SLEEP(0.1)
UNTIL !IE.busy AND IE.readystate = 4
//IE = GETACTIVEOLEOBJ("InternetExplorer.Application")

WHILE IEGETDATA(IE,"TAG=p",cnt ) <> EMPTY
data1=IEGETDATA( IE,"TAG=p",cnt)
XLSETDATA(EXCEL1, data1, "a"+cnt)
cnt = cnt + 1
WEND

IE.quit
SLEEP(5.1)
next

xlclose(EXCEL)

No.3026 2016/10/12(Wed) 21:44:05

Re: 連続してサイトを2つ開いてスクレイピングについて / miles
> 2つ目に開いたサイトのデータはシートには出力されません。
cntの初期設定が抜けてますよ!

No.3028 2016/10/13(Thu) 10:38:15

Re: 連続してサイトを2つ開いてスクレイピングについて / しろまさ
シスイさん、milesさんの指摘は理解できましたか?

1つ目のサイトでは1〜45行目のタグPが取得できました。
2つ目のサイトでは46〜取得しようとしてるのでデータが無いわけです。

XLの46行目から続けたいのか、B列に移りたいのかは解りませんが、
cntの扱いに一手間必要ですね。

No.3029 2016/10/13(Thu) 12:53:23

Re: 連続してサイトを2つ開いてスクレイピングについて / シスイ
miles様、ありがとうございます。2日間ずっと悩んでいて、気付かなかった自分の実力のなさを痛感しています。cntの初期設定だったんですね。
No.3032 2016/10/13(Thu) 20:52:00

Re: 連続してサイトを2つ開いてスクレイピングについて / シスイ
しろまさ様、最後までおつきあい頂き、ありがとうございました。
cntの初期設定をWENDの後に設定でうまくできました。
色々教えて頂き感謝致します。

No.3033 2016/10/13(Thu) 20:54:32

Re: 連続してサイトを2つ開いてスクレイピングについて / 俄プログラマー
>cntの初期設定をWENDの後に設定でうまくできました。

動けばいいのであればその場所でも良いですが
なぜ初期設定が必要か?いつ初期設定が必要か?を考えてみましょう。

ヒント:最後のループ時の終了間際に初期設定の意味はありますか?

No.3037 2016/10/14(Fri) 00:19:46
クリップボードの中身を秀丸実行 / リズ
//ファイルを指定してマクロを実行
-------------------------------------
CMD = "<#DBL>C:\Program Files\Hidemaru\Hidemaru.exe<#DBL> /xマクロ名.mac <#DBL>C:\フルパス\目的のファイル.html<#DBL>"
DOSCMD(CMD,true) //実行。trueがないとファイルを閉じるまで次の命令が実行されない
-------------------------------------

上記マクロの C:\フルパス\目的のファイル.html という箇所を変更し
既にコピペされているクリップボード上のデータで動かすことは可能でしょうか。

ご教授よろしくお願いいたします。

No.3004 2016/10/06(Thu) 02:26:35

Re: クリップボードの中身を秀丸実行 / stuncloud
質問の意味がよくわからないので想像で書きます

> 上記マクロの C:\フルパス\目的のファイル.html という箇所を変更し
単純に書き換えればいいだけだと思いますが、そういう話ではなさそうなのでとりあえずファイルパスを与える部分を変数にしてみましょう

path = "C:\フルパス\目的のファイル.html"
CMD = "<#DBL>C:\Program Files\Hidemaru\Hidemaru.exe<#DBL> /xマクロ名.mac <#DBL>" + path + "<#DBL>"

> 既にコピペされているクリップボード上のデータで動かすことは可能でしょうか。
ここの意味が全くわからないんですが、僕の勘だとクリップボードに秀丸に渡したいファイルのパスが入ってるという意味なんじゃないかと思うのでそんな感じにします
先程は変数pathにリテラルのファイルパスを入れてましたが、代わりにクリップボードの値を入れるようにします

path = getstr(0) // クリップボードからパスを取得
CMD = "<#DBL>C:\Program Files\Hidemaru\Hidemaru.exe<#DBL> /xマクロ名.mac <#DBL>" + path + "<#DBL>"

これで、クリップボードにファイルパスをコピーしていればそれを渡して秀丸が実行されるようになります
勘でてきとーに回答してるので、求める結果と違うようでしたらもう少し詳細な情報をください

No.3006 2016/10/06(Thu) 09:52:23

Re: クリップボードの中身を秀丸実行 / リズ
大変失礼致しました。

クリップボードに入っているのは、ファイルパスでは無くhtmlソースです。
下記全体像です。

ie = getactiveoleobj("InternetExplorer.Application")
ctrlwin(hndtoid(ie.hwnd), ACTIVATE)

msgbox("HTMLソースを取得したい部分を選択してからOKを押してください")

selection = ie.document.getSelection()
if selection.rangeCount then
 range = selection.getRangeAt(0)
 content = range.cloneContents()
 elem = ie.document.createElement("div")
 elem.appendChild(content)
 // クリップボードへコピー
 sendstr(0, elem.innerHTML)
else
 msgbox("未選択です")
exitexit
endif

//path = getstr(0) // クリップボードからパスを取得

//CMD = "<#DBL>C:\Program Files\Hidemaru\Hidemaru.exe<#DBL> /xマクロ.mac <#DBL>" + path + "<#DBL>"
//DOSCMD(CMD,true)

IEを開き範囲選択

選択した箇所のhtmlソースを取得し、クリップボードにコピー

指定の秀丸マクロで実行したいと考えております。

※こちらは別途お願いしたいのですが、上記マクロでhttp://gori.me/google/google-news/90466を開こうとすると未選択と出てしまいます。当方では原因が見つからずご確認頂けますと幸いです。

No.3008 2016/10/06(Thu) 11:32:47

Re: クリップボードの中身を秀丸実行 / stuncloud
> 指定の秀丸マクロで実行したいと考えております。
の意味がわかりません
クリップボードにコピーしたのはHTMLソースのテキストデータなのはわかりました
そのデータを実際にどうしたいのでしょうか?そこが一番肝心なんですが記載がないのでわかりません
単に貼り付けしたいだけならclkitemのCLK_MENUでメニューを操作するなりSCKEYでCtrl+Vするなりで良いと思います
マクロの内容が関係するならマクロが何をしているかを教えてください

> ※こちらは別途お願いしたいのですが、上記マクロでhttp://gori.me/google/google-news/90466を開こうとすると未選択と出てしまいます。当方では原因が見つからずご確認頂けますと幸いです。
こちらでは問題なく選択部分のソースを得られました、そちらで正常動作しない理由はわかりません

No.3009 2016/10/06(Thu) 12:10:15

Re: クリップボードの中身を秀丸実行 / リズ
HTMLソースのテキストデータを秀丸にコピペして、こちらで用意した秀丸マクロを実行し加工したいと考えています。

>単に貼り付けしたいだけならclkitemのCLK_MENUでメニューを操作するなりSCKEYでCtrl+Vするなりで良いと思います
ご教授頂きありがとうございます。
流れとしては、HTMLソースのテキストデータを保存して、下記コードに繋げていけばよろしいでしょうか。

//CMD = "<#DBL>C:\Program Files\Hidemaru\Hidemaru.exe<#DBL> /xマクロ.mac <#DBL>" + path + "<#DBL>"
//DOSCMD(CMD,true)

> ※こちらは別途お願いしたいのですが、上記マクロでhttp://gori.me/google/google-news/90466を開こうとすると未選択と出てしまいます。当方では原因が見つからずご確認頂けますと幸いです。
こちらでは問題なく選択部分のソースを得られました、そちらで正常動作しない理由はわかりません

そうなんですね。ご確認頂ありがとうございます。

No.3010 2016/10/06(Thu) 12:39:35

Re: クリップボードの中身を秀丸実行 / stuncloud
> 流れとしては、HTMLソースのテキストデータを保存して、下記コードに繋げていけばよろしいでしょうか。
いやどうですかね、わかりません、多分違うんじゃないかな

ここからはまたしても推測込みで書いていきます

> Hidemaru.exe /x マクロファイル テキストファイル

まずこれがどういう動きなのか知らないのでなんとも言えません
(というか秀丸に関してはわかんないので答えようがありません)
思うにテキストファイルを開いてそれに対してマクロを実行させるとか、そういったことなのでしょう (推測)
だったら話は簡単で、コピーしたHTMLソースをファイルに保存してそのファイルパスを渡せばいいでしょう

ただ、わざわざクリップボード経由でやりたいということは新規にファイルを作成したくないといった事情があるんでしょう (推測)
だとするとコマンドライン実行が解だとは思えません (推測)
多分あなたがやりたいことはこうすればできます (推測)

1. IEで特定サイトを開き、一部のソースを取得しクリップボードに格納
2. 秀丸を開く
3. 秀丸に先程のクリップボードデータを貼り付ける
4. マクロを実行しテキストを加工する

1の部分はそちらで提示されたコードの通りです、ちゃんと動作した体で話を進めます
2以降はDOSCMDでやろうとしていた部分の代わりになります
先ず2はexecかなんかで秀丸を開くだけです、コマンドラインオプションは付けません
その後秀丸にペーストします、ここは先程書いたような方法でいけるでしょう
最後の4、マクロの実行ですがこれも秀丸のメニューを操作すればできるでしょう、多分
これもclkitemかsckeyでできるはずです

以上です、どうでしょう
追加で質問がある場合はなるべく (推測) しなくても良いようにしていただけるとありがたいです

No.3011 2016/10/06(Thu) 14:00:34

Re: クリップボードの中身を秀丸実行 / リズ
1. IEで特定サイトを開き、一部のソースを取得しクリップボードに格納
2. 秀丸を開く
3. 秀丸に先程のクリップボードデータを貼り付ける
4. マクロを実行しテキストを加工する

アドバイスありがとうございます。
この手順で解決出来ました。
説明不足の点、申し訳ありません。

No.3015 2016/10/07(Fri) 14:28:06
平行処理について / yaku
煮詰まってしまったので、申し訳ございませんが、ここで質問させて頂きます。
よろしくお願い致します。

1台の端末(Win10)のIE(IE11)で下記プログラムを動かしています。
test1とtest2とtest3は、各々別ウインドウで、全て同じ処理をします。

3つのウインドウで平行して各々独自に処理をして欲しいのですが
test1でCLKITEMの処理待ちをしていると、
test2やtest3で「判定する」ボタンを押せる状態であるにもかかわらず
押されずに待っている状態になります。
その後、test1の処理待ちが終わった後にtest2かtest3のいずれかのボタンが順番に押されます。
(test1、test2、test3のいずれかが処理待ちになると、他の2つが待ち状態になります。)

CLKITEMでCLK_BACKを指定したり、MOUSEORGをはさんだりしたのですが
非アクティブになるだけで、制御をとられているのは変わりません。

下記を完全に平行に独自に処理することは出来るのでしょうか。
よろしくお願い致します。

thread test1();
thread test2();
thread test3();

procedure test1()
URL1 = "〜URL〜";
IE1=GETACTIVEOLEOBJ("InternetExplorer.Application","",1);
IE1.visible = true;
wid1 = HNDtoID(IE1.hwnd);

REPEAT
IE1.navigate(URL);
BusyWait(IE1); //表示待ち
UNTIL CLKITEM(wid1, "判定する", CLK_ACC) = TRUE //「判定する」を押す

//その後の処理
fend

procedure test2()
URL2 = "〜URL〜";
IE2=GETACTIVEOLEOBJ("InternetExplorer.Application","",2);
IE2.visible = true;

//test1と同様の処理
fend

procedure test3()
URL3 = "〜URL〜";
IE3=GETACTIVEOLEOBJ("InternetExplorer.Application","",3);
IE3.visible = true;

//test1と同様の処理
fend

No.2995 2016/10/03(Mon) 22:29:01

Re: 平行処理について / stuncloud
一つのスレッドで処理待ちしてる間ほかのスレッドをブロックしてしまう理由はわかりませんが、解決方法は単純でthreadを使うのを止めてスクリプトを個別に3回実行すればいいんじゃないかと思います(それぞれ別プロセスで動かせばお互い影響を受けない)
例えばこんな感じで

if length(PARAM_STR) then
 select PARAM_STR[0]
  case 1
   test1()
  case 2
   test2()
  case 3
   test3()
 selend
else
 for i = 1 to 3
  exec("<#DBL>" + GET_UWSC_DIR + "\uwsc.exe<#DBL> <#DBL>" + GET_CUR_DIR + "\" + GET_UWSC_NAME + "<#DBL> " + i)
 next
endif

No.2997 2016/10/04(Tue) 09:57:05

Re: 平行処理について / yaku
回答をありがとうございます。

個別に3回実行すればいい。なるほど・・・とは思ったのですが
ソースの前半部分の意味が分かりません。
以下は何の処理をしているのでしょうか。
申し訳ございませんが、ご回答よろしくお願い致します。

if length(PARAM_STR) then
 select PARAM_STR[0]
  case 1
   test1()
  case 2
   test2()
  case 3
   test3()
 selend

No.3002 2016/10/05(Wed) 22:38:45

Re: 平行処理について / stuncloud
先ずスクリプトを普通に実行すると実行時パラメータが付加されないのでPARAM_STRの長さが0となり、elseの処理が行われます
そこで、for文により自分自身を3回再実行する処理を行います
このとき実行パラメータにそれぞれ1〜3のいずれかの値を渡しています

再実行された3つのスクリプトはそれぞれ1〜3の実行時パラメータを持った状態なのでPARAM_STRの長さが1となり、selectの処理に入ります
そして、パラメータに1が与えられたスクリプトはtest1()を実行、2ならtest2()を実行、3ならtest3()を実行するという仕組みです

No.3005 2016/10/06(Thu) 09:34:40

Re: 平行処理について / yaku
ご丁寧に説明をして頂きありがとうございます。
アドバイス頂いたものを参考にして修正してみます。

本当にありがとうございました!

No.3014 2016/10/06(Thu) 23:21:46
指定フォルダの画像選択(ピクセル)→削除 / world
全くの初心者です。

いろいろ模索しておりましたがわからずご教授お願い致します。

今回指定フォルダの画像選択(ピクセル)→削除の件ですが

ある特定のフォルダ内の画像サイズ(例:300×300以下のピクセルは全て削除)というような
プログラムを作りたいのですがどのように書いたら宜しいでしょうか。



while True
if GETKEYSTATE(VK_ESC) then exit // ESCキーで終了
ifb CHKIMG("check.bmp") // 画像があった
BTN(LEFT, CLICK, G_IMG_X, G_IMG_Y) // 左クリック
break
endif
ifb PEEKCOLOR(320, 320) = $00FF00 // 指定ピクセルが緑
KBD(VK_SPACE) // スペースキー
break
endif
sleep(1)
wend

こちらのスクリプトを応用するのでしょうか?

*指定したいのはファイルサイズ(削除のため)のみです。


よろしくお願い致します。

No.3007 2016/10/06(Thu) 11:04:00

Re: 指定フォルダの画像選択(ピクセル)→削除 / 俄プログラマー
//画像ファイルのピクセルサイズ取得(ファイル情報より取得)
//参照元より少し変更しています。
//
//参照元:http://nymemo.com/uwsc/867/

//エクスプローラの詳細情報を得る
dim o_Shell = CreateOleObj("Shell.Application")
dim s_dir   = get_cur_dir

//このファイルと同じフォルダにあるものとする
dim s_fileName = "test.jpg"

//NameSpace(名前空間)でフォルダオブジェクトを作る
dim o_folder = o_Shell.NameSpace(s_dir)

//ParseNameで指定されたアイテムの FolderItem オブジェクトを作成し返す。
//FolderItem とは、フォルダに含まれる個々のファイルやフォルダのこと。
dim o_item  = o_folder.ParseName(s_fileName)

dim i = 31 //長さを参照するための番号win10の場合。必要に応じて変更

//GetDetailsOfメソッドでフォルダ内のアイテムについて詳細を取得。
dim s_columName = o_folder.GetDetailsOf(emptyparam, i)
dim s_value   = o_folder.GetDetailsOf(o_item, i)
s = i +" : "+ s_columName +" = "+ s_value
print s


以下ヘルプファイルを参照して考えてみてください。
ファイルの削除:DELETEFILE
ファイル名の取得:GETDIR

一度に全てを行おうとせずに、先ずは上の例で動作テストを行い
ピクセル情報が取得できたなら次のステップへ進みましょう。

No.3013 2016/10/06(Thu) 18:37:47
IESetData(IE,True,"","on",2) // CHECKBOX について / 小林健治
最近ライセンス購入しまだ慣れていない者ででございます。
ご教授お願いいたします。

IE11を使用しています。
JavaScliptで書かれたリスト構造の一覧があります。
200項目まで表示されているものです。
RecIEを使用して記録を取り(チェックBOXのクリック)再生してもチェックのON/OFFがききません。

Java Access Bridge for Microsoft Windows Operating System 2.0 をインストールしてください

とHELPに記載されています。HELPの下の方には
・ accessibility.properties を C:\Program Files (x86)\Java\jre7\lib へコピー
・ access-bridge.jar、jaccess.jar を C:\Program Files (x86)\Java\jre7\lib\ext へコピー
・ JavaAccessBridge.dll、JAWTAccessBridge.dll を C:\Program Files (x86)\Java\jre7\bin へコピー
と記載されていますが、私のPCのフォルダは以下ののようにバージョンが違います。

コピー先 C:\Program Files (x86)\Java\jre1.8.0_101
ファイル日付も新しい状態です。

それでも、Java Access Bridge for Microsoft Windows Operating System 2.0 のコピーは必要でしょうか?

以上、
 

No.2999 2016/10/05(Wed) 17:24:57

Re: IESetData(IE,True,"","on",2) // CHECKBOX について / stuncloud
> JavaScliptで書かれたリスト構造の一覧があります。
JavaScliptはtypoだとして、JavascriptとJavaは別物なんですがJavaで作られたページということで良いでしょうか?
そうである場合は以下に続きます、そうでない場合は別途回答します

> それでも、Java Access Bridge for Microsoft Windows Operating System 2.0 のコピーは必要でしょうか?
はい
ただ、今でも使えるのかどうかはわかりませんが…
使えるのであれば
> コピー先 C:\Program Files (x86)\Java\jre1.8.0_101
の中の然るべきフォルダにそれぞれのファイルを配置すれば良いかと思います

それとこの場合はiesetdataではなくclkitemを使うことになります

No.3000 2016/10/05(Wed) 18:05:14

Re: IESetData(IE,True,"","on",2) // CHECKBOX について / 小林健治
stuncloud さん
フォローありがとうございます。

結果から言いますと、Value指定が正しくなかたようです。
IE起動中にF12で立ち上がる「開発者ツール」の使い方を他者から聞きました。
確認したところ以下のValueでした。

IESetData( IE, True, "", "id=ctl00_content_TableView_0_1" ) // checkbox No.1

ご協力ありがとうございました。

No.3012 2016/10/06(Thu) 14:47:15
【エクセルでの行の指定】 / myuu
【エクセルでの行の指定】

エクセルのA1からA4000までを選択&コピー&貼り付け行いたいです。

その選択方法について教えてください。
以下のように選択することを考えましたが、B列、C列・・・・SG列と500個位同じ動作を繰り返す際に、列の指定が
難しくなります。
 EXCEL.Range("A1:A4000").Select


XLGETDATA(Excel,"A1:SG4000")と一度に全部取得することも考えましたが、取得データを貼り付ける際に、1マスづつの貼り付け
となり時間がかかりNGとしました。(KBD関数でコピー&貼り付けを行いたいです)

そこで、列をアルファベットではなく、数値で指定し、任意の範囲を選択出来ないでしょうか。

よろしくお願い致します。

No.2987 2016/10/02(Sun) 16:43:37

Re: 【エクセルでの行の指定】 / 俄プログラマー
RangeではなくCellsを使います。
Excelの事なので詳しくはWebで使い方を調べてみてください。
例はたくさんあります。

No.2988 2016/10/02(Sun) 19:20:20

Re: 【エクセルでの行の指定】 / myuu
>俄プログラマー
解決しました(>_<)
大変ありがとうございます(^^)/

No.3003 2016/10/05(Wed) 22:49:55
クリックしたいのですが / カニ
<li class="left">
<span class="answer-select">

このソースをクリック出来ますか?

No.2938 2016/09/27(Tue) 07:52:49

Re: クリックしたいのですが / まるぱ
まずは一度試してみましょう
DOM操作で。
ヒントはつぎのとおりです

Ele = IE.document.getElementyByTagName("span")
for i =0 to Ele.length -1
CN = Ele.item(i).ClassName
if CN = "answer-select"
Ele.item(i).click()
break
endif
next

No.2941 2016/09/27(Tue) 09:06:24

Re: クリックしたいのですが / カニ
ご回答ありがとうございます


申し訳ありません、文章と説明が抜けていたので、補足します

<li class="left">
<span class="answer-select">
<img src="/assets/img/xxxxx/xxxxx/NT_xxxxxx_image18.png">


このサイトでは選択肢は複数あり、全てのソースは上記の通りです

そして、このソースに載っているimage18の部分も全て同じです

IESetData(IE,True,"","src="http://loqz-cdn.xxxx.jp/assets/img/xxxxx/xxxxx/NT_xxxxx_image18.png")

上記のようにプログラムを組むと、正常に選択してくれないのですが、どうすればよいのでしょうか?

No.2974 2016/09/30(Fri) 00:46:17

Re: クリックしたいのですが / まるぱ
ヘルプをよく読みましょう
戻値 = IESETDATA( IE, 値, Name, [Value, 番号] )

※ 第三引数に"TAG=IMG"が指定された場合には、第四引数には画像のパスの指定が可

No.2978 2016/09/30(Fri) 22:48:30

Re: クリックしたいのですが / カニ
ご回答ありがとうございます

返信が遅れて申し訳ありません、無事解決出来ました


重ねてお礼申し上げます

No.2998 2016/10/04(Tue) 16:48:30
何度もchkimg のループを実行する時のデータ呼び出しについて / masaki
while true
if chkimg("test.bmp") then
処理1
else
処理2
endif
sleep(0.1)
wend

とした場合に画像データはchkimgが実行される度に読み込みを行っていますか?
それともメモリ上にキャッシュされ画像データの読み込みは一度だけですか?
上記の例の場合1秒間に10回(実際にかかる時間は考慮せず)も読み込んでいるのかと疑問に思いました。

No.2981 2016/10/01(Sat) 10:00:42

Re: 何度もchkimg のループを実行する時のデータ呼び出しについて / まるぱ
while true
msgbox("test.bmpを入れ替えて下さい")
if chkimg("test.bmp") then

と変更して、メッセージボックスでOKを押す前に
test.bmpの画像を他の画像に入れ変えれば

その答えが出ますね。

他の画像(名前はtest.bmpにする)に入れ替えても処理1なら「画像データの読み込みは一度だけ」と考えていいのではないでしょうか?


疑問>実験>結果から考察>次の実験>結果から考察、、、、

No.2984 2016/10/01(Sat) 21:42:02

Re: 何度もchkimg のループを実行する時のデータ呼び出しについて / koi
http://www3.rocketbbs.com/13/bbs.cgi?id=umiumi&mode=pickup&no=534
でのumiumiさんの書き込みによると
BMPはUWSC内部でキャッシュしているので毎回読みには行きません。
ということのようです

No.2986 2016/10/02(Sun) 04:16:15

Re: 何度もchkimg のループを実行する時のデータ呼び出しについて / しゅん
回答でなくて申し訳ないですが、、、
koiさん、まるぱさんの意図を汲んでも良かったのではないでしょうか。
飢えている人に魚を与えるより、釣り方を教えた方が良いケースは多いかと思います。

masakiさん、スクリプトにPRINT文を適宜入れ、時間とログを取るようにすると、その手の疑問は解消しますよ。
いつ画像データを読むかも想像できるようになります。

No.2990 2016/10/03(Mon) 00:18:56

Re: 何度もchkimg のループを実行する時のデータ呼び出しについて / masaki
まるぱ様、koi様ご返信ありがとうございます。
先ず、まるば様の方法で試してみました。
結果は画像入れ替えで入れ替えた反応がでました。
つまり再読込がされている事になります。
続いてkoi様の過去の投稿にもある通り毎回読まないとumiumi様のご回答で確認致しました。
画像が変われば再読込をして画像がそのままであれば再読み込みしないと言う事で宜しいでしょうか?
それとも毎回読み込みを行っているのか少々混乱しております。
しゅん様ご返信ありがとう御座います。おっしゃる通りですが内部的要素を含むため今回質問させて頂きました。これはUWSCを作った側でしか判らないと判断しました。

No.2992 2016/10/03(Mon) 09:47:44

Re: 何度もchkimg のループを実行する時のデータ呼び出しについて / umiumi
>画像が変われば再読込をして画像がそのままであれば再読み込みしないと言う事で宜しいでしょうか?
そうです。

No.2994 2016/10/03(Mon) 21:37:02

Re: 何度もchkimg のループを実行する時のデータ呼び出しについて / masaki
umiumi様
おかげさまで疑問がすっきり解決しました。
ありがとうございました。

No.2996 2016/10/04(Tue) 08:29:08
特定のファイルをzipさせたい / taku
フォルダの中にある特定の複数のファイルをzip圧縮させたいのですが、

そもそもUWSCでzip圧縮する方法が分かりません。

分かる方いらしたら、ご教授くださいませ。

No.2982 2016/10/01(Sat) 15:09:01

Re: 特定のファイルをzipさせたい / Nagatani
Lhaplusであれば下記の通りです。

EXEC("<#DBL>C:\Program Files (x86)\Lhaplus\Lhaplus.exe<#DBL> /O:C:\Users\xxxxxxxx\Documents /C:zip C:\Users\xxxxxxxx\Documents\book1.xlsx",True)

No.2983 2016/10/01(Sat) 18:41:56

Re: 特定のファイルをzipさせたい / satocha
カレントディレクトリに"empty.zip"を作り、そこに圧縮する場合

sha = CreateOleObj("Shell.Application")
powershell( "Set-Content -path empty.zip -value (<#dbl>PK<#dbl> + [char]5 + [char]6 + (<#dbl>$([char]0)<#dbl> * 18)) -ErrorAction Sto" )
zip=sha.NameSpace("empty.zip")
zip.CopyHere(圧縮したいフォルダやファイルのパス)


このあと、zip.CopyHereでいくらでもファイルやフォルダを追加できます

No.2985 2016/10/02(Sun) 04:11:15

Re: 特定のファイルをzipさせたい / stuncloud
powershell()関数を使うのがアリで、さらにWindows 10であればCompress-ArchiveというCmdletでzipファイルが作れますよ
例: jpgファイルだけをjpg.zipに圧縮
cmd = "Get-ChildItem .\folder\*.jpg | Compress-Archive -DestinationPath jpg.zip"
powershell(cmd)

No.2993 2016/10/03(Mon) 10:27:14
全796件 [ ページ : << 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ... 80 >> ]