[ 掲示板に戻る ]

過去ログ閲覧モード

SETHOTKEYを利用した複数のプログラム / mogutan
いつもお世話になっております。"SETHOTKEY"を利用し"ESC"キーを押すと終了処理を行うプログラムをEXE化し、複数起動した場合2個目以降のプログラムでは思うように終了してくれません。これは仕様又は使い方の間違いでしょうか?宜しくお願い致します。
(Windows10Pro x64 UWSC Pro V5.2.2以降)
例↓

SETHOTKEY(VK_ESC,,"終了処理")

WHILE TRUE
  // ----- 処理1
WEND

PROCEDURE 終了処理()
 // ----- その他の処理
EXITEXIT
FEND

No.3046 2016/10/16(Sun) 10:44:12

Re: SETHOTKEYを利用した複数のプログラム / miles
SETHOTKEYの戻値を見てください。
1個目は成功、2個目以降は失敗していると思います。
多分、同じキーコードの重複設定はできないのでしょう。

No.3047 2016/10/16(Sun) 17:12:23

Re: SETHOTKEYを利用した複数のプログラム / mogutan
おっしゃる通り1つ目は"True"、2つ目以降は"False"が返って来ます。誰かがUWSCで組んだプログラムがたまたま動作していて、知らないで偶然にも同じキーを使用したプログラムを実行した場合はうまく動かない事が有るが、それは仕様なので仕方が無いと言う事なのですね。ご教示ありがとう御座いました。
No.3056 2016/10/19(Wed) 08:55:06
CLASSENDCLASSでPROCEDUREした関数が呼び出しについて / タカハシ
CLASSENDCLASSでPROCEDUREした関数が呼び出しがうまくいきません。[tesuto.UWS]を起動すると下記のようなエラーが表示されます。[tesuto.UWS]のCOMMONPROC.data(tmp)を入力したりもしたのですがうまくいきません。何が間違っているのでしょうか?

[エラーコード]
COMMONPROC.data引数の数が合いません
4行目:COMMONPROC.data()


[共通化.UWS]
CLASS COMMONPROC

PROCEDURE data(tmp)
Excel = XLOPEN("C:\Users\aruke\Dropbox\abc.xlsx",True)
tes = XLGETDATA( Excel, "a1:a30")
tmp=SLCTBOX(SLCT_BTN OR SLCT_STR,0,"会社一覧",tes)
fend

ENDCLASS


[tesuto.UWS]
// 共通クラスの呼び出し
CALL 共通化.UWS

COMMONPROC.data()

No.3049 2016/10/18(Tue) 09:06:21

Re: CLASSENDCLASSでPROCEDUREした関数が呼び出しについて / しろまさ
tmp を参照引数にしたいなら
PROCEDURE data(var tmp)

実行側も変数を渡す必要あり。
Dim vTmp
COMMONPROC.data(vTmp)
msgbox(vTmp)

でもFunctionにして結果を受け取ったほうが楽な気がしますが。

ちなみにエラーは引数指定してるのに引数を与えないから出ています。
省略可能にしたい場合はこんな感じで。
PROCEDURE data(tmp = "")

Help(uwsc.chm)を読みましょう。

No.3050 2016/10/18(Tue) 09:30:16

Re: CLASSENDCLASSでPROCEDUREした関数が呼び出しについて / タカハシ
しろまさ様、回答ありがとうございます。
PROCEDUREは、教えて頂いた通りにした所、期待通りの結果が得られました。
PROCEDUREとFUNCTIONの違いについて検索やHelp(uwsc.chm)で調べてはみたのですが、手続き型と関数の違いという事やresultが返すかどうかという事はわかりました。実際に自分でコードを書いてみてもいまいちPROCEDUREとFUNCTIONの違いが自分の中で使い分けができません。

>でもFunctionにして結果を受け取ったほうが楽な気がしますが。
楽になるとは、tesuto.UWSのコードのdimの宣言が必要なくなるという事でしょうか?
Functionにして結果を受け取るとは、下記のようなコードにするという事でしょうか?
質問ばかりで申し訳ございません。

Function data(var tmp)
Excel = XLOPEN("C:\Users\aruke\Dropbox\2-キーワードエクセル\エージェント会社\経理エージェント会社一覧.xlsx",True)
tes = XLGETDATA( Excel, "a1:a30")
tmp=SLCTBOX(SLCT_BTN OR SLCT_STR,0,"エージェント会社",tes)
result =tmp
fend

No.3051 2016/10/18(Tue) 11:23:04

Re: CLASSENDCLASSでPROCEDUREした関数が呼び出しについて / しろまさ
// 関数側
Function data()
Excel = XLOPEN("C:\Users\aruke\Dropbox\2-キーワードエクセル\エージェント会社\経理エージェント会社一覧.xlsx",True)
tes = XLGETDATA( Excel, "a1:a30")
result =SLCTBOX(SLCT_BTN OR SLCT_STR,0,"エージェント会社",tes)
fend

