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

ファイルにある3行の各行にある文字列を指定文字列で完全一致で置き換える方法 / 加川プロ
CHGMOJ関数を使って置き換えをすると、部分一致で全てを置き換えてしまいます。したい事が完全一致で指定文字列のみを置き換える方法を探しています。正規表現を使えばできそうですが、いまいちコードが想い浮かびません。助けて頂けないでしょうか?
下記が試しているコードです。

---------------------

file="C:\Users\テキスト.txt"
fid=fopen(file,f_read)
text=fget(fid,-2)

大阪し
大阪しらべる
大阪したい
---------------------

key="大阪"
y="し"

mozi1=key+y
resc=CHGMOJ(text,mozi1,"")


[結果]

らべる
たい

[希望処理]

大阪しらべる
大阪したい

No.4230 2017/07/13(Thu) 12:45:28

Re: ファイルにある3行の各行にある文字列を指定文字列で完全一致で置き換える方法 / しろまさ
TextBlock txt
大阪し
大阪しらべる
大阪したい
EndTextBlock

key="大阪"
y="し"
mozi1=key+y

MsgBox( Trim(regReplace(txt + "<#CR>", "^" + mozi1 + "\r\n", "")) )

// 正規表現 置換
Function regReplace(a_Str, a_Pattern, a_StrReplace)
  reg = CreateOLEObj("VBScript.Regexp")
  reg.Global = TRUE
  reg.Multiline = TRUE
  reg.IgnoreCase = TRUE
  reg.Pattern = a_Pattern
  Result = reg.Replace(a_Str, a_StrReplace)
FEnd

No.4231 2017/07/13(Thu) 13:12:36

Re: ファイルにある3行の各行にある文字列を指定文字列で完全一致で置き換える方法 / 森
正規表現は便利だけど敷居が高いですよね。
ちょっと工夫で、こうやれば実現可能だったりします。

textblock before
大阪し
大阪しらべる
大阪したい
endtextblock

key = "大阪"
y = "し"
mozi1 = key + y + "<#CR>" // 改行も含める

temp = before + "<#CR>------------" // 最終行に改行が無いのでダミーデータを付けておく
temp = replace(temp, mozi1 , "<#CR>") // 改行を含めたキーを改行のみに置換
after = replace(temp, "<#CR>------------" , "") // ダミーデータを削除
msgbox(after)

No.4234 2017/07/13(Thu) 17:53:28

Re: ファイルにある3行の各行にある文字列を指定文字列で完全一致で置き換える方法 / stuncloud
// 完全一致なら単に = で比較したんでも良いのでは
// そのままファイルの書き換えまでしています

fid = fopen(file, F_READ or F_WRITE)

key="大阪"
y="し"
mozi1=key+y

for i = 1 to fget(fid, F_LINECOUNT)
 if fget(fid, i) = mozi1 then // 完全一致していたら
  fput(fid, "", i) // 置換後の文字列を同じ行に書き込む
 endif
next

fclose(fid)

No.4235 2017/07/14(Fri) 11:20:02
保存した部分htmlファイルにinnerHTMLとかTXTとかしたいのですが / もも
お世話になります。
Webサイトを巡回して、IE.document.getElementByID(ID).outerHTML で
必要なところだけ切り出してファイル保存しています。

後日、ファイル内のTable内容をExcelやcsvに転記したいのですが、
ローカル保存した(BodyとかHeadとかが無い)不完全なhtmlファイルに対して、
更に部分切り出ししてinnerHTMLとかinnerTEXTみたいなことがしたいのですが
可能でしょうか?

いまは置換でスタイルシート一括除去とか不要タグ除去してみてるのですが、
このあと自前でTABLE読み込みを作ると思うとめげてしまいまして、なんとか
ラクは出来ないものかと。

よろしくお願いします。

No.4227 2017/07/11(Tue) 15:30:06

Re: 保存した部分htmlファイルにinnerHTMLとかTXTとかしたいのですが / stuncloud
そういう場合はhtmlfileが楽ですね、適当に書き込んでもそれなりのドキュメントにしてくれます
以下csvに書き出すサンプル

textblock table // 保存したテキストファイルの内容がこうだったとします
<table id="table1">
<tr>
<td>1</td>
<td>foo</td>
</tr>
<tr>
<td>2</td>
<td>bar</td>
</tr>
<tr>
<td>3</td>
<td>baz</td>
</tr>
</table>
endtextblock

htmlfile = createoleobj("htmlfile")
htmlfile.write(table) // 書き込み
// htmlfile.documentElement.documentがIE.document相当
table1 = htmlfile.documentElement.document.getElementById("table1")

csv = fopen("table.csv", F_WRITE)

// あとはIEと同じようにDOM操作する
for row in table1.getElementsByTagName("tr")
 td = row.getElementsByTagName("td")
 fput(csv, td.item(0).innerText + "," + td.item(1).innerText)
next

fclose(csv)

No.4228 2017/07/11(Tue) 16:22:41

Re: 保存した部分htmlファイルにinnerHTMLとかTXTとかしたいのですが / もも
stuncloud 様
サンプルありがとうございます。
完璧なサンプルだなと思いつつも実ファイルにあわせてテストしていたら手こずってしまいました。
Classでの取得を挫折してClassをID宣言に置換して逃げてみたり
.item(1)や .length にたどり着くまでへこたれかけたりと
すこし脇道に逸れると途端にやり方が分からなくて途方に暮れますね…
お陰様でなんとかテストの実ファイルもcsvに出来ました。
ありがとうございました。

No.4229 2017/07/13(Thu) 01:40:48
関数に配列を渡す際のよくわからない仕様 / RICES
for i = 0 to 5
 print 配列返し()[i]
next

print "end"

