UWSC 掲 示 板
投稿時に「証明書が不正です」と出る場合には、JavaScriptをオンにしてください
動作不具合での質問の場合には環境(OS,IEのバージョン等)の表記もしてください
タイトルは質問内容を表したものにしてください
ネットゲーム関係の質問はご遠慮ください

配列をセルに一括で代入する方法 / 藍
いつもお世話になります。
配列をセルに代入したいと思っていますがうまくいきません。
A1 ← Excel B1 ← word C1 ← access

EXCEL = CREATEOLEOBJ("Excel.Application")
EXCEL.visible = True
EXCEL.workbooks.add()
//
Dim tmp[2]
//
tmp[0] = "Excel"
tmp[1] = "Word"
tmp[2] = "Access"
EXCEL.Range("A1:C1") = tmp

よろしくお願いします。

No.3206 2016/11/26(Sat) 15:01:01

Re: 配列をセルに一括で代入する方法 / Nagatani
XLSetData(EXCEL,tmp,"A1")になります。
No.3210 2016/11/26(Sat) 17:24:21

Re: 配列をセルに一括で代入する方法 / 藍
ありがとうございました。
No.3215 2016/11/26(Sat) 21:43:41
キーワード組み合わせ作成をエクセルに入力する方法 / タカハシ
配列からエクセルファイルにXLSETDATAを使用して入力をしたいのですが、XLSETDATA( Excel, STR,"a"+num)の行がエラーと出ます。どこが間違っているのでしょうか?

DIM str1[] = "大阪","名古屋"
DIM str2[] = "観光","場所"

EXCEL = CREATEOLEOBJ("Excel.Application")
EXCEL.visible = True
Excel.WorkBooks.Open(FileName :="C:\Users\aruke\Dropbox\2-キーワードエクセル\キーワード.xlsx")
XLACTIVATE( Excel, "Sheet1")

FOR num = 0 TO length(str1)-1

FOR cnt = 0 TO length(str2)-1
STR = str1[num] + " " + str2[cnt]
XLSETDATA( Excel, STR,"a"+num)
NEXT

NEXT

No.3200 2016/11/25(Fri) 20:39:35

Re: キーワード組み合わせ作成をエクセルに入力する方法 / Nagatani
XLSETDATA( Excel, STR,"a"+num)
書き込むセル番地がA列の0行目だから、Excelには0行目はないから
XLSETDATA( Excel, STR,"a"+num+1)

No.3202 2016/11/25(Fri) 21:44:11

Re: キーワード組み合わせ作成をエクセルに入力する方法 / タカハシ
Nagatani様、返信ありがとうございます。XLSETDATA( Excel, STR,"a"+num+1)で試した所、A1とA11に出力されるだけになってしまいます。何か良い方法ないでしょうか?
私の方で試した事は下記ですが、A1だけに出力されるだけです。

DIM str1[] = "大阪","名古屋"
DIM str2[] = "観光","場所"
EXCEL = CREATEOLEOBJ("Excel.Application")
EXCEL.visible = True
Excel.WorkBooks.Open(FileName :="C:\Users\aruke\Dropbox\2-キーワードエクセル\記事タイトル_画像_キーワード.xlsx")
XLACTIVATE( Excel, "Sheet1")

for i = 1 to length(str1)-1

FOR num = 0 TO length(str1)-1

FOR cnt = 0 TO length(str2)-1
STR = str1[num] + " " + str2[cnt]
XLSETDATA( Excel, STR,"a" + i)
NEXT

NEXT

next

No.3203 2016/11/26(Sat) 10:45:01

Re: キーワード組み合わせ作成をエクセルに入力する方法 / タカハシ
一応下記のコードでできました。かなり回りくどいやり方ですが...

DIM str1[] = "大阪","名古屋"
DIM str2[] = "観光","場所"
EXCEL = CREATEOLEOBJ("Excel.Application")
EXCEL.visible = True
Excel.WorkBooks.Open(FileName :="C:\Users\aruke\Dropbox\2-キーワードエクセル\記事タイトル_画像_キーワード.xlsx")
XLACTIVATE( Excel, "Sheet1")

FOR num = 0 TO length(str1)-1

FOR cnt = 0 TO length(str2)-1
STR = str1[num] + " " + str2[cnt]
print STR
NEXT