// 実行側
Dim res = COMMONPROC.data()

戻りが2つ以上のときに参照引数を使うようにしてます。
例えばresultはboolを返して戻りは参照として
Ifb COMMONPROC.data(vTmp)
 ・・・
などを多用してます。見やすくコードを減らしたいので^^

No.3052 2016/10/18(Tue) 11:32:23

Re: CLASSENDCLASSでPROCEDUREした関数が呼び出しについて / しろまさ
// resultを使った(適当な)例

dt1 = "平成28年9月29日"
dt2 = "2016/55/44"
msgbox( "例えばこのfmt関数は(" + dt1 + ")を変換すると(" + fmt(dt1) + ")が取り出せますが、<#CR>" _
+ "有り得ない日付(" + dt2 + ")を指定するとエラーが返るので、元の日付(" + fmt(dt2) + ")を返しています。")

Function fmt(dt, fm = "yyyy/MM/dd")
  Result = PowerShell("return [Datetime]::Parse(<#DBL>" + dt + "<#DBL>).ToString(<#DBL>" + fm + "<#DBL>)")
  If Pos("例外が発生", Result) > 0 Then Result = dt Else Result = Trim(Result)
FEnd

// Powershell関数が遅い場合はこちらを読んでね。
// http://siromasa.html.xdomain.jp/uwsc/u_term/PowerShell.html

No.3053 2016/10/18(Tue) 12:35:22

Re: CLASSENDCLASSでPROCEDUREした関数が呼び出しについて / タカハシ
しろまさ様、何度も返信ありがとうございます。Functionのresultを使ってそのような事ができたんですね。まったく知りませんでした。教えて頂いたコードで無事できました。


>戻りが2つ以上のときに参照引数を使うようにしてます。
例えばresultはboolを返して戻りは参照として
Ifb COMMONPROC.data(vTmp)

上記の意味が今の自分のレベルでは分かりません。戻りが2つ以上のときに参照引数を使うとは、下記のコードだとExcelとtesとresultという認識で宜しいのでしょうか?

// 関数側
Function data()
Excel = XLOPEN("C:\Users\aruke\Dropbox\2-キーワードエクセル\エージェント会社\経理エージェント会社一覧.xlsx",True)
tes = XLGETDATA( Excel, "a1:a30")
result =SLCTBOX(SLCT_BTN OR SLCT_STR,0,"エージェント会社",tes)
fend

>例えばresultはboolを返して戻りは参照として
boolの意味が分からなかったので調べたのですが、bool型は論理型とも呼ばれ、そのとり得る値としてtrueとfalseしかないと検索で分かりました。

No.3054 2016/10/18(Tue) 12:47:59

Re: CLASSENDCLASSでPROCEDUREした関数が呼び出しについて / タカハシ
しろまさ様、下記のコード起動させて頂きました。今の自分では理解が完全にはできていないですが、じっくりコードを読ませて頂き勉強させて頂きます。Functionを使った引数の条件分岐を操れるようになるとUWSCでできる事が拡がりそうで楽しみです。ありがとうございました。

// resultを使った(適当な)例

dt1 = "平成28年9月29日"
dt2 = "2016/55/44"
msgbox( "例えばこのfmt関数は(" + dt1 + ")を変換すると(" + fmt(dt1) + ")が取り出せますが、<#CR>" _
+ "有り得ない日付(" + dt2 + ")を指定するとエラーが返るので、元の日付(" + fmt(dt2) + ")を返しています。")

Function fmt(dt, fm = "yyyy/MM/dd")
  Result = PowerShell("return [Datetime]::Parse(<#DBL>" + dt + "<#DBL>).ToString(<#DBL>" + fm + "<#DBL>)")
  If Pos("例外が発生", Result) > 0 Then Result = dt Else Result = Trim(Result)
FEnd

No.3055 2016/10/18(Tue) 13:02:17
UWSC Ver5.2.3 / umiumi
SENDSTR関数にて 一部パターンが設定できなかったのを修正
DEF_DLLの LongLong型にて 32bit以上の値が扱えなかったのを修正
CLICKITEM関数にて 一部のアプリにて指定アイテムが無い時に時間がかかるのを修正
CLICKITEM関数にて API/UIAインターフェースのみを指定する CLK_API/CLK_UIAを付けた
IE関数としてフレームを返す IEGETFRAME関数を付けた
CREATEOLEOBJ, CREATEOLEOBJ関数にて "MSEdge.Application" の指定を廃止にした
INPUT, MSGBOX, SLCTBOXにて 位置指定に -1を指定すると前回位置に表示するようにした
メイン画面の 閉じるボタンにて 終了動作だったのを タスクトレイ格納に変更した