print join(配列返し())
print "end1"

print 配列受取(split(join(配列返し())))
print "end2"

dim x = 配列返し()
print 配列受取(x)
print "end3"

print 配列受取(配列返し())
print "end4"

//関数の返り値が配列の場合、それを直接関数に渡すことはできない?

///////////////////////////////
function 配列返し()
dim 配列[5]=1,2,3,4,5,6
result = split(join(配列))
fend
///////////////////////////////
function 配列受取(配列2[])
result = true
fend
///////////////////////////////

またしても妙な疑問ですみませんが、
上記コードを実行してみると、end4に到達できないかと思います。
どういう原理なんでしょうか…ね??

No.4207 2017/07/07(Fri) 13:16:19

Re: 関数に配列を渡す際のよくわからない仕様 / stuncloud
UWSCの配列変数はなんだかものすごく特殊な感じがするので、仕様上しょうがないのかもしれないですね
詳しいことはumiumiさんの回答を期待したいです

配列受取((配列返し()))
()で括ったらどうなるかなと思ったらSyntax Error

function 配列受取(配列2)
とすればひとまずOK、SafeArrayしか使わないのであれば引数を配列変数として定義しないのはアリです
(ただしSafeArray以外を渡しちゃうと困るので入力値のチェックは厳格に行うべき)

No.4210 2017/07/07(Fri) 16:50:46

Re: 関数に配列を渡す際のよくわからない仕様 / RICES
内部では配列は2種類あるような扱われかたをしているような印象を受けます

function 配列受取(配列2)
これで受け取れるとは思いませんでしたが、逆に普通に変数定義した配列を入れられなくなっちゃうんですね…
ぶっちゃけちょっとコードが長くなるだけなので別に実害はなさそうですけど、変数に格納してから引数に入れるか、結合文字列として受け取って内部で配列化するかになりますかね

No.4219 2017/07/10(Mon) 00:06:09

Re: 関数に配列を渡す際のよくわからない仕様 / satocha
検証してみました
下のコードを動かしてみると次のような結果になりました。

配列を返す組み込み関数を組み込み関数から呼び出す→○
配列を返す自作関数を組み込み関数から呼び出す→○
配列を返す組み込み関数を自作関数から呼び出す→○
配列を返す自作関数を自作関数から呼び出す→×

msgbox( length(split("a b c d")) )
msgbox( mylength(split("a b c d")) )
msgbox( length(mysplit("a b c d")) )
msgbox( mylength(mysplit("a b c d")) )
function mysplit(str,sep=" ")
 result =split(str,sep)
fend

function mylength(ary[])
 result =length(ary)
fend

ならば、配列を返す自作関数をそのまま自作関数に投入せず、組み込み関数であるsliceでいったん受けてやればどうか?
msgbox( mylength(slice(mysplit("a b c d"))) )
見事うまくいきました。記述は増えるものの余計な変数は排除できます。

No.4220 2017/07/10(Mon) 07:17:03

Re: 関数に配列を渡す際のよくわからない仕様 / しゅん
SafeArrayが後から出てきたもので、元々の配列(DIMや関数の引数で定義する配列)との同居対応に漏れがあるためかと思います。
SafeArrayができるまでは自作関数で配列を返すことは出来なかったので、配列を受け取る自作関数に、
・変数を渡す場合、元々の配列はOK、SafeArrayもOKにした
・SplitやSlice等は配列を返すので、OKにした
・SafeArrayを返す自作関数は、、、対応が漏れている
といったところかと思います。
他にSafeArrayを返す方法は、、、あるかしらん?

限りなく不具合に近いと思いますので、umiumiさんに報告すれば直してもらえる可能性は高そうです。

No.4221 2017/07/10(Mon) 09:38:16

Re: 関数に配列を渡す際のよくわからない仕様 / MM
かなり昔、SafeArray関連機能が実装したての頃、
SafeArray配列の出来損ない(長さ0とか)を触ると、
絶対にTryでトラップできず実行が必ず中断されるエラーが出たりして、
それ以来、羹に懲りてなますを吹いています。
Splitは自作関数でラップして標準配列に転写し長さを検査したりとかですね…

No.4223 2017/07/10(Mon) 10:16:17

Re: 関数に配列を渡す際のよくわからない仕様 / RICES
>>組み込み関数であるsliceでいったん受けてやればどうか?
この方法で今の問題点が粗方解決してしました ありがとうございます

一応、split(join(配列))という渡し方をしても同様にエラーを吐かなくはなりますが、重いし長いので…

No.4226 2017/07/10(Mon) 23:05:11
UWSCでプルダウンメニューを操作するには / 高橋
UWSCでプルダウンメニューを操作するには
どのようにすればよいでしょうか。

例えば、下記のホームページ1のHTMLの場合、
人が手で操作すると、
左側のプルダウンメニューでBを選択すると
右側の表示がBになりますが
これを下記のtest.uwsで行うと
プルダウンメニューの表示はBになりますが
右側の表示がBになりません。
どのようにすれば、(UWSCでなく)手で操作した時と
同じようにBと表示されるのでしょうか。

よろしくお願いします

動作環境 : Windows7,UWSC:フリー版5.3.0.2,IE11

---test.uws-------------------------------
IE = createoleobj("internetexplorer.Application")
IE.visible = True
IE.navigate("C:\test\top.html")
repeat
sleep(0.1)
until !IE.busy and IE.readyState = 4
obj=ie.document.getElementById("id1")
obj = ie.document.frames.Item("name1").document.getElementById("id1")
sleep(1)
obj.selectedIndex = 1
-------------------------------------------