NEXT

pid = getid(GET_LOGPRINT_WIN)
text = getstr(pid, 1, STR_ACC_EDIT)
SENDSTR(0,text)
Excel.Range("A1").PasteSpecial()  // 貼り付け

No.3204 2016/11/26(Sat) 10:52:26

Re: キーワード組み合わせ作成をエクセルに入力する方法 / 俄プログラマー
文字と数字の計算結果を組み合わせるには
"a"+num+1
ではダメです。正しくは
"a"+(num+1)

補足
配列分のループなら
For In Next 文を使うとスマートです。

No.3205 2016/11/26(Sat) 11:23:12

Re: キーワード組み合わせ作成をエクセルに入力する方法 / タカハシ
俄プログラマー様、"a"+(num+1)は知らなかったです、ありがとうございます。
下記のコードで試しましたが、うまくいきません。

DIM str1[] = "大阪","名古屋"
DIM str2[] = "観光","場所"
EXCEL = CREATEOLEOBJ("Excel.Application")
EXCEL.visible = True
Excel.WorkBooks.Open(FileName :="C:\Users\aruke\Dropbox\2-キーワードエクセル\記事タイトル_画像_広告キーワード.xlsx")
XLACTIVATE( Excel, "Sheet2")
kazu=1
kazu1=length(str1)+(str2)

for z = kazu to kazu1

for i in str1

for y in str2

STR = i + " " + y
xlsetdata(excel, str, "a"+z)

next

next

next

No.3207 2016/11/26(Sat) 16:09:44

Re: キーワード組み合わせ作成をエクセルに入力する方法 / タカハシ
下記のコードでもやってみました。
//A11A12A21A22に、大阪 名古屋×観光 場所の組み合わせが出力される
//したい処理、A1からA4に出力

DIM str1[] = "大阪","名古屋"
DIM str2[] = "観光","場所"

EXCEL = CREATEOLEOBJ("Excel.Application")
EXCEL.visible = True
Excel.WorkBooks.Open(FileName :="C:\Users\aruke\Dropbox\2-キーワードエクセル\記事タイトル_画像_広告管理\経理転職キーワード.xlsx")
XLACTIVATE( Excel, "Sheet2")

FOR num = 0 TO length(str1)-1

FOR cnt = 0 TO length(str2)-1
STR = str1[num] + " " + str2[cnt]
XLSETDATA( Excel, STR,"a"+(num+1)+(cnt+1))
NEXT

NEXT

No.3208 2016/11/26(Sat) 16:11:19

Re: キーワード組み合わせ作成をエクセルに入力する方法 / Nagatani
私だったらカウンターを付けます。
Counter=1
FOR num = 0 TO length(str1)-1
FOR cnt = 0 TO length(str2)-1
STR = str1[num] + " " + str2[cnt]
XLSETDATA( Excel, STR,"A"+(Counter))
Counter=Counter+1
NEXT
NEXT

右記の式では("a" + (num + 1)) = "a1"となりますが
先に数値を足しこまないと("a" + num + 1) = "a01"となります

No.3209 2016/11/26(Sat) 17:10:12

Re: キーワード組み合わせ作成をエクセルに入力する方法 / 俄プログラマー
>A11A12A21A22に、大阪 名古屋×観光 場所の組み合わせが出力される

A1〜A4に出力させる前に理解して欲しい事
なぜ失敗したのか?これを解決すると今後役に立つでしょう。
まずは二重for文を使った場合のfor文の動きを理解してほしいです。

"a"+(num+1)+(cnt+1)
num=0 cnt=0の時
"a" + (0+1) + (0+1)
先に()内が計算されて
"a" + (1) + (1)
となり
"a" + 1 + 1

"a11"
になります。

つまり二重にfor文を使った場合は順番に
num = 0 , cnt = 0 結果 a11
num = 0 , cnt = 1 結果 a12
num = 1 , cnt = 0 結果 a21
num = 1 , cnt = 1 結果 a22

と言う動きになります。
どんな動きをするかはnumの値、cntの値、計算結果をprint文を使って表示してみると分かり易いですよ。

No.3211 2016/11/26(Sat) 18:58:21