No.3045 2016/10/16(Sun) 03:39:31

Re: UWSC Ver5.2.3 / stuncloud
> INPUT, MSGBOX, SLCTBOXにて 位置指定に -1を指定すると前回位置に表示するようにした
これはうれしい

No.3048 2016/10/17(Mon) 10:22:29
ファイル存在チェック / オカナガ
ファイル存在チェックで質問です。
Ver4.9cではFOPEN( ファイル名,F_EXISTS)でファイルの種類(*.txt)などをフォルダ名に付加し、ファイルの種類を限定した形で可能でしたが、Ver5.2.2ではできません。
仕様が変更されたのでしょうか。

No.3041 2016/10/14(Fri) 11:10:11

Re: ファイル存在チェック / しろまさ
> FOPEN Nagatani
> ・・・
> DATE:2014/5/23(Fri) 15:12 No.5391
>
> RE:FOPEN umiumi
> FOPEN関数にてワイルドカードは使えなくなりました。
> 代わりに GETDIR関数を利用してください。
> ifb GETDIR("C:\データ", "*.TXT")>0 then
> DATE:2014/5/24(Sat) 00:10


過去ログ検索でやっと見つけた。。

No.3042 2016/10/14(Fri) 16:42:51

Re: ファイル存在チェック / オカナガ
しろまき様ありがとうございます。
了解です。
過去ログ検索利用します。

No.3043 2016/10/14(Fri) 18:05:26
SLCT BOXのスクロールについて / みつ
SLCTBOXのSLCT_BTNを30個くらい作っていますが、22個くらいしか画面に表示しきれずに
スクロールバーが右側に出ていますが、マウスのスクロールを回しても反応しません。

毎回下にある項目をクリックする時に、スクロールバーをクリックしドラッグしながら
下にスクロールしなければいけないのですが、
マウスのスクロールボタンでスクロールさせることは可能でしょうか。

また、他に良い方法があればご教授お願いいたします。
よろしくお願いいたします。

No.3016 2016/10/09(Sun) 12:24:12

Re: SLCT BOXのスクロールについて / 俄プログラマー
ポップアップメニューに変えて整理してみては?
SLCTBOXの使用例にも載っています。

他にもF1〜F12で使っていないキーに割り当ててしまう
INPUTを使って数字入力で処理分けするなど方法は他にもあるかと思いますよ。

No.3017 2016/10/09(Sun) 12:29:26

Re: SLCT BOXのスクロールについて / みつ
俄プログラマー様

ご連絡ありがとうございます。
今回は、字を小さくすることで対応しました。

OPTION DEFAULTFONT = "MS ゴシック, 8.0"

No.3040 2016/10/14(Fri) 09:48:48
Windowsに作業中と認識させたい / ろじゃ
Windows10で更新プログラム適用後に自動で再起動するのを抑止する方法を考えています。
(proでしたらgpedit.mscで設定できるようですが、homeは使えないようで困っています)

現在の最新バージョンでは、アクティブ時間を指定すれば、その時間帯の再起動は防げるようですが
アクティブ時間外の場合は、PCを操作していなければ自動で再起動されてしまいます。
(その際、作業中のファイルなどは保存されません)

そこでUWSCのスクリプトで、席を外すときにMMVをループさせて、マウスを動かしている状態を維持するスクリプトを作ったのですが
うまくいかずに再起動されてしまいました。

Windowsに作業中と認識させることができる命令って何を使えばできるでしょうか?
ご存知でしたら教えてください。
よろしくお願いします。

No.3027 2016/10/13(Thu) 10:30:46

Re: Windowsに作業中と認識させたい / しろまさ
gpedit.msc、インストールできるみたいですよ(私は使ったことはありません)
http://www.billionwallet.com/goods/windows10/windows10_gpedit.html

No.3030 2016/10/13(Thu) 15:06:37

Re: Windowsに作業中と認識させたい / ろじゃ
情報ありがとうございます!
結構裏技っぽい感じですね。
やってみます。

UWSCで作るのはちょっと無理っぽいですかね?

No.3031 2016/10/13(Thu) 16:46:15

Re: Windowsに作業中と認識させたい / しろまさ
> UWSCで作るのはちょっと無理っぽいですかね?

作ろうと思ったこともないし、作りたいとも思いません。
Updateが終わったら早めに再起動しますし、
席を離れるなら制御などせずに、再起動したほうがPC為にも良いのでは?

主観ですのでお気になさらずに。
それと、Update時間はスケジュール出来るのはご存知ですよね?

No.3039 2016/10/14(Fri) 09:13:11
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
全832件 [ ページ : << 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ... 84 >> ]