ホームページ1のHTML
---C:\test\top.html-----------------------------
<html>
<head>
<title>TEST</title>
<script type="text/javascript" SRC="function.js"></script>
</head>
<frameset cols="200,*" border="10">
<frame src="f1.html" name="name1" onload="MakeList()">
<frame src="" name="name2">
</frameset>
</html>
---C:\test\f1.html-------------------------------------
<html>
<head>
<title>f1</title>
<script type="text/javascript" SRC="function.js"></script>
</head>
<body>
<form name="name3">
<select name="name4" id="id1" onChange="ChangeList()">
</select>
</form>
</body>
</html>
---C:\test\fa.html-------------------------------------
<html>
 <head>
<title>fa</title>
 </head>
<body>
<p>A</p>
</body>
</html>
---C:\test\fb.html-------------------------------------
<html>
<head>
<title>fb</title>
</head>
<body>
<p>B</p>
</body>
</html>
---C:\test\fc.html-------------------------------------
<html>
<head>
<title>fc</title>
</head>
<body>
<p>C</p>
</body>
</html>
---C:\test\function.js---------------------------------
function MakeList()
{
 var obj;
 obj=parent.name1.document.getElementById('id1');
 obj.options[0]= new Option("A","fa.html",true,true);
 obj.options[1]= new Option("B","fb.html");
 obj.options[2]= new Option("C","fc.html");
 parent.name2.location.href=obj.options[0].value;
 parent.name2.focus();
}

function ChangeList()
{
 var url = document.name3.name4.options[document.name3.name4.selectedIndex].value;
 if (url != "")
 {
  parent.name2.location.href=url;
  parent.name2.focus();
 }
}
-----------------------------------------------

No.4217 2017/07/09(Sun) 13:00:57

Re: UWSCでプルダウンメニューを操作するには / stuncloud
対象のsselectにonchangeが定義してあるのでそれを呼びます

obj.selectedIndex = 1
obj.onchange()

No.4222 2017/07/10(Mon) 10:09:18

Re: UWSCでプルダウンメニューを操作するには / 高橋
stuncloud さん

教えていただきました方法でできました。
ありがとうござました。

No.4225 2017/07/10(Mon) 19:59:17
Procedureにおける行結合の挙動に関して / みそ
UWSC便利に使わせて貰ってます

以下のようにProcedureの引数定義の途中で _ による行結合を行ったとき、
TEST1のように2行であれば問題無いのですが、特定条件下でTEST2のように3行に渡る場合エラーになります。
あまりしない記述かとは思いますが、たまたま見つけてしまったので報告をしておきます。
よろしくお願いします

・動作確認
OS:Windows7,UWSC:フリー版5.3.0.2

・条件
定義が、
TEST1→TEST2の順であればエラーにならない
TEST2→TEST1の順、もしくはTEST2のみだとエラーになる
どうも、3行に渡るProcedureが最初の定義であった場合のみエラーになるようです

・スクリプト
Procedure TEST1(a,b, _
c,d)
Fend

Procedure TEST2(a,b, _
c, _
d)
Fend