Re: キーワード組み合わせ作成をエクセルに入力する方法 / タカハシ
Nagatani様、ありがとうございます。無事希望通りの出力できました。
Counter=1という発想がまったく自分では思いつかなかったです。
下記のコードでできました、ありがとうございます。

Counter=1
FOR num = 0 TO length(str1)-1

FOR cnt = 0 TO length(str2)-1
STR = str1[num] + " " + str2[cnt]
XLSETDATA( Excel, STR,"A"+(Counter))
Counter=Counter+1
NEXT

NEXT

No.3212 2016/11/26(Sat) 19:39:47

Re: キーワード組み合わせ作成をエクセルに入力する方法 / タカハシ
俄プログラマー様、分かりやすい説明ありがとうございます。
下記の説明でイメージがつかめました。
もっと、UWSC使いこなせるように精進していきます。
num = 0 , cnt = 0 結果 a11
num = 0 , cnt = 1 結果 a12
num = 1 , cnt = 0 結果 a21
num = 1 , cnt = 1 結果 a22

No.3213 2016/11/26(Sat) 19:45:07

Re: キーワード組み合わせ作成をエクセルに入力する方法 / タカハシ
Nagatani様、俄プログラマー様のおかげでfor inでやる方法も無事できました。
ありがとうございます。

DIM str1[] = "大阪","名古屋"
DIM str2[] = "観光","場所"
EXCEL = CREATEOLEOBJ("Excel.Application")
EXCEL.visible = True
Excel.WorkBooks.Open(FileName :="C:\Users\aruke\Dropbox\2-キーワードエクセル\記事タイトル_画像.xlsx")
XLACTIVATE( Excel, "Sheet2")
Counter=1
for i in str1

for y in str2

STR = i + " " + y
xlsetdata(excel, str, "A"+(Counter))
Counter=Counter+1
next

next

No.3214 2016/11/26(Sat) 19:51:00
配列に入れて文字列加工について / タカハシ
textblockのnamをsplitで配列に入れて、配列の各URLをタグの中に入れたいのですが、できません。
どこが間違っているのでしょうか?エラーは、getvalue:variant or safe array index out of bounds9行目 エラーと出ます。

したい処理が下記です。
<div align="center">https://aaa</div>;
<div align="center">https://bbb</div>;
<div align="center">http://ccc</div>;

[コード]
textblock nam
https://aaa
https://bbb
http://ccc
endtextblock

tes=split(nam)
for i = 0 to length(tes)
print "<div align=<#DBL>center<#DBL>>"+tes[i]+"</div>"
next

No.3187 2016/11/24(Thu) 23:08:43

Re: 配列に入れて文字列加工について / stuncloud
> variant or safe array index out of bounds
iが配列範囲を越えたからです
> for i = 0 to length(tes)
これを
for i = 0 to length(tes) - 1
にします
配列の要素が3つだった場合添字は0〜2になるからです
(length()は配列の要素の数を返します)

あと、textblockの複数行をsplitする場合は区切り文字を<#CR>にします
tes=split(nam, "<#CR>")

こういう場合は配列の添字の心配をする必要のないfor-inがおすすめ

for url in split(nam, "<#CR>")
 print "<div align=<#DBL>center<#DBL>>" + url + "</div>"
next

No.3190 2016/11/25(Fri) 09:42:01

Re: 配列に入れて文字列加工について / タカハシ
stuncloud様、いつもありがとうございます。for i = 0 to length(tes) - 1の-1にずっと気づかなかったです。for-in、こんな便利な関数あったのですね。知らなかったです。
No.3201 2016/11/25(Fri) 20:42:34
アプリが実行中かどうかの判断方法について / にゃんこ
アプリが実行中かどうかの判断をしたいです。

戻値 = CPUUSERATE( ) ではcpu全体の負荷が計測できるようですが
アプリ単体でのcpuの負荷を取ることはできるのでしょうか?

No.3189 2016/11/25(Fri) 09:33:48

Re: アプリが実行中かどうかの判断方法について / stuncloud
> アプリが実行中かどうかの判断をしたいです。
単純に実行されてるかどうかであれば以下のようにします

----------------------------------------------------
// 探したいプロセスの名前
name = "notepad.exe" // メモ帳の場合

