[ 掲示板に戻る ]

過去ログ閲覧モード

Microsoftのアカウント登録画面の認証画像を自動保存する方法 / 森
いつもお世話になっています。
最近は読むばかりで、なかなか回答できずに済みません。

Microsoftのアカウント登録画面の認証画像を自動保存する方法を教えて下さい。
https://signup.live.com/signup?cbcxt=mail

右クリックで保存以外の方法でお願いします。
ダウンロードできない場合は、SAVEIMGを使った保存でもOKです。

この問題で二日半足止め状態に陥っています。
どうかお知恵を貸して下さい。

よろしくお願いします。

No.1459 2015/07/14(Tue) 09:30:22

Re: Microsoftのアカウント登録画面の認証画像を自動保存する方法 / 森
補足です。

(1)imgタグのsrcに直接アクセスすると、404でダウンロードできません。
(2)以下のスクリプトだと真っ白な画像が保存されます。
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
Public IE
IE = GETACTIVEOLEOBJ("InternetExplorer.Application")
IE.Visible = True
setOleEvent()
IE.Navigate("https://signup.live.com/signup?cbcxt=mail")
BusyWait()

id = HNDtoID(IE.hwnd)
ctrlwin(id, ACTIVATE)

// 画像の位置とサイズを取得
oj = IE.document.images.item[1]
x = GetLeft(oj)
y = GetTop(oj)
w = oj.offsetWidth
h = oj.offsetHeight

// 画像を保存
saveimg("gazo.jpg", id, x, y, w, h, TRUE, 100, IMG_BACK )

// −−−−−−−−−−−−−−−−−−−−−−−−−−
// IEではoffsetLeftとoffsetTopだと余白分の誤差が出るので関数を用意
// −−−−−−−−−−−−−−−−−−−−−−−−−−
// 画像の左位置を取得
function GetLeft(oj)
 dim px = 0;
 while oj >= 1
  px = px + oj.offsetLeft;
  oj = oj.offsetParent;
 wend
 result = px;
fend

// 画像の上位置を取得
function GetTop(oj)
 dim px = 0;
 while oj >= 1
  px = px + oj.offsetTop;
  oj = oj.offsetParent;
 wend
 result = px;
fend

// ※ setOleEvent()、BusyWait()は、RecIEのを利用
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

(3)上記で x=0; y=0に設定すると左上を切り取って保存されるので、可視領域の外だと真っ白になると思われる。

No.1460 2015/07/14(Tue) 10:05:09

Re: Microsoftのアカウント登録画面の認証画像を自動保存する方法 / stuncloud
id = hndtoid(ie.hwnd)
img = ie.document.querySelector("#hipTemplateContainer img")
img.scrollIntoView() // 画像があるところまでスクロールさせる

with img.getBoundingClientRect()
 x = int(.left)
 y = int(.top)
 w = int(.width)
 h = int(.height)
 saveimg("gazo.jpg", id, x, y, w, h, TRUE, 100)
endwith

y座標がずれてましたがとりあえず保存には成功しました
ズレは調整してください

No.1461 2015/07/14(Tue) 10:55:13

Re: Microsoftのアカウント登録画面の認証画像を自動保存する方法 / 森
stuncloudさん、ありがとうございます!

最終的にはズレの原因と対策を入れて汎用性を持たせたいですが、
とりあえずキメ撃ちで補正掛けて使います!

No.1462 2015/07/14(Tue) 12:02:53

Re: Microsoftのアカウント登録画面の認証画像を自動保存する方法 / しき
//ずれの原因は、getBoundingClientRect()の座標の基準が document だからです
//今は、ここ↓(IEのクライアント座標左上)が基準になっています
mmv(status(id, st_clx) ,status(id, st_cly))

//↓こうすればOK
id_server = hndtoid(getctlhnd(id, "Internet Explorer_Server"))
saveimg("gazo.jpg", id_server, x, y, w, h, TRUE, 100)

No.1463 2015/07/14(Tue) 14:04:39

Re: Microsoftのアカウント登録画面の認証画像を自動保存する方法 / 森
しきさん、ありがとうございます!
ズレも解消されて、きっちり取得することが出来ました。

もう一つ問題が見つかったので甘えついでにお願いします!
メニュー - 表示 - 拡大 で100%以外の時にズレてしまいます。
※文字サイズの変更は問題ありませんでした。

No.1464 2015/07/14(Tue) 14:20:10

Re: Microsoftのアカウント登録画面の認証画像を自動保存する方法 / しき
現在の拡大率はステータスバーから取得できます。
125%の場合、以下のようにすればおおよそ合います
i_zoomRate = 125
x = int(x * i_zoomRate /100)
y = int(y * i_zoomRate /100)
w = int(w * i_zoomRate /100)
h = int(h * i_zoomRate /100)