・エラーメッセージ
__MAIN__:関数が入れ子しているか、閉じていません
PROCEDURE TEST2(A,B, FEND

No.4218 2017/07/09(Sun) 23:56:22

Re: Procedureにおける行結合の挙動に関して / MM
そういう条件だったのですか…
定義には行結合が使えないものとばかり思ってました

No.4224 2017/07/10(Mon) 12:44:39
IEで前の情報が出てくる / 武藤
IEで証券会社のサイトにログインしようというありふれた話なのですが、
ログインの可否を判断しようとサイトのタグを検索したのですが、表示中の情報ではなくひとつ前のものが出てきてしまいます。
<title>で "ログインエラー | 楽天証券" と出るはずのところ、"ログイン | 楽天証券" となっています。
何が抜けているのでしょうか。

IE = GetActiveOLEOBJ("InternetExplorer.Application")
IE.visible = true
IE.navigate("https://www.rakuten-sec.co.jp/ITS/V_ACT_Login.html")

REPEAT
SLEEP(0.1)
UNTIL !IE.busy AND IE.readystate = 4
// ID パスワード設定
IEsetData(IE,"A2AA1111","loginid")
IEsetData(IE,"a5cdefgh90123456","passwd")
// ログインボタンを押す
IEsetData(IE,true,"submit%template")

REPEAT
SLEEP(0.1)
UNTIL !IE.busy AND IE.readystate = 4
// <title>を見つける。ログインエラーなら「"ログインエラー | 楽天証券"」となる
pTag = IE.document.getElementsByTagName("title")
GETOLEITEM(pTag)

ifb ALL_OLE_ITEM[0].innerText="ログインエラー | 楽天証券"
msgbox("ログインエラー | 楽天証券")
else
msgbox("Login !")
endif

No.4208 2017/07/07(Fri) 16:09:59

Re: IEで前の情報が出てくる / stuncloud
titleタグの内容ではなくその時のドキュメントのタイトルを確認してみては

print IE.document.title

ifb IE.document.title = "ログインエラー | 楽天証券" then
//略
endif

No.4209 2017/07/07(Fri) 16:43:27

Re: IEで前の情報が出てくる / 武藤
ご回答ありがとうございます。

...
GETOLEITEM(pTag)
print ALL_OLE_ITEM[0].innerText
print IE.document.title
ifb ALL_OLE_ITEM[0].innerText="ログインエラー | 楽天証券"


二つ print文を入れてみましたが、どちらも
「ログイン | 楽天証券」
となりまして、機能しないことがわかりました。
しかし、エラーページのソースでは確かにtitleタグ内に「ログインエラー | 楽天証券」となっています。document.titleが優先してしまうのですか。だとしたらこの方法での判別は無理ということでしょうか。

No.4214 2017/07/08(Sat) 14:28:30

Re: IEで前の情報が出てくる / 山ちゃん
自分も今年になりIE11で画面遷移後、DOM操作が出来なくなる、DOM要素が更新されないことが稀にある等の症状で
解決方法を探っているので少しでもお力になればと思い書き込ませていただきます。
以下の書き込みは実際に試して確認していない、確実な情報ではないことをご了承ください。

まず、考えている対処できそうな方法として、画面遷移後IEオブジェクトの再取得です。

// ログインボタンを押す
IEsetData(IE,true,"submit%template")
//その後、IEオブジェクトを再取得する
sleep(2)
IE = GETACTIVEOLEOBJ("InternetExplorer.Application", "楽天証券")


「ie11 遷移後」などで検索すると、似たような症状で書き込みをされている方を見るのですが
決定的な解決策は発見出来ず、今年になり悶々とした気持ちで解決策を探っています。
当てずっぽうの個人的な感触して
・IE11でセキュリティ対策の更新が行われた
・不具合のでる該当ページでセキュリティ対策の変更が加えられた
等のセキュリティ関係の更新が行われたのではないかと思っています。(当てずっぽうの個人的な素人の感想です)

検索したその他の有望そうな情報として

trademam様のブログ
objIE.readyStateがずっと1(マクロのはなし)
ttp://trademam.blog.fc2.com/blog-entry-812.html
コメントにて
>url2に遷移する前後でobjIE.visibleをいじったら何故か上手くいきました(^^;

>objIE.Visible = False
>objIE.Navigate (href)
>objIE.Visible = True
との事ですので、

// ログインボタンを押す前後で.Visibleプロパティを変更する
IE.Visible = False
IEsetData(IE,true,"submit%template")
IE.Visible = True

※IEsetDataがIE.Visible = Falseの状態で実際に動作するか確認していません

voidProc様のブログ
PowerShell 2.0 から IE11 を操作しスクレイピングするサンプルコード(querySelector編)
ttp://qiita.com/voidProc/items/b3037ccb31676b27ceba
注釈にて
>Navigate() でページ遷移後、IE オブジェクトが無効になる → 原因はわかりませんが管理者権限で実行することで回避できました

IE、UWSCを管理者権限で実行する


UWSC FAQより関係のありそうな項目として

アプリの操作ができない、記録ができない(Vista/7/8.x/10)  #N29
ttp://www.uwsc.info/faq.html#N29
管理者権限を合わせて実行する

IEの操作が正しく働かない、IE上での動作を記録しようとしても記録ができない(Vista/7/8.x/10)  #N30
ttp://www.uwsc.info/faq.html#N30
IEの保護モードを解除

IE11にて画面更新後に操作(COM)ができない  #N45
ttp://www.uwsc.info/faq.html#N45
こちらも画面遷移後DOM操作ができない改善方法
自分は画面遷移後徹底的にSendMessageA(ie.Hwnd, WM_ACTIVATE, 0, 0)を入れてみたのですが改善せず


基本的なIE不具合の改善策(見落としがちだが、ごく稀に改善することがある)

NEC LAVIE公式サイト
Windows 8.1 / 7のInternet Explorer 11の動作が遅い場合の対処方法
ttps://121ware.com/qasearch/1007/app/servlet/relatedqa?QID=016572
>1. インターネット一時ファイルや閲覧の履歴を削除する
>2. アドオンを無効にする
>3. GPUレンダリングの設定を確認する
>4. ウイルスに感染していないか確認する
>5. Internet Explorer 11の設定をリセットする

以上です。
>コメント欄へのURL(http://)の投稿限度数を超えています
との事ですのでURLをh抜きで投稿させていただきます。

No.4216 2017/07/08(Sat) 18:42:23
UWSCのClkItemの使い方と名称の取得方法 / YY
電卓のボタンをClkItemでクリックしたいのですが
やり方がよく分かりません。
電卓のボタンの名称が正しくないように思いましたので
電卓のボタンの名称を取得しようとしましたが
このやり方もよく分かりませんのでご質問します。

(問1)UWSCで電卓のボタンを操作する場合
ClkItem()を使って以下のようにしましたが
+や=のボタンがクリックされません。
12と表示された状態で終了してしまいます。
下記のコードのどこに問題があるのでしょうか。

---test1.uws-----------------------------
id=exec("C:\Windows\System32\calc.exe")
sleep(3)
ClkItem(id, "普通の電卓", CLK_MENU)
sleep(1)
ClkItem(id, "1", CLK_ACC)
ClkItem(id, "+", CLK_ACC)
ClkItem(id, "2", CLK_ACC)
ClkItem(id, "=", CLK_ACC)
-----------------------------------------

(問2)ClkItem()に記述するために電卓のボタンの
   正確な名称を取得したいのですが
   どのようにすればよいでしょうか。
  以下のようにしてみましたが
   ボタンの名称が取得できません。
   下記のコードのどこに問題があるのでしょうか。

---test2.uws-----------------------------
id=exec("C:\Windows\System32\calc.exe")
for a = 0 to getitem(id,itm_btn)-1
print a+1+":" + ALL_ITEM_LIST[a]
next
-----------------------------------------

OS:Windows7
UWSC:フリー版5.3.0.2

よろしくお願いします。

No.4199 2017/07/05(Wed) 19:03:51

Re: UWSCのClkItemの使い方と名称の取得方法 / satocha
uwsc同梱のサンプル.uwsによれば、Windows7の電卓はsendstrするだけで計算してしまうようですね。
ClkItem(id, "普通の電卓")
sleep(0.5)
sendstr(id,"1+2=")

win10のストアアプリの場合は演算キーを押しているようですが。

電卓に限って言えばこれで終わりですが、

一般にアプリケーションウインドウの部品にアクセスしたいとき、どうやってその部品にアクセスするか、ですが
私の場合は眠たい詩人さんの開発された「UWSCコードの断片生成器」を使って調べています。便利ですよ。

No.4200 2017/07/05(Wed) 20:51:53

Re: UWSCのClkItemの使い方と名称の取得方法 / routa
ストアアプリの電卓は起動ウィンドウと画面ウィンドウは違うようです。
サンプル.uwsでもIDを再取得しています。
exec("C:\Windows\System32\calc.exe")
id = GETID("電卓", "ApplicationFrameWindow")
for a = 0 to getitem(id,itm_btn)-1
print a+1+":" + ALL_ITEM_LIST[a]
next

No.4201 2017/07/05(Wed) 23:38:10

Re: UWSCのClkItemの使い方と名称の取得方法 / YY
routaさん

回答ありがとうごさいます。

Windows7は、ストアアプリの電卓ではなく普通の電卓と思いますが、
下記の教えていただいたコードを実行して確認しました。

exec("C:\Windows\System32\calc.exe")
id = GETID("電卓", "ApplicationFrameWindow")
for a = 0 to getitem(id,itm_btn)-1
print a+1+":" + ALL_ITEM_LIST[a]
next
の実行結果ですが、

getitem(id,itm_btn)は1で
print文は
17/07/06 14:27 1:スタート
だけが出力されていて、
ボタンの名称は1つも取得できていませんでした。

よろしくお願いします。

No.4203 2017/07/06(Thu) 21:15:00

Re: UWSCのClkItemの使い方と名称の取得方法 / satocha
sendstrではなく、どうしてもボタンを押したいということでしたら、

powershell("ps calc|kill")
calcid =exec("calc.exe")
clkitem(calcid,"表示\普通の電卓",CLK_MENU)
sleep(0.1)
clkitem(calcid,"1",CLK_ACC)
clkitem(calcid,"加算",CLK_ACC)
clkitem(calcid,"2",CLK_ACC)
clkitem(calcid,"等号",CLK_ACC)

msg="ボタンの名称は次の通りです"
for btn in getitem(calcid,ITM_ACCCLK,-1)
 msg =msg+"<#CR>"+btn
next
sendstr(exec("notepad"),msg)

No.4204 2017/07/07(Fri) 06:34:42

Re: UWSCのClkItemの使い方と名称の取得方法 / MM
satochaさんが最初に仰ったように、こちらが便利ですよ

「UWSCコードの断片生成器 Fragment Creator of Uwsc Code (UWSC fcuc.uws)」
http://nem.symphonic-net.com/uwsct/fcuc_readme.htm

これを走らせて取得できないボタン名称は、そもそも名称指定で押せないことになります。
省力化がテーマのツールでこういうメタコードを使わないのはどうかなと思います。
ググればすぐ見つかるはずですがやってみましたかね…?

No.4205 2017/07/07(Fri) 09:23:06

Re: UWSCのClkItemの使い方と名称の取得方法 / しろまさ
// >これを走らせて取得できないボタン名称は、そもそも名称指定で押せないことになります。
// 押せますよ(反則?) スピードに挑戦してみました^^

SetBtn()
MsgBox("1-100 まで加算します")
Dim i
For i = 1 To 100
  BtnS("+" + i)
Next
BtnS("=")

MsgBox("次は100*100")
BtnS("100*100=")

Procedure SetBtn()
  Public HashTbl h_nm
  Dim idc = exec("calc.exe"); ClkItem(idc, "表示\普通の電卓", CLK_MENU)
  Dim i, nm = Split("mc mr ms m+ m- bs ce c ± rt 7 8 9 / % 4 5 6 * /x 1 2 3 - = 0 . +")
  For i = 0 To Length(nm) - 1; h_nm[nm[i]] = GetCtlHND(idc, "Button", i + 1); Next
FEnd
Procedure BtnS(num); Dim i; For i = 1 To Length(num); Btn1(Copy(num, i, 1)); Next; FEnd
Procedure Btn1(nm); MouseOrg(h_nm[nm], 2); KBD(VK_SPACE); MouseOrg(0); FEnd

No.4206 2017/07/07(Fri) 09:58:37

Re: UWSCのClkItemの使い方と名称の取得方法 / 山ちゃん
(問1)
>下記のコードのどこに問題があるのでしょうか。
(問2)でも触れられていますが、正確なアイテム名が指定されていないためです。
satocha様の回答にも記載されていますね。

//以下は、記録機能(高レベル記録)を利用して作成したコードです。windows7用電卓操作
id = EXEC("calc") //id = GETID("電卓", "CalcFrame", -1) 電卓起動はEXEC使用へ手を加えました
SLEEP(1)
CLKITEM(id, "普通の電卓", CLK_MENU, False)
id = GETID("電卓", "CalcFrame", -1)
CLKITEM(id, "1", CLK_ACC)
CLKITEM(id, "加算", CLK_ACC)
CLKITEM(id, "2", CLK_ACC)
CLKITEM(id, "等号", CLK_ACC)


(問2)
>下記のコードのどこに問題があるのでしょうか。
GetItemの種別の指定です。

ITM_ACCCLK    // アクセシビリティ経由:クリック可能な物
を指定して実行

id = EXEC("calc")
for i = 0 to GetItem(id, ITM_ACCCLK)-1
  print ALL_ITEM_LIST[i]
next

//実行結果
メモリのクリア
バックスペース
7
4
1
0
メモリ呼び出し
入力のクリア
8
5
2
メモリ保存
クリア
9
6
3
小数点
メモリ加算
符号切り替え
除算
乗算
減算
加算
メモリ減算
平方根
パーセント
逆数
等号

>正確な名称を取得したいのですが
>どのようにすればよいでしょうか。
ここは自分も悩むことがあるので、上手く回答できないですが、
satocha様、MM様の回答されているツール(UWSCコードの断片生成器)を利用してみる
記録機能(高レベル記録)を利用してみる
取得する系の関数で全ての種別を試してみる
でしょうか。

>しろまさ様
いつも参考にさせて頂いています。ありがとうございます。

No.4213 2017/07/08(Sat) 00:10:06

Re: UWSCのClkItemの使い方と名称の取得方法 / YY
satocha さん
教えていただきましたコードでうまくいきました。
ありがとうございました。

satocha さん、MM さん
UWSCコードの断片生成器使って見ました。
+や=が加算や等号になっているのを確認できました。
これらを取得したコードも書かれているので
何で取得したのかが分かり便利ですね。
ありがとうございました。

しろまさ さん
今はまだよく理解できないけど
今後の参考にさせていただきます。
ありがとうございました。

山ちゃん さん
itm_btnではなくITM_ACCCLKでしたか。
このあたりがまだあまりよく理解できていません。
UWSCコードの断片生成器を利用してみるようにします。
とても分かりやすい説明ありがとうございました。

No.4215 2017/07/08(Sat) 15:14:34
記録ボタンがグレーアウトして押せなかった問題・解決! / skyblue
 お世話になっています

過去2回にわたって皆様から親切なアドバイスを頂きながら、未解決になっていましたが解決できたので報告します。

1.その後、無駄に終わった作業
 過去のUWSCをコントロールパネルから全部削除し、Windows10を上書きしましたが効果は無く落胆していました。

2.マイクロソフトの有料相談
 MSと年間契約していたのですがUWSCの名称を出すと断られるので、ダウンロードの問題で相談。
たまたま非常に運良く、UWSCを使った経験のある方で、簡単ではなかったが精力的に取り組んでいただきました。

3.解決策
(1)PC右下の山形ボタンを左クリック(隠れたインディケーターを表示)
(2)タスクトレイのUWSCアイコン上で右クリック
(3)INI/LOGを左クリック
(4)そこで出てくるログなどを全部削除
・・これで解決しました。

MSの担当者は過去のログがいたずらしていたようだと言いました。

UWSCについては初歩的な使い方しかわかりませんがVBAと組み合わせたヘビーな使い方をしているので、それが原因かもしれません。
 

No.4211 2017/07/07(Fri) 18:20:39
ウィンドウIDの生存期間は? / もも
お世話になります。
取得したウインドウIDの一覧から、複数のIDの窓を一括で閉じる処理を作りたいのです。

スクリプトの実行中は窓を閉じてもIDは欠番して他のIDも変わらないと有り難いのですが、
ウインドウIDはいつまで固定なのでしょうか?
ファイルの行削除のように、窓を閉じる処理は番号の逆順で作業しないと危険な感じでしょうか?

Everythingで大量に開いた窓を閉じる処理を作りたかったのですが、実際にCTRLWINで閉じる
際に「閉じて番号がずれて他の窓に誤爆したら怖いな」と考えたら、テスト自体がすでに
キケンだなぁと…

よろしくお願います。


TextBlock 説明

Firefoxの復帰画面のように、起動しすぎたEverythingの窓を一覧にして
不要な物を選択後、一括で窓を閉じる

EndTextBlock
MsgBox(説明)

DIM windowArray[1][2] // Everythingの窓IDの配列 IDno,窓タイトル
DIM windowCnt = 0 // 配列要素数

// クラス名で"EVERYTHING"を検索し、WinIDとタイトルを取得

maxCnt = GetAllWin() // 全WindowのIDを取得

Resize( windowArray,maxCnt) // 一旦最大値まで広げる

For no = 0 To maxCnt -1
winID = ALL_WIN_ID[no] // WinID取得
If STATUS( WinID, ST_CLASS ) = "EVERYTHING" Then
windowArray[windowCnt][0] = winID
windowArray[windowCnt][1] = STATUS( WinID, ST_TITLE ) // タイトルを返す
windowCnt = windowCnt + 1
EndIf
Next

a=""
For i = 0 To windowCnt - 1
a = a +"<#DBL>" + windowArray[i][0] + "番 " + windowArray[i][1] +"<#DBL>"
Next
a = Replace(a,"<#DBL><#DBL>","<#DBL>,<#DBL>")

a = "SlctBox(SLCT_CHK or SLCT_NUM, 0,<#DBL>削除する窓にチェック<#DBL>," + a + ")"

res = Eval(a) // チェックリスト表示 戻り値:チェック無し=""

MsgBox(res)

For no In Split(res, "<#TAB>")
msgbox(windowArray[no][1])
kill = MsgBox("窓を閉じますか?<#CR><#CR>" + STATUS(windowArray[no][0], ST_TITLE) +"<#CR>"+STATUS(windowArray[no][0], ST_CLASS),BTN_YES or BTN_NO)
If kill = BTN_YES Then
MsgBox("CtrlWin( " + windowArray[no][0] + ",CLOSE )")
EndIf
next

No.4195 2017/07/05(Wed) 02:12:34

Re: ウィンドウIDの生存期間は? / satocha
もも様

その情報は私も知りたいところです。
ですが、現状、心配であれば、

windowArrayに格納するデータをウインドウIDではなく
IDTOHND関数でウインドウハンドルにしておき、
使うとき(閉じるとき)、HNDTOID関数で元に戻すというのはどうでしょうか。

ウインドウハンドルはUWSCの処理とは無関係に定まる値だと思いますので。

No.4196 2017/07/05(Wed) 06:01:23

Re: ウィンドウIDの生存期間は? / satocha
追加です

>>テスト自体がすでにキケンだなぁと…

とのことですが、windowArrayに元のタイトルが残っているので、
CtrlWinで操作する前に、status(id,st_title)と比較すればいいかと。

タイトルだけの判断では心配なら、windowArray[n][2]にクラス名も保存しておけばいいかと思います。

No.4197 2017/07/05(Wed) 08:37:39

Re: ウィンドウIDの生存期間は? / stuncloud
idはウィンドウに対して一意です
少なくともそのウィンドウが存在している間はidは同じままです
ので

> Everythingで大量に開いた窓を閉じる処理を作りたかったのですが、実際にCTRLWINで閉じる
> 際に「閉じて番号がずれて他の窓に誤爆したら怖いな」と考えたら、テスト自体がすでに
> キケンだなぁと…


ということはないのでご安心を

ただもしかしたら、例えばid=1のウィンドウがあるとしてそれが閉じられた後に別のウィンドウをgetid()/getallwin()した場合、その別ウィンドウのidが1になることはあるかもしれません
軽く試した限りでは新しいウィンドウには新しい番号が割り当てられているようですが、一応その可能性があることを考慮しておいてください(※)

※ fopen()で得られるファイルのidはfclose()した後だと使いまわされることがわかっています

No.4198 2017/07/05(Wed) 11:26:24

Re: ウィンドウIDの生存期間は? / もも
satocha 様
>windowArrayに格納するデータをウインドウIDではなく
>IDTOHND関数でウインドウハンドルにしておき、

あーそんな感じでも行けそうですね。目から鱗でした。
ハンドルとかDLLに渡す値とか、いまいち身についてないので、自分からは怖くて…
>CtrlWinで操作する前に、status(id,st_title)と比較すればいいかと。
質問書いた時には実環境にチェック機能入れる気力が切れてたです。
ありがとうございました。

stuncloud 様
>idはウィンドウに対して一意です
>少なくともそのウィンドウが存在している間はidは同じままですので

ありがとうございます。
おそらく問題無いだろうとは思ってましたが、無自覚にシステムポコポコ壊してる
状況を想像してしまうととても怖かった物で…
stuncloud 様には以前も回答頂いていたようで、気がつくのが遅れてしまいすいませんでした。
前のレスの、自己exe化を起こす処理を組み込んでおくという発想も衝撃的でした。
ありがとうございました。

No.4202 2017/07/06(Thu) 02:14:17
エクセルのデータを2次元配列にいれて、表タグ作成をする方法 / よっさん
以前satocha様から回答を頂き、大変恐縮ですが仕事が忙しく返信期限が過ぎてしまった件の続きです。エクセルのデータを2次元配列にいれて、表タグ作成をする方法が分かりません。XLGETDATAで2次元配列の分を<TH>タグで出力させる処理が分かりません。1次元配列の場合は希望の出力できました。2次元配列の場合はどのようなコード書けばいいのでしょうか?


[したい処理]

<TABLE class="table">
<THEAD>
<TR>
<TH>会社名1</TH>
<TH>会社名2</TH>
<TH>会社名3</TH>
</TR>
</THEAD>

<TBODY>
<TR>
<TD>エリア1</TD>
<TD>エリア2</TD>
<TD>エリア3</TD>
</TR>
</TBODY>
</TABLE>



EXCEL = CREATEOLEOBJ("Excel.Application")
EXCEL.visible = True
Excel.WorkBooks.Open(FileName :="ファイル名")
XLACTIVATE( Excel, "Sheet2")
hai=XLGETDATA( Excel, "b1:d1")//会社名1 会社名2 会社名3

hai1=XLGETDATA( Excel, "b2:d2")//エリア1 エリア2 エリア3


//ダミーのHTMLオブジェクトを生成
document =createOleObj("htmlfile")
//空っぽなのでbodyだけ作っておく
body =document.createElement("Body")

//tableタグを生成
table =document.createElement("table")
thead =document.createElement("thead")
tr =document.createElement("tr")
tr1 =document.createElement("tr")
th =document.createElement("th")
tbody =document.createElement("tbody")
td =document.createElement("td")


//タグ(要素)に属性がある場合は、setAttribute( 要素名, 値 )
table.setAttribute( "class", "table" )

//th要素を生成・登録
dim ths[length(hai)]
for i = 0 to length(hai)-1//1
ths[i]=document.createElement("th")
ths[i].appendChild(document.createTextNode(hai[i]))
tr.appendChild(ths[i])
next


//th要素を生成・登録
dim ths1[length(hai1)]
for i = 0 to length(hai1)-1//1
ths1[i]=document.createElement("td")
ths1[i].appendChild(document.createTextNode(hai1[i]))
tr1.appendChild(ths1[i])
next


//その他の要素を登録
body.appendChild(table)
table.appendChild(thead)
thead.appendChild(tr)
tbody.appendChild(tr1)
table.appendChild(tbody)
// tr1.appendChild(td)


//htmlオブジェクトが作ってくれたHTMLを頂く
HTML=body.innerHTML
print HTML

No.4184 2017/07/02(Sun) 13:27:35

Re: エクセルのデータを2次元配列にいれて、表タグ作成をする方法 / 森
以前の質問の際、二次元配列についても理解を深めるようにとのアドバイスで終わっていたように記憶しています。
一応質問に従って、見出しもデータも同じ配列取り込みましたが、私なら、同じ配列には入れず、見出しは別の1次元配列に入れて処理します。
質問では、見出しが1行、データも1行ですが、その場合は、それぞれ別の1次元配列で良いと思います。
普通、二次元配列が必要になるのは、このサンプルのようにデータ部分が複数行あるケースです。
尚、より初心者の方でも参考になるよう、COMではなくUWSC標準コマンドでのサンプルとしました。
-----------------------------------
// エクセル sample.xlsx
品名,単価,在庫
りんご,150,100
みかん,100,200
バナナ,300,150
-----------------------------------

// Excelの起動
Excel = XLOPEN("sample.xlsx")

// 配列に取り込み
dim data[4][3]
for i = 1 to 4
 for j = 1 to 3
  data[i][j] = XLGETDATA( Excel, i , j )
 next
next

// ここからHTML生成
html = "<TABLE>"
html = html + "<#CR>" + " <THEAD>"
html = html + "<#CR>" + "  <TR>"
for j = 1 to 3
 html = html + "<#CR>" + "   <TH>" + data[1][j] + "</TH>" //----- 1行目は見出し
next
html = html + "<#CR>" + "  </TR>"
html = html + "<#CR>" + " </THEAD>"
html = html + "<#CR>" + " <TBODY>"
for i = 2 to 4   //------- データは2行目以降
 html = html + "<#CR>" + "  <TR>"
 for j = 1 to 3
  html = html + "<#CR>" + "   <TD>" + data[i][j] + "</TD>"
 next
 html = html + "<#CR>" + "  </TR>"
next
html = html + "<#CR>" + " </TBODY>"
html = html + "<#CR>" + "</TABLE>"

msgbox(html)

No.4185 2017/07/02(Sun) 19:33:08

Re: エクセルのデータを2次元配列にいれて、表タグ作成をする方法 / よっさん
森様、回答ありがとうございます。さっそく教えて頂いたコードを試してみましたが、例外が発生しましたと表示、 data[i][j] = XLGETDATA( Excel, i , j )がエラーになります。
XLGETDATA( Excel, [セル範囲, Column, Sheet名] )をヘルプで見ました。
下記のようにしてもエラーになります。

data[i][j] = XLGETDATA(Excel,"a"+i+":"+"c"+j)

No.4187 2017/07/02(Sun) 21:16:25

Re: エクセルのデータを2次元配列にいれて、表タグ作成をする方法 / 森
投稿前に動作チェックを行っているのですが、こちらでは問題なく実行されているんですよね。
念のために、もう一度実行してみましたが大丈夫でした。
エクセルのバージョン違い? ※当方はExcel 2016

しかし、そこは質問内容には関係ない部分なので、とりあえず無視して、二次元配列での処理の流れと言いますか、二次元配列自体はご理解いただけたのでしょうか?
理解できれば、よっさんが書いているスクリプトに応用して頂ければ良いかと思います。

No.4189 2017/07/02(Sun) 22:43:36

Re: エクセルのデータを2次元配列にいれて、表タグ作成をする方法 / 森
あと、まったく余談ですが、PHPやjavascriptに、CSVファイルを取り込んでテーブルに成型して表示する機能(プラグインだったかも)があったはずですよ。
目的はUWSCの精進ではなく、楽にブラウザ上でマトリックスに成形して表示させるということだと思うので、そっちの方が便利かもです。

No.4190 2017/07/02(Sun) 22:58:08

Re: エクセルのデータを2次元配列にいれて、表タグ作成をする方法 / satocha
エクセルからデータを抽出するところまではできているようなので
あとは、縦横のデータをどう、HTMLにしていくか、ということだと思います。

縦横なので、高々二次元の配列をHTMLに落とし込めばいいわけです。

エクセルの部分ははしょって、textblockで置き換えてみると
こんな感じでしょうか。

lines  =split( trim(companieSTR), "<#CR>" )
llen  =length(lines)
dim cells[llen -1]
for i=0 to llen - 1
 cells[i]=split( trim(lines[i]), "," )
next
html  =mkTable( cells )
sendstr(exec("notepad"),html)


function mkTable( cells[] )
 document  =createOleObj("htmlfile")
 document.write(skelton)
 table   =document.createElement("table")
 document.body.appendChild(table)
 table.setAttribute("border","<#dbl>1<#dbl>")
 tr_org   =document.createElement("tr")
 td_org   =document.createElement("td")
 th_org   =document.createElement("th")
 

 for row in cells
  tr   =tr_org.cloneNode()
  table.appendChild( tr )
  for data in row
   if pos( "*", data)=1
    node =th_org.cloneNode()
   else
    node =td_org.cloneNode()
   endif
   node.innerText =replace( data, "*", "" )
   tr.appendChild( node )
  next
 next

 result   =document.body.parentNode.outerHTML
fend
textblock skelton
<html><body></body></html>
endtextblock
textblock companieSTR
*会社名,*本社所在地
トヨタ,豊田
日産,横浜
ルノー,ブローニュ=ビヤンクール
GM,デトロイト
VW,ヴォルフスブルク
endtextblock

No.4191 2017/07/03(Mon) 19:55:55

Re: エクセルのデータを2次元配列にいれて、表タグ作成をする方法 / よっさん
森様の提示頂きましたコードでもう一度試した所、無事できましたありがとうございます。
プラグインですがワードプレスでtablepressというものがありますので、確かにこれでエクセルデータを貼り付ければ、表作成はできます。tablepressは表作成は一手間かかるので、UWSCでできればと思っています。なんでもかんでも、UWSCでやりたい気持ちがかえって非効率にしてしまっているかもです。

No.4193 2017/07/04(Tue) 10:52:50

Re: エクセルのデータを2次元配列にいれて、表タグ作成をする方法 / よっさん
satocha様、以前に引き続き今回もお世話になっています。教えて頂いたコードで希望の処理ができました。今の自分ではどのような構造で処理がなっているのか理解できていないので、時間をかけて読み解いていきたいと思います。
No.4194 2017/07/04(Tue) 10:54:57


 過去ログ(〜2017/08/24)・検索ツール


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