// UWSCの機能だけで探す、ただし遅い
counter = 0
for id in getallwin()
 if pos(name, status(id, ST_PATH)) > 0 then
  counter = counter + 1
 endif
next
msgbox(name + " は " + counter + " 個動いてます")

// WMIを使う、早い
locator = createoleobj("WbemScripting.SWbemLocator")
server = locator.ConnectServer()
queryResult = server.ExecQuery("SELECT * FROM Win32_Process WHERE name = '" + name + "'")
msgbox(name + " は " + getoleitem(queryResult) + " 個動いてます")
----------------------------------------------------

> アプリ単体でのcpuの負荷を取ることはできるのでしょうか?
CPU使用率を取得したいということであれば以下の記事を参考にしてください
https://stuncloud.wordpress.com/2013/08/19/uwsc_perfmon/
IEの1秒間のCPU使用率とメモリ使用量を取得するサンプルです

> PdhVbAddCounter(hQuery, "\Process(iexplore)\% Processor Time", counter_iexplore_cpuuserate)
「iexplore」の部分を任意のプロセス名に変更する感じですね
(notepad.exeならnotepadを入れる)

No.3191 2016/11/25(Fri) 10:23:20

Re: アプリが実行中かどうかの判断方法について / にゃんこ
計測したいのはCCleanerなので
> PdhVbAddCounter(hQuery, "\Process(CCleaner)\% Processor Time", counter_iexplore_cpuuserate)
にしてみましたが、cpu利用率が0%のままで習得できていないようです。

修正せずに
> PdhVbAddCounter(hQuery, "\Process(iexplore)\% Processor Time", counter_iexplore_cpuuserate)
を実行しても、cpu利用率が0%のままで習得できていないようです。

windows8.1 ie11です
実行するにあたって何か必要な設定はありますか?

No.3192 2016/11/25(Fri) 11:16:39

Re: アプリが実行中かどうかの判断方法について / しろまさ
// WMIで個別ならこれでいけそうですが、どうでしょう?(タスクマネージャの数字とは異なる)
Dim pid = Status(GetID(" - Internet Explorer"), ST_PROCESS)
Ifb pid > 0
  with CreateOleObj("WbemScripting.SWbemLocator")
    with .ConnectServer
      GetOleItem( .ExecQuery("SELECT * FROM Win32_PerfFormattedData_PerfProc_Process WHERE IDProcess = " + pid) )
      MsgBox(ALL_OLE_ITEM[0].PercentProcessorTime)
    endwith
  endwith
EndIf

No.3193 2016/11/25(Fri) 11:22:52

Re: アプリが実行中かどうかの判断方法について / にゃんこ
ありがとうございました。
解決できました。

No.3194 2016/11/25(Fri) 11:34:31

Re: アプリが実行中かどうかの判断方法について / stuncloud
> 実行するにあたって何か必要な設定はありますか?
なにをされてそうなったのかわからないのでなんとも…

計測期間中にCPUを使っていなければ0%になりますし
round()関数で丸めているのでごくわずかな使用率だと0に丸められてしまうかもしれません
僕の環境で計測開始直前に ie.navigate() をしておいたら 2% となりました
スクリプト自体に問題はありません

計測のタイミングや計測時間に問題があるのではないでしょうか
例えばアプリを10秒間動かしてその間のCPU使用率を得たいのであればアプリ開始から計測を初めてアプリ終了までの10秒間計測を続ける必要があります
(応用で、1秒間隔で10回計測すればどの時点で高い数値を出したかがわかります)

あとは、round()関数の丸め桁を負の数で指定して少数も含めた値を出すとか、そもそもround()で丸めないとか

No.3195 2016/11/25(Fri) 12:05:51

Re: アプリが実行中かどうかの判断方法について / stuncloud
しろまささん>
Win32_PerfFormattedData_PerfProc_Process なんてクラスがあったんですね
記事を書いた当時もWMIでできないのかなって探した記憶はあるんですが…当時の自分に教えたい!

No.3196 2016/11/25(Fri) 12:30:42

Re: アプリが実行中かどうかの判断方法について / しろまさ
このクラス、XPの頃には無かった気がするんですけどね。
先ほど検索したらあっさり出てきました^^ WMI久しぶりに触ったw

No.3198 2016/11/25(Fri) 16:19:39
IEのスクロールバーを操作したい / nakanishi
初めてまして。