または、100%に戻して取得するかです


過去ログから
|変更はIE COMでできました。WinXP, IE8
| 現在の拡大率取得は getitem(id, itm_accclk) で
|
| o_IE = GetActiveOleObj("InternetExplorer.Application")
| const OLECMDID_OPTICAL_ZOOM = 63
| const OLECMDEXECOPT_DODEFAULT = 0
| i_rate = 50 //拡大率 50%にする
| o_IE.ExecWB(OLECMDID_OPTICAL_ZOOM, OLECMDEXECOPT_DODEFAULT, i_rate)
|
| //参考URL
| IE Zoom
| http://social.msdn.microsoft.com/Forums/en/Vsexpressvb/thread/e542c4e6-acb6-44d4-b742-beab5528ac74
|
| OLECMDID enumeration
| http://msdn.microsoft.com/en-us/library/ms691264.aspx
|
|
| DATE:2012/1/11(Wed) 09:24

No.1465 2015/07/14(Tue) 15:17:26

Re: Microsoftのアカウント登録画面の認証画像を自動保存する方法 / 森
しきさん、またまたありがとうございます!!
勉強になりました、質問して本当に良かったです^^

No.1466 2015/07/14(Tue) 18:41:11

Re: Microsoftのアカウント登録画面の認証画像を自動保存する方法 / しろまさ
// COMで表示倍率の取得方法はこちら。(単位:%)
MsgBox( Int(IE.Document.frames.screen.deviceXDPI * 1.042) )

No.1467 2015/07/15(Wed) 12:20:39

Re: Microsoftのアカウント登録画面の認証画像を自動保存する方法 / 森
しろまささん、ありがとうございます!

みなさんから教えて頂いた情報を組み合わせて、すばらしいスクリプトになりました。
--------------------------------------------
id = hndtoid(ie.hwnd)
img = ie.document.querySelector("#hipTemplateContainer img")
img.scrollIntoView() // 画像があるところまでスクロールさせる

// 表示倍率の取得
zoomRate = Int(IE.Document.frames.screen.deviceXDPI * 1.042)

with img.getBoundingClientRect()
 x = int(.left * zoomRate /100)
 y = int(.top * zoomRate /100)
 w = int(.width * zoomRate /100)
 h = int(.height * zoomRate /100)
 id_server = hndtoid(getctlhnd(id, "Internet Explorer_Server"))
 saveimg("gazo.jpg", id_server, x, y, w, h, TRUE, 100)
endwith
--------------------------------------------
ありがとうございました!

No.1470 2015/07/16(Thu) 07:28:16
inputのダイアログを前回表示された位置に出したい / MachGoGoGo
inputのダイアログは,デフォルトでは「画面中央」に表示されます。
このダイアログをドラッグして任意の位置に動かしinput入力したあと,再度ループ等で同じinput文に出会った時,前回ダイアログが表示された位置に再表示したいのです。

例えば,以下のように1回目のループでは画面中央で良いのですが,2回目以降のループでは前回inputダイアログが表示されていた位置と同じ場所に表示したいのです。
(THREADで,inputダイアログを監視するしかないでしょうか?)

gx = -999; gy = -999
while 1
if gx < 0 then
Ans = input("Hoge")
// ここで,上記inputダイアログの位置gx,gyを取得したい!
else
Ans = input("Hoge","",false,gx,gy)
endif
//Ans内容による色々な処理
sleep(5)
wend

No.1454 2015/07/11(Sat) 09:58:47

Re: inputのダイアログを前回表示された位置に出したい / koujichiu
// ● INPUTBOXが出る直前に、毎回別スレッドを動かして
// INPUTBOXの窓が消える直前の座標を取得して次回に反映する感じでどうでしょう?

CONST UWSC_ID = GETID(GET_THISUWSC_WIN, , -1) //●
CONST uwscTitle = STATUS(UWSC_ID, ST_TITLE) //●
PUBLIC gx, gy //●

gx = -999; gy = -999
while 1
if gx < 0 then

THREAD GetInputBoxPos() //●スレッド呼び出し

Ans = input("Hoge")
else

THREAD GetInputBoxPos() //●スレッド呼び出し

Ans = input( "Hoge","",false,gx,gy )
endif
//Ans内容による色々な処理
sleep(5)
wend

///////// 追加 ///////////
PROCEDURE GetInputBoxPos()

WHILE True
//●INPUTBOXが出ている間は、 UWSC - ファイル名.uws というタイトルになる
//(UWSC本体のタイトルは ファイル名.uws)
activeWinID = GETID("UWSC - " + uwscTitle) // ●ここはGET_ACTIVE_WINでもいいかも
items = GETITEM(activeWinID, ITM_BTN) //●INPUTBOXのボタンの数を取得