IEタブ内でFlashオブジェクトの自動操作を行っているのですが、
その際にオブジェクトの左上端をタブ表示領域内の左上端に設定(移動?)できないかと、
スクロールバーを操作しようと思ったのですが、
何れのウィンドウにスクロールバーが存在するのか不明なため、
下記スクリプトで何れのウィンドウにスクロールバーがあるのか調査してみました。


DIM id=GETID("xxx - Windows Internet Explorer")
DIM h=GETCTLHND(id,"MacromediaFlashPlayerActiveX")

PRINT id+":"+h

id=HNDTOID(h)
WHILE id>-1
PRINT STATUS(id,ST_PARENT)+":"+STATUS(id,ST_TITLE)+":"+STATUS(id,ST_CLASS)
PRINT GETSLIDER(id,1,SLD_MAX)
PRINT GETSLIDER(id,2,SLD_MAX)
PRINT
id=HNDTOID(h)
WEND


上記スクリプトを実行したところ、
出力結果は次のとおりとなりました。

1:27331518

3::MacromediaFlashPlayerActiveX
-999999
-999999

4::Internet Explorer_Server
-999999
-999999

5::Shell DocObject View
-999999
-999999

6:xxx - Windows Internet Explorer:TabWindowClass
-999999
-999999

1::Frame Tab
-999999
-999999

-1:xxx - Windows Internet Explorer:IEFrame
-999999
-999999


この結果から、IEのスクロールバーが何れのウィンドウにも存在しないように見受けられるのですが、
これはいったいどういうことなのでしょうか?

当方の、スクロールバーに対する誤認識なのでしょうか?

ご教授いただける方がいらっしゃいましたら、
よろしくお願いします。

No.3183 2016/11/23(Wed) 17:19:04

Re: IEのスクロールバーを操作したい / nakanishi
追記:

対象タブにはスクロールバーが存在しており、
手動ではスクロールできている状態です。


書き忘れてしまい、
すいませんでした。

No.3184 2016/11/23(Wed) 17:21:13

Re: IEのスクロールバーを操作したい / nakanishi
再度、すみません。

ループ内の最後の「id=HNDTOID(h)」は間違いで、
正しくは次のとおりです。

WHILE id>-1
PRINT STATUS(id,ST_PARENT)+":"+STATUS(id,ST_TITLE)+":"+STATUS(id,ST_CLASS)
PRINT GETSLIDER(id,1,SLD_MAX)
PRINT GETSLIDER(id,2,SLD_MAX)
PRINT
//id=HNDTOID(h) ←間違い
id=STATUS(id,ST_PARENT) ←正解
WEND


転載する際に誤りがありました。

No.3185 2016/11/24(Thu) 02:01:40

Re: IEのスクロールバーを操作したい / stuncloud
flash自身ではなくflashのあるページにスクロールバーがあるという話で良いですか?
違う場合は読み飛ばしてください
そうである場合はスクロールバーのあるエレメントのscrollTopを変更することでスクロールバーの操作ができます

例えばこの掲示板ならHTMLエレメントのスクロールバーを操作することで移動させられました

ie = createoleobj("InternetExplorer.Application")
ie.visible = TRUE
ie.navigate("http://www3.rocketbbs.com/13/bbs.cgi?id=umiumi")

with ie.document.documentElement
 msgbox(.tagName + "のスクロールバーの長さは" + .scrollHeight)
 .scrollTop = input("数値を変更してスクロールバーを動かします", .scrollTop)
endwith

スクロールバーがあるのはbodyだったりdivだったり、そのページの作りによります
どこにあるかはF12の開発者ツールで探すと良いでしょう
(エレメントを選んだ状態でコンソールから $0.scrollTop = $0.scrollHeight を実行して一番下までスクロールすれば当たり)

以上は縦向きのスクロールバーの話で、横向きならばscrollLeftを変更します(scrollWidthで長さがわかります)

# ChromeだとbodyなんですけどIEだとHTMLにスクロールバーがついてるんですね…?

No.3186 2016/11/24(Thu) 11:03:04

Re: IEのスクロールバーを操作したい / nakanishi
stuncloudさんへ

ありがとうございました。
無事解決できました。

GETSLIDER|SETSLIDERにこだわってしまってたものですから、
COM経由であっさりできちゃうんですね。

返信遅くなり、
申し訳ございませんでした。

No.3188 2016/11/24(Thu) 23:20:24
エクセル 範囲に名前を付けるには / 藍
いつもお世話になります。

Excel.Range("A1").CurrentRegion.Name = "合計"

セルに名前を付けられるのですが範囲に名前を付けるには

どのようにすればよいか良いのかご教示下さい。

B1〜B10 → "合計範囲"

よろしくお願いします。

No.3178 2016/11/19(Sat) 21:42:11

Re: エクセル 範囲に名前を付けるには / Nagatani
こんな感じでは?
Excel.Range("B1:B10").Name = "合計範囲"

No.3180 2016/11/20(Sun) 11:58:44

Re: エクセル 範囲に名前を付けるには / 藍
ありがとうございます。出来ました感謝です。
No.3182 2016/11/20(Sun) 18:10:02
ネット環境で、画像認識をしなくなる。 / あまみや
全く同じ品番のノートパソコンを5台購入して、A営業所で作成し、他の4台のパソコンに、同じプログラムを導入しました。
A.B.Cの営業所は全く問題なく動作するのですが、D.E営業所は、画像認識のところで、認識出来ずに動作が進みません。D.E営業所のパソコンをA営業所に持ってくると、動作します。
試しに、A営業所のパソコンをD営業所に持って行って試すと、やはり画像認識のところで、認識せずに進みません。ネットの環境で、送られてくる画像が、スピードとかの関係で?くずれるのでしようか?
さっぱり解決策が見つからず、困っています。
動作させてるのは、webページのものでIEです。お分かりの方が居られたら、助言を欲しく投稿しました。よろしくお願いします。

No.3169 2016/11/17(Thu) 20:44:50

Re: ネット環境で、画像認識をしなくなる。 / あまみや
ちなみに、画像はprintscreenでペイントに貼り付け、切り出した物を24ビットで保存したものを使用してます。よろしくお願いします。
No.3171 2016/11/17(Thu) 20:51:52

Re: ネット環境で、画像認識をしなくなる。 / koi
どのように処理してるのかよくわかりませんが
もし一度だけの判定処理で判断しているのでしたら
一定時間判定処理を繰り返すようにしてみてはどうでしょうか

一度だけの判定で済まそうとすると
同じ環境で判定していてもネット速度(その時のPC負荷)によって
検出出来たりできなかったりすることはありますよ

No.3172 2016/11/17(Thu) 21:07:43

Re: ネット環境で、画像認識をしなくなる。 / あまみや
While True

WEnd

を利用して、延々画像が認識するまで繰り返してますが、ヒットしないんですよね。
色々検索してみたら、chkimgxと言う拡張関数があるみたいで、試してみようと思います。ありがとうございます。

No.3174 2016/11/17(Thu) 23:36:26

Re: ネット環境で、画像認識をしなくなる。 / satocha
>printscreenでペイントに貼り付け、切り出した物を24ビットで保存
の作業を全営業所でやってもらってメールなどで送ってもらい、それぞれ画像認識を試みたらいいのではないでしょうか。

No.3175 2016/11/18(Fri) 10:13:46

Re: ネット環境で、画像認識をしなくなる。 / 俄プログラマー
>さっぱり解決策が見つからず、困っています。

解決策その1
認識に色幅を持たせる

解決策その2
見た目は同じ画像でも別名で保存しどちらの画像が出ても処理できるようにする。

他にもありますが先ずはこれを試せばよいと思います。

No.3176 2016/11/18(Fri) 12:11:41

Re: ネット環境で、画像認識をしなくなる。 / あまみや
試しに、Wi-Fiのアクセスポイントを買い換えてみたら、D営業所も問題なく動作するようになりました。マシンごとに画像処理で対処すると、今後の開発プログラムでも同じく複数画像を用意しなくてはならなくなるので、環境を同じものにしたら動作しました。お騒がせしました。E営業所も、Wi-Fiアクセスポイントを買い換えてみようと思います。
No.3177 2016/11/19(Sat) 21:18:40