IF items = 2
//●ボタンの名前が合っていたら
IF ALL_ITEM_LIST[0] = "OK" AND ALL_ITEM_LIST[1] = "Cancel"
//<●><●>もっと調整が必要かも(GETID("UWSC - " + uwscTitle, 0.1) 0.1秒で-1を検出とか)
WHILE True
items = GETITEM(activeWinID, ITM_BTN)
IF items <> 2 THEN BREAK 2
gx = STATUS(activeWinID, ST_X)
gy = STATUS(activeWinID, ST_Y)
WEND
ENDIF
ENDIF
SLEEP(0.1)//●INPUTBOX座標の取得間隔(もっと煮詰める?)
WEND

FEND

No.1456 2015/07/12(Sun) 13:36:44

Re: inputのダイアログを前回表示された位置に出したい / MachGoGoGo
koujichiuさん,ありがとうございます。
願っているとおりの動作です。
このまま使わせてください。 (^^ゞ

No.1457 2015/07/12(Sun) 23:43:34
LOCKHARDEX()の挙動 / しろまさ
// 下記はファイル名を指定して実行のOKボタンを押す、確認用スクリプトです。

// LOCKHARDEX(wID, LOCK_MOUSE)を実行するとBTNの動作も防がれてしまいますがこれは仕様ですか?
// 管理者権限無しで、使用者のマウス操作を抑止し、マウス操作の自動化をしたかったのですが無理でしょうか。

ScKey(0, VK_WIN, VK_R)
wID = GetID("ファイル名を指定して実行", "#32770", 0.2)
LOCKHARDEX(wID, LOCK_MOUSE) // この行をコメントするとクリック出来る
  MOUSEORG(wID, 1)
    MMV(170,170); BTN(LEFT,CLICK,170,170) // OKボタンのクリック(MMVは目視の為)
  MOUSEORG(0)
LOCKHARDEX()

No.1447 2015/07/10(Fri) 11:40:18

Re: LOCKHARDEX()の挙動 / routa
私の環境では問題なくクリックできます。Win8.1
LOCKHARDEXの後に少しSLEEPを入れて見たらどうでしょう。

No.1451 2015/07/10(Fri) 18:21:30

Re: LOCKHARDEX()の挙動 / しろまさ
ありがとうございます、
出来ますか。また設定ファイルの問題でしょうか・・
Sleepは試しましたがだめでした。
週明けに設定ファイルをいじりながら追加検証してみます、

No.1453 2015/07/11(Sat) 01:32:48
PUBLICの 2次元配列が うまく動きません / koujichiu
UWSC Pro Ver 5.0.3.0 で作っています

2次元配列をFUNCTIONの中でも共有したいため、
グローバルスコープな配列を作っているのですが、
思うように動きません。

どのようにすれば良いのか 教えて下さい

// ローカルの場合
DIM key1, key2
key1 = 10
key2 = 20
PRINT "key1, key2 = " + key1 + ", " + key2

DIM array[key1][key2]
PRINT "LENGTH(array) = " + LENGTH(array) // ●11
PRINT "LENGTH(array[key1]) = " + LENGTH(array[key1]) // ●21

// グローバルの場合
PUBLIC keyPub1, keyPub2
keyPub1 = 10
keyPub2 = 20
PRINT "keyPub1, keyPub2 = " + keyPub1 + ", " + keyPub2

PUBLIC arrayPub[keyPub1][keyPub2]
//PUBLIC DIM arrayPub[keyPub1][keyPub2] // DIMを付けてもエラーはしない
PRINT "LENGTH(arrayPub) = " + LENGTH(arrayPub) // ●1
PRINT "LENGTH(arrayPub[keyPub1]) = " + LENGTH(arrayPub[keyPub1]) // ●1

No.1445 2015/07/10(Fri) 02:50:05

Re: PUBLICの 2次元配列が うまく動きません / しろまさ
Call Const Public はスクリプト実行時に評価されるので
その時点で keyPub1 keyPub2 は定義されていません。

Public arrayPubの要素数をどうしても変数で定義したいなら次のいづれか。
?@ arrayPub より先に keyPub1 keyPub2 を Publicで定義する
?A 後から arrayPub を ReSize する。
※ ReSize は多次元配列の場合は一番上の次元に対してのみ

Functionで配列を共有したいなら、Moduleを使用してModule変数で定義したほうが楽なのでは?

No.1446 2015/07/10(Fri) 09:41:27

Re: PUBLICの 2次元配列が うまく動きません / koujichiu
ご回答ありがとうございました。

さっそくMODULEを実験してみましたが、操作に慣れるまでかなり大変そうでしたので、
FUNCTIONに引数として配列を渡すことにしました

///////////////////////////////////////////////////////////////////////////

DIM keyNum1 = 10, KeyNum2 = 20 // キーの番号(0, 1, 2, ..., 10)

PRINT "// ここから"
PRINT "keyNum1, keyNum2 = " + keyNum1 + ", " + keyNum2 // ● 10, 20

DIM array[keyNum1][keyNum2] // 宣言時は[]内に要素の数を入れるはず?

PRINT ""
PRINT "LENGTH(array) = " + LENGTH(array) // ● 11
PRINT "LENGTH(array[keyNum1]) = " + LENGTH(array[keyNum1]) // ● 21

PRINT Func(keyNum1, keyNum2, array)

FUNCTION Func(fKeyNum1, fKeyNum2, fArray[][])
PRINT "<#CR>//以下FUNCTION内"
PRINT "fKeyNum1, fKeyNum2 = " + fKeyNum1 + ", " + fKeyNum2 // ● 10, 20
PRINT ""
PRINT "LENGTH(fArray) = " + LENGTH(fArray) // ● 11
PRINT "LENGTH(fArray[fKeyNum1]) = " + LENGTH(fArray[fKeyNum1]) // ● 21
RESULT = "// ここまで"
FEND

///////////////////////////////////////////////////////////////////////////

追記: モジュールの実験の感じです

・モジュール内では変数の値を変えたりの操作ができない

・外部から、モジュール内の変数やプロシージャにアクセスして値を変更できるが
その変更が内部には反映されない?(内部ではconst的?)

・RESIZE()は、値の代入ではない処理により、内部の配列の要素数に反映されているようだ
(要素数の変数からでは無い処理)

No.1449 2015/07/10(Fri) 12:46:25

Re: PUBLICの 2次元配列が うまく動きません / routa
PUBLIC keyPub1 = 10
PUBLIC keyPub2 = 20
固定値ならCONSTを使用した方が良いでしょう。
CONST keyPub1 = 10
CONST keyPub2 = 20

No.1450 2015/07/10(Fri) 18:14:57

Re: PUBLICの 2次元配列が うまく動きません / koujichiu
routaさん、 ご指導ありがとうございました。

今後、新しいスクリプトを作る際に CONST を意識しながら作ってみたいと思います。

No.1452 2015/07/11(Sat) 00:03:14
Can't be written in / アソビン
お世話になります。
現在、230カラムあるCSVデータを50,000件(行)作ろうとしています。
FOPENでファイルを開き、230個のFPUTを並べてそれをFor〜Nextで回してFCLOSEしようとしています。
最初何も考えずにいきなり50,000回ループさせようとしたらOut of memoryになりまして(当然です)とりあえず5%(2500行)毎にFCLOSEして再度FOPENしようと思いました。
そうしたら10%までは普通に動くのですが、15%時点でFCLOSEしようとした時にエラーになり、Can't be written inが出てエラーになってしまいます。
FOPENで-1を返してFCLOSEの時にエラーを吐いているのかと思いましたが、ログに出力してみた所、FOPENの時点では1を返していました。

以下にスクリプトを載せます。
その前にExcel開いて別のcsvファイルからヘッダ行を取得したりしてるのでわからない所があるかもしれませんが…

*************************************************************************************

〜(前略)〜

Public total = 50000

//新規ファイル作成
FNAME = "C:\uwsc511\" + sheet_name + ".csv"
DOSCMD("type null > " + FNAME)

//CSVファイルオープン
ID = FOPEN(FNAME,F_READ or F_WRITE or F_EXCLUSIVE)
GETTIME()

PRINT "処理開始"
PRINT G_TIME_HH2 + "時" + G_TIME_NN2 + "分" + G_TIME_SS2 + "秒:ファイルオープン"
PRINT "ファイルオープン結果:" + ID


//ヘッダー行記入
x = 1
For i = 0 to endcell-2
FPUT(ID,"<#DBL>" + box_num[i] + "<#DBL>",1,x)
x = x + 1
Next

//データ行記入
x = 1
y = 1

For i = 1 to total
fukidasi(KEISAN(x) + "%完了…")

FPUT(ID,mIDgen(x-1),y+1,1) //1 申込ID
FPUT(ID,mMBANGOUgen(x-1,13),y+1,2)     //2 申込番号
FPUT(ID,mNUMgen(20),y+1,3) //3 申込番号
FPUT(ID,mDAYgen(),y+1,4) //4 申込日
FPUT(ID,mDAYgen(),y+1,5) //5 申込実施日
FPUT(ID,mDAYgen(),y+1,6) //6 異動年月日
FPUT(ID,mDAYgen(),y+1,7) //7 開始予定日
FPUT(ID,mDAYgen(),y+1,8) //8 終了予定日
FPUT(ID,P00029(17),y+1,9) //9 申込種別

      (これが230個続く)

Ifb (i MOD 2500) = 0 then
Dim FC = FCLOSE(ID,TRUE)
PRINT "書き込み結果:" + FC + "<#CR>"
PRINT "<#CR>処理状況" + KEISAN(x) + "%"
Repeat
GETTIME()
Sleep(0.5)
PRINT G_TIME_HH2 + "時" + G_TIME_NN2 + "分" + G_TIME_SS2 + "秒:ファイル書き込み中..."
Until FC = 1
GETTIME()
PRINT G_TIME_HH2 + "時" + G_TIME_NN2 + "分" + G_TIME_SS2 + "秒:書き込み完了"

ID = FOPEN(FNAME, F_READ or F_WRITE or F_EXCLUSIVE)

GETTIME()
    Sleep(0.5)
    PRINT G_TIME_HH2 + "時" + G_TIME_NN2 + "分" + G_TIME_SS2 + "秒:ファイルオープン"

GETTIME()
PRINT "ファイルオープン結果:" + ID
PRINT G_TIME_HH2 + "時" + G_TIME_NN2 + "分" + G_TIME_SS2 + "秒:処理再開"
Endif

x = x + 1
y = y + 1
Next

FCLOSE(ID,FALSE)
*************************************************************************************

省いてる所もありますがこんな感じです。
一つ気になっているのが、FCLOSEすればFPUTの間に使用していたメモリは解放されるのかと思っていたのですが、タスクマネージャーを見ていた所、どんどんメモリの使用量が増え続けています。これはこういうものなんでしょうか…また、これが原因ということはありますか?

色々書きましたがご教示下さい。よろしくお願い致します。

No.1438 2015/07/09(Thu) 17:22:25

Re: Can't be written in / stuncloud
> F_READ or F_WRITE
だと一旦ファイルの中身を全部読み取ってるようなのでファイルサイズが肥大化していくと困ったことになっちゃうんですよね
以前ログの書き出しに一行毎にfopen-fput-fcloseとやってたことがあったんですが、ファイルサイズが大きくなるほど書き込みに時間がかかるようになって困った覚えがあります
Excelをご利用のようですし、csvへの書き出しもExcelにしてみてはどうでしょうか?
(Excelは5万行…扱えましたよね?)

No.1439 2015/07/09(Thu) 18:24:31

Re: Can't be written in / アソビン
追記ですが、今、他のデータ(カラム数がそこまで多くなく40カラム程度)を実行させてみたら何事もなく完了しました。
やはりメモリとかでしょうか…?

No.1440 2015/07/09(Thu) 18:25:07

Re: Can't be written in / アソビン
☆stuncloudさん
オラクル用のデータで、ダブルクォーテーション括りのカンマ区切りなのでExcelだとうまくいかないんですよね。。。
やり方があるのかもしれませんが。

No.1441 2015/07/09(Thu) 18:29:59

Re: Can't be written in / しき
UWSCの fopen-fput-fclose は、
fputした文字をすべて保持(変数に入れるようなもの)して、
fcloseした時に実際のファイルに反映します。
書き出すファイル内容分だけのメモリを消費します。

また、fopen(file, f_read) した時に、fileの内容をすべて読み込むので、
途中で fclose-fopen してもメモリの節約にはなりません


Scripting.FileSystemObject の TextStreamを使った方法を紹介します
TextStreamは上から下への一方向しか制御できませんが、
WriteLine()ごとファイルに反映するので、巨大なテキストファイルを扱うのに有効です

//参考URL
//WriteLine メソッド (FileSystemObject)
//https://msdn.microsoft.com/ja-jp/library/cc428063.aspx

//OpenTextFile メソッド
//https://msdn.microsoft.com/ja-jp/library/cc428044.aspx


Public total = 50000
//新規ファイル作成
FNAME = get_cur_dir+"\abc.csv"

o_Fs = CreateOleObj("Scripting.FileSystemObject")
ForWriting = 2 //ファイルを書き込み専用として開きます
ofw = o_Fs.OpenTextFile(FNAME, ForWriting, true)

//ヘッダー行記入
ofw.WriteLine("申込ID,申込番号,申込日")

fid = fopen("", f_read or f_write) //一行データ作成用

//データ行記入
for i=1 to total
  ifb (0 = (i mod 100)) then
    fukidasi(int((i/total)*100)+"% "+ i +"/"+ total)
  endif
  
  fput(fid, i +"行1列", 1, 1)
  fput(fid, i +"行2列", 1, 2)
  fput(fid, i +"行3列", 1, 3)
  
  dim s_line = fget(fid, 1)
  ofw.WriteLine(s_line) //一行データ書き出し
  
  fput(fid, "", 1) //一行目消す
next

fclose(fid)
ofw.Close()

No.1442 2015/07/09(Thu) 18:39:27

Re: Can't be written in / アソビン
☆しきさん
おおおおおおおおおおおおおお!ありがとうございます!
これは……凄い!完璧ですね!!
サンプルで書いて頂いたコードを実情に合わせて自分なりに手を加えてみましたが、完全に動作しています。
FOPENでNULLを指定して仮想ファイルを開いているようなイメージですか?こんな使い方があったとは。
処理速度も思った程遅くなく、むしろこれまで書き込み確認とかで余計な処理を入れてたことを思えばよりシンプルになって少し速くなってるくらいかもしれません。
(実際は50,000行も書き出してればその差もほとんどわかりませんがw)

今後、もっとカラム数が少ない場合のスクリプトもこの方式に置き換えて時間などの検証を重ねたいと思います。
大変参考になりました。どうもありがとうございました!!

No.1448 2015/07/10(Fri) 11:44:26
(No Subject) / Nagatani
いつもお世話になります。Excelファイルの中にAuto_Opne()のマクロがありファイルを開くと
自動でマクロを実行・保存してExcelを終了するように組んでいます。この様なExcel
ファイルを繰り返し16個開くスクリプトで悩んでいます。でるかでないかわからない「リンク」
「ファイルの有効?」「マクロ」3種類に対応したく、下記の様にCLKITEMで対応させまし
たが何故か3つのCLKITEMを実行するのに20秒以上かかり、ファイルによっては(4)にたどり
着く前に終わってしまいます。Excelセキュリティーレベルの変更はできません。


For LonI = 1 TO 16
 // EXCELの起動
 EXEC("C:\Program Files\Microsoft Office\Office14\excel.exe <#DBL>" + "C:\データ\" + StrFileName[LonI])
 SLEEP(2)

 REPEAT
  //(1)
  CLKITEM(GetID("使用中のファイル","bosa_sdm_XL9"),"読み取り専用",CLK_ACC)
  //(2)
  Clkitem(GetID("Microsoft Excel"),"編集を有効にする",clk_ACC)
  //(3)
  Clkitem(GetID("Microsoft Excel"),"コンテンツの有効化",clk_ACC)
  //(4)
 UNTIL GetID("Microsoft Excel") > 0

 REPEAT
  SLEEP(0.2)
 UNTIL (GetID("Microsoft Excel") < 1)
 SLEEP(2)

NEXT

何か良い方法はないでしょうか?アドバイスよろしくお願いいたします。

No.1430 2015/07/08(Wed) 22:10:31

Re: / Nagatani
Clkitem(GetID("Microsoft Excel"),"コンテンツの有効化",clk_ACC)を実行するとEXCELが終了するまで止まっているようです!
使い方間違っているのでしょうか?

No.1431 2015/07/09(Thu) 08:56:43

Re: / Nagatani
上記環境は、Windows7 Sp1 .Office2010
です。

No.1432 2015/07/09(Thu) 09:01:46

Re: / Nagatani
上記、CLKITEMはUWSC 5.1.1.0にバージョンアップしたらなおりました!お騒がせ致しました!
No.1433 2015/07/09(Thu) 09:07:28

Re: / Nagatani
やはり、CLKITMを使うとエクセルが終了するまで止まっているようです!
No.1434 2015/07/09(Thu) 09:13:06

Re: / えあり
残念2010は持ってないので試せませんが、ひとつ気になった点が

Office系アプリはウインドウをActivXで線画しているので
ウインドウやメッセージボックスは内部で表示と違っていたり
同じIDを別のウインドウ(らしきもの)と共有したりしていて簡単にはコントロールできません

>GetID("Microsoft Excel")
これがそもそも目的のウインドウを取得できていないのではないでしょうか

当然目的外のウインドウをアタッチすることになるので
見えていないボタン(意外ですが見えないボタンは実はかなり設置されています)
を押してそのまま処理を進めてしまったり
ウインドウを見失って待機状態に陥ってしまったりします

GetIDして、本当に目的のウインドウに触れているかどうか
ACW等でウインドウの位置をずらしてみれば確認できますのでお確かめください

No.1437 2015/07/09(Thu) 13:46:09

Re: / Nagatani
ありがとうございます。「CLKITEM」の戻り値は「True」ですので、今のところ正常に動作していると思います。Excelの中身が空っぽでAUTO_OPEN()を作ったところ、1秒でTrueが返ってくるので、この症状の原因はマクロでAccessからデータを要求するデータ量が多くパソコンがいっぱいいっぱいになっているため、UWSCが次の動作に入れないと予想して前のrepeatを外しExcelが終わるのを検知することにします。確かにヘビー級のAccessが処理中に、別のUWSC起動時間になってもUWSCが空振りするのと同じでしょうね!

えありさん、ありがとうございました。何か気が付いた点があればアドバイスよろしくお願いいたします。

No.1444 2015/07/09(Thu) 22:38:33
Googleスプレッドシートの操作 / かとう
UWSCにてエクセルやOpenofficeのシートを操作可能
であることは分かりましたが、Googleスプレッドシートにつきましても、操作することは可能でしょうか?

Googleスプレッドシート内のセルを指定して、UWSCプログラム内の変数に格納しているデータを書き込みたいです。よろしくお願い致します。

No.1429 2015/07/08(Wed) 07:43:19

Re: Googleスプレッドシートの操作 / stuncloud
> Googleスプレッドシートにつきましても、操作することは可能でしょうか?
APIが提供されているようなので、それを使えば可能だとは思います
参考: http://tech.raksul.com/2014/10/27/google-spreadsheet-api/

※Webブラウザ上で操作するわけではなく、Msxml2.XMLHTTP等を用いてgoogleのサーバーと直接やりとりする方法です

No.1435 2015/07/09(Thu) 10:43:27

Re: Googleスプレッドシートの操作 / かとう
stuncloud様

ありがとうございます。確認致します。

No.1436 2015/07/09(Thu) 12:23:33
「jquery」の「mouseover」について教えてください / 4405
お世話になります。


IEを自動で選択したいのですが、「jquery」の「mouseover」 というのが使われているようで、
マウスが離れたときのみ「option」が表示されるようになっているため、うまく制御できません。
どなたかご教授いただければ、助かります。



*初期状態
<div class="selectWrap">
 <select name="time" id="form_time"></select>
 <input value="----" type="text" id="○○○○" name="△△△△">
</div>


*mouseover後
<div class="selectWrap">
 <select name="time" id="form_time">
  <option value="----">----</option>
  <option value="06:00">06:00</option>
  <option value="07:00">07:00</option>
  <option value="08:00">08:00</option>
  <option value="09:00">09:00</option>
  <option value="10:00">10:00</option>
  <option value="11:00">11:00</option>
  <option value="12:00">12:00</option>
  <option value="13:00">13:00</option>
  <option value="14:00">14:00</option>
  <option value="15:00">15:00</option>
  <option value="16:00">16:00</option>
  <option value="17:00">17:00</option>
  <option value="18:00">18:00</option>
  <option value="19:00">19:00</option>
  <option value="20:00">20:00</option>
  <option value="21:00">21:00</option>
  <option value="22:00">22:00</option>
  <option value="23:00">23:00</option>
  <option value="00:00">00:00</option>
  <option value="01:00">01:00</option>
  <option value="02:00">02:00</option>
  <option value="03:00">03:00</option>
  <option value="04:00">04:00</option>
  <option value="05:00">05:00</option>
 </select>
 <input value="----" type="text" id="○○○○" name="△△△△">
</div>

No.1421 2015/07/03(Fri) 00:45:01

Re: 「jquery」の「mouseover」について教えてください / 4405
$("select[name=time]").mouseenter(function() {
option_num = $(this).kazu().length;
if(option_num <= 1){
clone_select = $('#form_time_base').kazu().clone();
$(this).append(clone_select);
}
});

で生成しているようですが、手図まり状態です。

お助け願います。

No.1422 2015/07/03(Fri) 02:06:16

Re: 「jquery」の「mouseover」について教えてください / しろまさ
// マウスを乗せて生成させてから操作すればいいんじゃない?

ie = GetActiveOleObj("InternetExplorer.Application")
elm = ie.document.getElementById("form_time")
rect = elm.getBoundingClientRect()
MouseOrg(GetCtlHND(ie.hwnd, "Internet Explorer_Server"), 1)
  MMV(rect.Left + 1, rect.top + 1)
MouseOrg(0)

No.1423 2015/07/03(Fri) 10:24:38

Re: 「jquery」の「mouseover」について教えてください / 4405
しろまさ様お返事ありがとうございます。

その方法もありましたね。

ただ、最初に書けばよかったのですが、<select name="time" id="form_time">の項目が100以上あり、マウス操作以外の方法でできたら実行したいと考えております。

No.1424 2015/07/03(Fri) 12:22:40

Re: 「jquery」の「mouseover」について教えてください / 4405
さらにごめんなさい。

selectを選択したら、「jquery」の「change」 でデータを送っているようなのですが、こちらも合わせてご教授いただけたら幸いです。


$("select[name=time]").change(function () {
var input = $(this).next('input');
var value = $(this).find('option:selected').val();
input.val(value);
var data_id = input.attr('name').replace(/starttime_|endtime_/g, '');
save_data(data_id);

No.1425 2015/07/03(Fri) 12:38:31

Re: 「jquery」の「mouseover」について教えてください / stuncloud
jQuery詳しくないので軽く調べた結果を書いておきます
とりあえずはUWSCからjQueryオブジェクトにアクセスできれば良さそうだったのでどうにかならないか方法を探してみました
残念ながらjQueryオブジェクトを直接取得する方法は見つかりませんでしたが、任意のスクリプトを文字列で与えて実行する方法が見つかったのでそれを使います

ie.document.parentWindow.execScript("任意のスクリプト")

jQueryでイベント発火はtrigger()で出来るようです
なので

# idがform_timeのエレメントのmouseenterイベントを発生させる
ie.document.parentWindow.execScript("$('#form_time').trigger('mouseenter')")

とすれば良いはずです
(jQueryを使ってるサイトで別のイベントではありますが、ちゃんと動作することは確認しました)
この要領で必要に応じてイベントを発生させてやれば良いと思います

execScript()に渡す値に関してはjsやjQueryの話でありUWSCとは関係ないので、質問はご遠慮ください


あとちょっと気になった点を

> <select name="time" id="form_time">の項目が100以上あり

idは一意でないといけないのでそれはサイトの作りがおかしいですね
とは言え複数あったとしてもセレクタを工夫すれば(例えばn番目の指定をするとか)ピンポイントで操作出来るので、必要であればそういったことも調べてみてください

No.1426 2015/07/04(Sat) 02:14:15

Re: 「jquery」の「mouseover」について教えてください / 4405
stuncloud様お返事ありがとうございます。

ie.document.parentWindow.execScript("$('#form_time').trigger('mouseenter')")
でイベントを発生させることができました。
ありがとうございます。

>セレクタを工夫すれば(例えばn番目の指定をするとか)
ここがいまいち理解できないのですが、

obj=IE.document.getElementsByTagName("table").item(0).rows(0).cells

for n=0 to obj.length-1
obj.item(n).getElementsByTagName("div").item(0).getElementsByTagName("SELECT").item(0).document.parentWindow.execScript("$('#form_time').trigger('mouseenter')")
op = obj.item(n).getElementsByTagName("div").item(0).getElementsByTagName("SELECT").item(0).options
for m=0 to op.length() -1
ifb op.item(m).value = "1000" then
op.item(m).selected = true
obj.item(n).getElementsByTagName("div").item(0).getElementsByTagName("SELECT").item(0).FireEvent("onChange")
break
endif
next
next

のようにしてみたのですが毎回一番上の「form_time」のイベントが実行されるのみで、「n」番目の処理ができないです。

ご指摘いただければ幸いです。

「jquery」の「change」の件も質問させていただいておりますが、こちらは FireEvent("onChange")でうまく処理を行えている模様です。

No.1427 2015/07/04(Sat) 11:59:35
CHKIMG / Nagatani
いつもお世話になります。
座標で文字を取得する場合は、PosAccですが
CHKIMG以外で指定する文字で座標をとる方法は無いでしょうか?

よろしくお願いいたします、

No.1414 2015/06/30(Tue) 11:33:01

Re: CHKIMG / stuncloud
文字が表示されている箇所がクリッカブルなのであれば

-----------------------------
clkitem(id, "探す文字", CLK_ACC or CLK_SHORT or CLK_MUSMOVE, FALSE)
-----------------------------

で実際にクリックはせずマウスカーソルだけ移動させられるので、その後マウス座標を取得
getstrでもマウス移動が出来るので

-----------------------------
// ACCでStatic文字列を総なめ
for i = 1 to getitem(id, ITM_ACCTXT)
 str = getstr(id, i, STR_ACC_STATIC, TRUE)
 if pos("探す文字", str) > 0 then
  print G_MOUSE_X + ";" + G_MOUSE_Y
  break
 endif
next
-----------------------------

こんな感じですかね?

No.1418 2015/07/01(Wed) 18:32:49

Re: CHKIMG / Nagatani
ありがとうございます。
早速勉強させていただきます。

No.1419 2015/07/01(Wed) 19:17:50
エクセルのコンボボックスにフォーカスを当てる方法 / zgock
現在会社のEXCELフォームに自動入力ができないか検討をしております。
データの入力は、下記の形でできるのですが、コンボボックスの変更を元に次のイベントが起きるように作られているため、うまく行きません。

//
EXCEL = GETACTIVEOLEOBJ("Excel.Application")
ws = EXCEL.activesheet
dd = ws.Shapes("DROPDOWN_1").OLEFormat.Object
dd.text = "xxxx"
//この後 Dropdown_1が変更されたことによるイベントで次のドロップダウンの中身が変わる
//のですが、何か良い方法はないでしょうか?
//

No.1406 2015/06/27(Sat) 00:53:09

Re: エクセルのコンボボックスにフォーカスを当てる方法 / stuncloud
Excel上でその操作をマクロとして記録してみて、VBEのコードを確認してみては?
>イベントで次のドロップダウンの中身が変わる
なので単純にイベントハンドラを叩けば良さそうな気もしますが

No.1417 2015/07/01(Wed) 18:05:16
全1170件 [ ページ : << 1 ... 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 ... 117 >> ]