Re: ネット環境で、画像認識をしなくなる。 / しゅん
そういえば、ソフトバンクは画像圧縮してましたっけ。
そんな罠もあるのですね。
あとは、技術的には、遅いと判明した時点で以降の画像を差し替えることも可能ですね。
参考になります。

No.3181 2016/11/20(Sun) 12:47:02
Name属性がないコントロールの指定方法 / DelhiBerry
すみません。もし詳しい方がいれば教えてください。
UWSCを使い、.NETのアプリケーションのコントロールをしようとトライしています。
Form上のボタンやテキストを見て、フォームのが切り替わったことを判定したいと考えているおり、例えば、Hoge screen上に乗っている、終了ボタンを用いて、下記のようにFormが切り替わったことを検出しようとしています。

ID=GETID("Hoge screen","HwndWrapper[Iroha.Presentation.",-1)
REPEAT
SLEEP(1)
s=CHKBTN(ID,"終了")
UNTIL s <> -1
CLKITEM(ID,"終了",CLK_BTN)

 テキストのラベルがあるボタンの場合は、ボタン名を指定することで、CHKBTNがアクティブになったことを検出できたのですが、Nameがついていない、イメージボタンの場合、うまく検出できず、困っています。
 ラベルテキスト以外の、AutomationIDやLegacyIAccessible.Nameなどの、IDを用いて、コントロールを特定する手段はないでしょうか?
 コントロールの表示検出及び、コントロールのクリック操作がでできればと思います。

よろしくお願いします。

No.3170 2016/11/17(Thu) 20:45:03

Re: Name属性がないコントロールの指定方法 / routa
ラベルが無いのなら空文字指定で順番指定を付けたらどうですか。
s=CHKBTN(ID,"",3)

No.3179 2016/11/19(Sat) 21:58:48
クラス名を取得する方法 / タカハシ
下記のコードのclass名を全て取得したいのですが良い方法が見つかりません。
正規表現で、class=".+"やtextblockやposを使ってのcopy関数でforで回せばいけるのかな?と漠然とイメージがあるのですが、コードの組み合わせ方が思いつきません。
取得したいのがinfobox、head、rank-mark rank-01、star-mark。
何か良い方法ないでしょうか?

<div class="infobox">
<div class="head">
<div class="rank-mark rank-01">第1位</div>
<div class="star-mark">おすすめ:★★★★★</div>
<dl>
<dt>会社名</dt>
<dd>特徴</dd>
</dl>
</div>
</div>

No.3162 2016/11/17(Thu) 12:15:46

Re: クラス名を取得する方法 / stuncloud
betweenstrで全部取れますね
betweenstrが値を返さなくなるまで繰り返し、連想配列に格納します
classはスペース区切りで複数含まれる場合があるのでそれらはsplitとforinで分割します
対象文字列が含まれた変数をtextとしています

hashtbl ClassnNames
i = 0

repeat
 i = i + 1
 classname = betweenstr(text, "class=<#DBL>", "<#DBL>", i)
 for n in split(classname)
  ClassnNames[n] = n
 next
until classname = EMPTY

for name in ClassnNames
 print name
next

No.3164 2016/11/17(Thu) 13:50:38

Re: クラス名を取得する方法 / タカハシ
stuncloud様、いつもありがとうございます。希望通りのクラス名取得できました。
hashtblとforin、betweenstrでこのような使い方ができるとはすごいです。

No.3165 2016/11/17(Thu) 16:47:10

Re: クラス名を取得する方法 / stuncloud
ちなみに、hashtblのkeyにclass名を格納することで重複分が排除されるという副作用があります

たとえば対象が

> <div class="rank-mark rank-01">第1位</div>
> <div class="star-mark">おすすめ:★★★★★</div>
> <div class="rank-mark rank-02">第2位</div>
> <div class="star-mark">おすすめ:★★★★★</div>


だった場合は rank-mark rank-01 star-mark rank-02 が得られます
(rank-markとstar-markが複数ありますが1個だけになります)

No.3168 2016/11/17(Thu) 17:31:20

Re: クラス名を取得する方法 / タカハシ
重複分が排除されるという副作用、これはすごいありがたいですね。
stuncloudさんのuwscの圧倒的な知識すごいですね。
かなりの実践をこなされていると推察しています。

No.3173 2016/11/17(Thu) 21:53:46
指定ウィンドウのスライダー個数を数え、縦の特定部分にのみ実行したい / たろこ
スライダーというか、スクロールバーなのですが
指定アプリのスクロールバー個数を数えて、
スライダーを動かしたり最大値を取得したりしたいと思っています。

そのアプリ画面での最大スクロール表示は縦横あわせて8個です。
人によって表示方法が違うため、どのスクロールバーが表示されているかも変わります。

全スクロールバーが表示されている段階で、左上からというのであれば
3番目になります。

||」」←ココ
|| 」

こんなウィンドウになっていて、最大縦に4つ、横に4つのスクロールバーがつきます。
調べたいのは一番右上のウィンドウです。

1.GETSLIDERで6個分、縦横を判別する
 IF (GETSLIDER(id,1,SLD_BAR)=1) then
 IF (GETSLIDER(id,2,SLD_BAR)=1) then
 IF (GETSLIDER(id,3,SLD_BAR)=1) then
 IF (GETSLIDER(id,4,SLD_BAR)=1) then
 IF (GETSLIDER(id,5,SLD_BAR)=1) then
 IF (GETSLIDER(id,6,SLD_BAR)=1) then

FOR文で回す…? そしてその値をどうやって保持するか…


2.GETSLIDERで座標位置を特定する
 位置を特定したところでなんだ、って感じですけど…。

3.GETSLIDERを使わず、他の方法を探る
 画面認識を使い、座標位置を得る。
 これは最終手段にしたいです。

良い方法があれば教えて下さい。よろしくお願いいたします。

No.3161 2016/11/16(Wed) 13:10:31

Re: 指定ウィンドウのスライダー個数を数え、縦の特定部分にのみ実行したい / stuncloud
一番右上にあるスクロールバーの位置はx座標がもっとも大きく、かつy座標がもっとも小さいものなので、例えば以下のようにして調べられます

tmp = ""
n = 0
max_x = -999999
min_y = 999999

for i = 1 to 8
 x = getslider(id, i, SLD_X)
 if x = -999999 then break
 if x > max_x then
  max_x = x
  tmp = tmp + " " + i
 endif
next
// x座標が一番大きいものの中からy座標がもっとも小さいものを探す
for i in split(tmp, " ", TRUE, TRUE)
 y = getslider(id, i, SLD_Y)
 if y < min_y then
  min_y = y
  n = i
 endif
next

msgbox("一番右上のスクロールバーは" + n + "番です")
setslider(id, 100, n) // スライドさせてみる


SLD_BARで縦横の確認もするようにすれば、希望通りにできるのではないでしょうか

No.3163 2016/11/17(Thu) 12:30:56

Re: 指定ウィンドウのスライダー個数を数え、縦の特定部分にのみ実行したい / たろこ
回答ありがとうございます。

実行してみたところ「一番右上のスクロールバーは1番です」と表示されました。
しかし、スクロールバーは動きませんでした…
縦横確認していないかもしれません。
実際、右上のスクロールバーは2番でした。

実際に1番目のアイテムから順番にスライダーを動かすよう組み
スクロールバーの表示個数を変えて確認してみました。

やはり、その位置は2番目でした。
もしかしたら2番固定なのかもしれません!

教えて頂いた方法を参考に、まずはプログラムを修正してみます。
ありがとうございました^^

No.3166 2016/11/17(Thu) 17:01:00

Re: 指定ウィンドウのスライダー個数を数え、縦の特定部分にのみ実行したい / stuncloud
> 縦横確認していないかもしれません。
はい、サンプルだと縦のものと横のものは区別してません
縦のものと横のもののそれぞれで座標を比較して、希望する位置を探すようにすると良いかと思います
それと、実はSLD_XやSLD_Yがスクロールバーのどの辺りの座標を返してるかをちゃんと検証してないので(思いつきで書いただけなので…すいません)、サンプルのコードだと想定通りにいかないという可能性があります
そのあたりはしっかり検証していただいて、いい感じに仕上げてください!

No.3167 2016/11/17(Thu) 17:19:46


 過去ログ(〜2017/03/22)・検索ツール


以下のフォームに記事No.と投稿時のパスワードを入力すれば
投稿後に記事の編集や削除が行えます。
200/200件 [ ページ : << 1 ... 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 >> | 過去ログ ]