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

タイトル (必須)
 お名前 (必須)
文字色
設定保存削除/編集パス  

IEで新しいタブを操作したい / ボケチン
Internet Explorer で「新しいタブを操作したい」と思います。
下記にようにやっても、新しいタブ内のログインボタンをクリックすることができません、新しいタブ内のログインボタンをクリックするにはどのようにしたら良いでしょうか。

IE = CreateOLEObj("InternetExplorer.Application")
IE.Visible = True

IE.navigate("https://www.yahoo.co.jp/")
REPEAT
SLEEP(0.1)
UNTIL !IE.busy AND IE.readystate=4

IE.navigate2("https://email.excite.co.jp/",$800)
REPEAT
SLEEP(0.1)
UNTIL !IE.busy AND IE.readystate=4

IESetData(IE,True,"","innerText=ログイン")

宜しくお願い致します。

No.4584 2017/10/23(Mon) 12:31:11

Re: IEで新しいタブを操作したい / stuncloud
複数タブについては「IE タブ」で掲示板内を検索すれば出てきます
わりと最近似たような質問が数件あったので、そちらを参考にしてください

No.4587 2017/10/23(Mon) 18:10:21

Re: IEで新しいタブを操作したい NEW / ボケチン
stuncloud様

どうも有り難うございます。
Googleでサイト検索しても理解できなかったので、過去ログの中を検索して勉強したいと思います。

No.4591 2017/10/24(Tue) 09:04:01
function、procedureの中でpublic使う方法での戻り値について / さやか
functionはresultで戻り値を返す事ができる。
procedureは戻り値を返す事ができない。
今回下記のスクリプトでnIDという変数をメイン処理で使いたい場合ですが、procedureの中でpublicを使用する方法が思いつきます。この考え方で問題ないでしょうか?

検証した結果は、1と2それぞれでnIDは使えています。いまいち、publicの意味が完全に理解できていないような気がして質問させて頂きました。

---------------------
1

url="https://staf"
nID=ieget(url)
a=status(nID, ST_title)
print a


function ieget(url)
try
IE = GETACTIVEOLEOBJ("InternetExplorer.Application")
except
 IE = CREATEOLEOBJ("InternetExplorer.Application")
 IE.Visible = True
endTry
result =hndtoid(IE.hwnd)
fend
---------------------
2


url="https://staf"
nID=ieget(url)
a=status(nID, ST_title)
print a

procedure ieget(url)
public nID
try
IE = GETACTIVEOLEOBJ("InternetExplorer.Application")
except
 IE = CREATEOLEOBJ("InternetExplorer.Application")
 IE.Visible = True
endTry
nID = hndtoid(IE.hwnd)
fend

No.4573 2017/10/22(Sun) 11:12:45

Re: function、procedureの中でpublic使う方法での戻り値について / satocha
関数の方は問題なさそうですね。
同じことをプロシジャでやりたいのでしたら、お書きのとおり、procedureは値を返すことができないので、public指定した大域変数にprocedure中で代入するという感じです。コードで書くと
//メーン部

public nID

//プロシジャ
procedure ieget(url)

nID=…
fend

という風に、できることはできるのですが、大域変数はプログラムのあちこちで値を変更できてしまうため、バグを生じやすい懸念があります。
こういう例なら、関数で実装したほうがよいと思います。

※もうひとつ、プロシジャに変数を参照渡しする方法もあります。これなら、大域変数を使わないので前の例よりも好ましいですが、直感的に変数の値を変更していることに気付きにくいので、関数を使ったほうが後々らくだと思います。
具体的には
iget( url, nID)//これで、nIDにプロシジャで設定した値が入る
procedure ieget( url, var id )//引数の前にvarを付ける。ヘルプの「関数の定義」参照

id=…
fend

No.4575 2017/10/22(Sun) 13:52:09

Re: function、procedureの中でpublic使う方法での戻り値について / さやか
satocha様返信ありがとうございます。
全部で4パターンがあると分かりました。

パターン1
url=""

ieget(url)
a=status(nID, ST_title)
print a

procedure ieget(url)
public nID
try
IE = GETACTIVEOLEOBJ("InternetExplorer.Application")
except
 IE = CREATEOLEOBJ("InternetExplorer.Application")
 IE.Visible = True
IE.navigate(url)
endTry
REPEAT
SLEEP(0.1)
UNTIL !IE.busy AND IE.readystate = 4
nID = hndtoid(IE.hwnd)
fend
---------------------
パターン2
url=""
dim nID
ieget(url,nID)
a=status(nID, ST_title)
print a

procedure ieget(url,var nID)

try
IE = GETACTIVEOLEOBJ("InternetExplorer.Application")
except
 IE = CREATEOLEOBJ("InternetExplorer.Application")
 IE.Visible = True
IE.navigate(url)
endTry
REPEAT
SLEEP(0.1)
UNTIL !IE.busy AND IE.readystate = 4
nID = hndtoid(IE.hwnd)
fend
---------------------
パターン3

url=""
public nID
ieget(url)
a=status(nID, ST_title)
print a


procedure ieget(url)

try
IE = GETACTIVEOLEOBJ("InternetExplorer.Application")
except
 IE = CREATEOLEOBJ("InternetExplorer.Application")
 IE.Visible = True
IE.navigate(url)
endTry
REPEAT
SLEEP(0.1)
UNTIL !IE.busy AND IE.readystate = 4
nID = hndtoid(IE.hwnd)
fend
---------------------
パターン4

url=""

nID=ieget(url)
a=status(nID, ST_title)
print a

function ieget(url)
try
IE = GETACTIVEOLEOBJ("InternetExplorer.Application")
except
 IE = CREATEOLEOBJ("InternetExplorer.Application")
 IE.Visible = True
IE.navigate(url)
endTry
REPEAT
SLEEP(0.1)
UNTIL !IE.busy AND IE.readystate = 4
result= hndtoid(IE.hwnd)
fend

No.4576 2017/10/22(Sun) 14:38:44

Re: function、procedureの中でpublic使う方法での戻り値について / しろまさ
余計なお世話かもしれませんが蛇足を少々。

public はどこに記述しても実行時に定義されます。
 procedure ieget(url)
 public nID
ですので、このような書き方をするとどれがpublic変数か見落としやすくなるので
最初や最後などどこかにまとめて書いておくと後から見たとき解りやすいと思います。

ちなみにModule内publicは外部からModule内変数を参照したいときに宣言します。

No.4580 2017/10/23(Mon) 08:56:28

Re: function、procedureの中でpublic使う方法での戻り値について NEW / さやか
しろまさ様、返信ありがとうございます。

関数一覧.uwsに関数を書いていく時、下記のように配列の宣言は先頭に書いていく方がよさそうですね。今までは、各関数内に書いていましたので、分かりにくかったです。配列の処理する時は、先頭で宣言したpublic a[-1]の配列変数aで処理していくようにします。

call C:\Users\aruke\Desktop\関数一覧.uws
tes.com1()

for i in tes.a
print i
next

print length(tes.a)

---------------------
C:\Users\aruke\Desktop\関数一覧.uws

CLASS tes

public a[-1]

procedure com()
resize(a,4)
for i = 0 to 3
a[i]=i
next
fend


procedure com1()
resize(a,3)
for i = 0 to 2
a[i]=i
next
fend

endCLASS

No.4590 2017/10/24(Tue) 05:37:06
Functionの中でtextblockを切り替えたい。 / sen
いつもお世話になっております。
Functionの中でTEXTBLOCKを切り替えできるようにして、複数に対応できるようにしたいのですがうまくいきません。
こういう場合は、別々にすべきなのでしょうか?
ご教授頂けませんでしょうか?


print F置換え連想配列("牛sc興業様御中")

Function F置換え連想配列(var 漢字)
 fp = Fopen("", F_READ or F_WRITE)
 Fput(fp,T届け先漢字, F_ALLTEXT)

 正規 = CreateOLEObj("VBScript.RegExp")
 正規.IgnoreCase = true
 正規.Global = true
  for i = 1 to Fget(fp, F_LINECOUNT)
   正規.Pattern=Fget(fp,i,1)
   漢字 = 正規.Replace(漢字,Fget(fp,i,2))
   Result=漢字
  next
 Fclose(fp)
Fend

TEXTBLOCK T届け先漢字
^,""
^,""
^(株),""
様御中$,""
様$,""
御中$,""
店$,""
ENDTEXTBLOCK



print F置換え連想配列("牛sc興業様御中","T届け先漢字")

Function F置換え連想配列(var 漢字,テキストブロック)
 fp = Fopen("", F_READ or F_WRITE)
 Fput(fp,テキストブロック, F_ALLTEXT)

 正規 = CreateOLEObj("VBScript.RegExp")
 正規.IgnoreCase = true
 正規.Global = true
  for i = 1 to Fget(fp, F_LINECOUNT)
   正規.Pattern=Fget(fp,i,1)
   漢字 = 正規.Replace(漢字,Fget(fp,i,2))
   Result=漢字
  next
 Fclose(fp)
Fend

No.4574 2017/10/22(Sun) 13:20:32

Re: Functionの中でtextblockを切り替えたい。 / しろまさ
Fput(fp,Eval(テキストブロック), F_ALLTEXT)
はどうですか?

No.4581 2017/10/23(Mon) 09:06:04

Re: Functionの中でtextblockを切り替えたい。 / stuncloud
textblockは定数なので

置換え連想配列("牛sc興業様御中", T届け先漢字)

とすれば良いです、""が余計でしたね
あと、ついでにおせっかいなのですが…このくらいの正規表現置換であればパターンは1つにまとめられちゃいます

TEXTBLOCK T届け先漢字2
^(弓掛(株))|(様御中|様|御中|店)$,""
ENDTEXTBLOCK

print F置換え連想配列("牛sc興業様御中", T届け先漢字2)
// 高田興業

それとF置換え連想配列のvarも必要ないですね

# それにしてもFget(fp,i,2)した「""」が空文字として評価されてるのはなんでなんだぜ…?

No.4582 2017/10/23(Mon) 10:32:46

Re: Functionの中でtextblockを切り替えたい。 / しろまさ
あれ?
 print F置換え連想配列("牛sc興業様御中","T届け先漢字")
の"T届け先漢字"を切り替えて使いたいという要望ではなかったんですかね? 読み違えたか。

No.4583 2017/10/23(Mon) 10:59:03

Re: Functionの中でtextblockを切り替えたい。 NEW / sen
ありがとうございます。
うまくいきました。

<読み違えたか。

合っております。こういう時に、Evalを使うんですね。


<このくらいの正規表現置換であればパターンは1つにまとめられちゃいます

お恥ずかしい限りです。

No.4589 2017/10/23(Mon) 22:42:09
DEFF_DLL で教えてください / えあり
APIからレジストリデータを取りたいと思っております

レジストリの項目が分かっているときに
 RegOpenKeyExA
 RegQueryValueExA
では正常に取得できていますが、項目が分からないため、一覧を取得しようとすると
 RegQueryInfoKey
 RegEnumValueEx
 RegEnumKeyEx
上記関数でいずれも NOT DLL FUNCTION が出てエラーとなってしまいます。

データ型や指定方法が分かる方、教えていただけませんでしょうか。
FILETIME指定の箇所は {var dword, var dword} でも試しましたがこれもうまくいきませんでした。

Windos2000ではREGコマンドが無く、この方法でしか取得できず、困っております。



Dim Handle
Dim Time[1]

Dim BufA[4] = 2147483650, "SOFTWARE\Microsoft\Updates\", 1, 0
DEF_DLL RegOpenKeyExA( hwnd, string, dword, dword, var hwnd ) : long : Advapi32.dll
Print RegOpenKeyExA( BufA[0], BufA[1], 0, BufA[2], Handle )

Print Handle

Dim BufB[4] = "test", 0, 0, 0
DEF_DLL RegQueryValueExA( hwnd, string, dword, var dword,_
var pbyte, var dword) : long : Advapi32.dll
Print RegQueryValueExA(Handle, BufB[0], 0, BufB[1], BufB[2], BufB[3]) )

//ここまでは正常に動きます

Dim BufC[9] = "test", 1255, 0, 1, 1, 0, 0, 0, 0, 0
DEF_DLL RegQueryInfoKey( hwnd, var string, var dword, dword,_
var dword, var dword, var dword, var dword, var dword,_
var dword, var dword, var dword[]) : long : Advapi32.dll
MsgBox( RegQueryInfoKey( Handle, BufC[0], BufC[1], NULL, BufC[2],_
BufC[3], BufC[4], BufC[5], BufC[6], BufC[7], BufC[8], Time ) )

Dim BufD[5] = "test", 1255, 0, 0, 1256
DEF_DLL RegEnumValueEx( hwnd, dword, var string, var dword,_
dword, var dword, var pchar, var dword) : long : Advapi32.dll
MsgBox( RegEnumValueEx( Handle, 0, BufD[0], BufD[1], NULL, BufD[2], BufD[3], BufD[4]) )

Dim BufE[5] = "test", 1255, NULL, 0, 1256
DEF_DLL RegEnumKeyEx( hwnd, dword, var string, var dword,_
var dword, var string, var dword, var dword[]) : long : Advapi32.dll
MsgBox( RegEnumKeyEx( Handle, 0, BufE[0], BufE[1], BufE[2], BufE[3], BufE[4], Time ) )

No.4585 2017/10/23(Mon) 17:16:58

Re: DEFF_DLL で教えてください / stuncloud
> 上記関数でいずれも NOT DLL FUNCTION が出てエラーとなってしまいます。
については
> Unicode:Windows NT/2000 は Unicode 版と ANSI 版を実装
なので
> RegQueryInfoKey
> RegEnumValueEx
> RegEnumKeyEx

はそれぞれ
RegQueryInfoKeyA
RegEnumValueExA
RegEnumKeyExA
にする必要があるんじゃないかと思います
# あとRegEnumValueExてあるんですかね、msdn見たらRegEnumValueしかなかったんですが

レジストリに関してはWMIを使ったほうが簡単かもしれないですよ

No.4586 2017/10/23(Mon) 18:02:41

Re: DEFF_DLL で教えてください / えあり
早速の回答ありがとうございます。
RegQueryInfoKeyAとしたところ、この関数は動作いたしました。
が、やはりRegEnumValueExAおよびRegEnumKeyExAは動作しないようです。

個人的にはFILETIMEの構造体の部分が怪しいとにらんでいるのですが
この場合、指定方法が間違っているかどうかも含めて
どのように検証したらよいのか見当がつきません。

引き続き、お願いいたします。

No.4588 2017/10/23(Mon) 19:06:36
間違ってXLACTIVATEすると、次のエクセルが開けなくなる / sen
いつもお世話になっております。
以前から、ちょこちょこエクセルがうまく操作できない事を質問させて頂いていた原因らしきものが、
発見できたのですが、@のところで、間違ってXLACTIVATEすると、次のエクセルが開けなくなるみたいです。
間違いなく自分が悪いのですが、コピーして作成した為に、おかしな行がそのまま残っていたのだと思います。
ただ、沢山作った中でどこに間違った指定があるのか分からず、困っています。
これは、これでこんなものでしょうか?

//注文.CSV //を開いている
//1,2,3,4

Excel = GETACTIVEOLEOBJ("Excel.Application")

XLACTIVATE(Excel,"Nrb0000.CSV")//@ 開いていないファイルを間違って指定する
エクセル = XLGETDATA(Excel, "A1:D1")
XLCLOSE(Excel,TRUE)

for i = 0 to 3
 print I+" "+エクセル[1,i+1]
next
//ここまでは、うまく動く。

XLOPEN("新規.xlsx")//A 別のファイルを開くとうまく開けない

No.4579 2017/10/23(Mon) 00:44:42
Excel ファイルを開いた場合に書式設定のユーザー定義が破壊されます / お名前
Windows 10 Home 64bit, UWSC 5.3.0.2, Microsoft Excel 2007

UWSC から Excel ファイルを [OLEObj] として開いた場合のみ、 書式設定のユーザー定義が破壊されます。 具体例を示します。

----------------------------------------
<再現方法の具体例・ここから>
最初に、 [C:\Book1.xlsm] を作成し、 任意のセルに 2017年1月1日などの年月日を記述します。 その書式を [セルの書式設定 > ユーザー定義] で [yyyy"年"mm"月"dd"日"] に設定します。 その後、 UWSC から以下のプログラムで開きます。

Excel_OLEObj_2 = CreateOLEObj("Excel.Application")
Excel_OLEObj_2.Visible = True
Excel_OLEObj_2.WorkBooks.Open(FileName :="C:\Book1.xlsm")

すると、 本来であれば [yyyy"年"mm"月"dd"日"] のユーザー定義を維持していなければいけないはずですが、 [yyyy"年"m"月"d"日"] に きょうせいリプレースされます。 また、 該当のユーザー定義は消滅しています。

<再現方法の具体例・ここまで>
----------------------------------------

しかし、 yyyy"年"m"月"dd"日" の場合、 なぜか破損しません。 また、 "西暦"yyyy"年"mm"月"dd"日" の場合も、 なぜか破損しません。

ファイルの拡張子が .xlsb, .xlsx の場合もユーザー定義が破損します。 しかし、 ファイルの拡張子が .xls の場合、 なぜかユーザー定義が維持されます。

セルのスタイル > 新しいセルのスタイル
に登録した場合も同じ不具合になりました。 この場合、 セルのスタイルのユーザー設定ごと破損していました。

UWSC でも、 [OLEObj] いがいの方法だと正常に動作しました。 例えば、 以下の コマンド プロンプトからだと正常に起動できました。
DOSCMD("C:\Book1.xlsm", TRUE)

[Windows 7 Professional 32bit + Microsoft Excel 2013] の環境では発生しませんでした。

[UWSC から Excel ファイルを [OLEObj] として開いた場合] いがいの どんな方法でも、 この不具合は再現しませんでした。

質問です。 私以外の人も同じ不具合が発生するのかを教えてください。 原因、 対策、 などを知っていれば教えてください。 よろしく お願い致します。

No.4569 2017/10/20(Fri) 19:25:36

Re: Excel ファイルを開いた場合に書式設定のユーザー定義が破壊されます / しき
win7 pro 64bit + Excel2007 + UWSC 5.3.0.2
で再現しました。
対策。Local:=true を入れる。これが他にどんな影響を与えるかはわかりません

o_Excel = GetActiveOleObj("Excel.Application")
o_Excel.WorkBooks.Open("C:\test1.xlsm", Local:=true)


以下、試してみて分かったこと
・ファイルは .xlsm, .xlsx, .xlsb でも日付書式が変化します
 .xls (2003形式)では変化しません。2007以降のファイル形式で発生するよう

・4つの書式で試した
 yyyy"年"mm"月"dd"日"  //==> yyyy"年"m"月"d"日"
 yyyy/mm/dd       //==> 分類が ユーザー定義 から 日付になる
 mm"月"dd"日"      //==> m"月"d"日"
 mm/dd         //==> mm/dd 変化なし

・WorkBooks.Open で開いた後、手動で閉じて、手動で開くと書式は変化前に戻っている
 ==> 開いただけではファイルは更新されてない
    また、閉じるときに保存の確認もない

・WSH と WordのVBA で同じように開いてもこの現象は発生しない
 また、Local:=false としても問題の現象は発生しない
 ==> UWSCにも原因はある?

'==== WSH用 test.vbs ====
set o_Excel = GetObject(, "Excel.Application")
o_Excel.Workbooks.Open("C:\test1.xlsm")
'call o_Excel.Workbooks.Open("C:\test1.xlsm", , , , , , , , , , , , false)
'call o_Excel.Workbooks.Open("C:\test1.xlsm", , , , , , , , , , , , , true)

'==== Word VBA用 マクロ ====
Sub Macro1()
Set o_Excel = GetObject(, "Excel.Application")
o_Excel.Workbooks.Open FileName:="C:\test1.xlsm"
'o_Excel.Workbooks.Open FileName:="C:\test1.xlsm", Local:=False
'o_Excel.Workbooks.Open FileName:="C:\test1.xlsm", Local:=True
End Sub

No.4577 2017/10/22(Sun) 14:47:07

Re: Excel ファイルを開いた場合に書式設定のユーザー定義が破壊されます / お名前
ありがとうございます。 あなたの助言のとおり、 [Local:=true] を入れることで、 不具合は発生しなくなりました。

つまり、 書式のユーザー定義に日本語を含んでいる場合のみに不具合が発生するので、 あなたは [言語にかんけいしている] と判断して、 Local のパラメータに着目したのですね。 さすがです。

<以下、 個人的な勝手な推測 (根拠なし)>
Excel 2007 のファイル起動処理時に、 本来であれば Local の指定の有無にかかわらず、 [日本語のユーザー定義] もロードされなければ不自然です。 しかし、 Excel 2007 の不具合により、 [Excel 2007 から追加された新しい拡張子 (.xlsx など)] の起動処理のみでは [日本語のユーザー定義の一部] が正常に起動できません。 Local の指定がない場合、 ディフォルトの処理になり、 UWSC は default = English, [WSH と WordのVBA] は default = [OS と同じ言語]、 という処理だと仮定すれば、 その仕様に基づいて、 UWSC の場合のみ [日本語のユーザー定義の一部] が起動 (ロード?) されなくなります。

前述したとおり、 Excel 2013 では不具合が発生しませんでしたので、 Excel 2007 の不具合と推測されます。 UWSC の不具合であれば、 Excel 2013 でも発生しなければ不自然なので。

No.4578 2017/10/22(Sun) 17:13:03
csvファイルの漢字から半角カタカナに変換したい / sen
いつもお世話になっております。
csvファイルの漢字から半角カタカナに変換したいのです。
下記の様なマクロを発見しまして、xlsmファイルではうまくいきます。
しかし、csvファイルなので、できればcsvのままuwscで変換したいのです。
ご教授頂けませんでしょうか?

Function GetPhoneticf(i)
GetPhoneticf = Application.GetPhonetic(i)
End Function

届け先.csv
高田 佳子
吉田 博文

届け先.csv
高田 佳子,タカダ ヨシコ
吉田 博文,ヨシダ ヒロフミ

No.4563 2017/10/19(Thu) 22:18:26

Re: csvファイルの漢字から半角カタカナに変換したい / sen
こういうのは、動きました。
エクセルを使わないのとかがあれば、是非教えて下さい。

Excel = GETACTIVEOLEOBJ("Excel.Application")
With excel.
 for i = 1 to 64
  .cells(i,2).Value = excel.GetPhonetic(.cells(i,1).Value)
 next
endwith

No.4564 2017/10/19(Thu) 23:50:53

Re: csvファイルの漢字から半角カタカナに変換したい / satocha
漢字を仮名に変換する機能はWindows標準では持っていません。「エクセルを使わない」という条件が付くと、エクセルに代わる何か別の変換手段を用意しなければなりません。
ざっと調べた感じでは、

@ヤフーのWeb API
  https://developer.yahoo.co.jp/webapi/jlp/furigana/v1/furigana.html

Aフリーソフトのkakasi
  http://www.namazu.org/win32/kakasi-2.3.4.zip
  使い方はhttp://language-and-engineering.hatenablog.jp/entry/20150109/KakasiOnWindowsUsageSample#HowToInstallKakasiOnWindows

あたりでしょうか。

そうでなく、単にエクセルのシート上でなく、csvのままで処理したいということなら、
お示しのGetPhonetic メソッドがそのまま使えそう。
https://msdn.microsoft.com/ja-jp/VBA/Excel-VBA/articles/application-getphonetic-method-excel

未確認ですがこんな感じ

function GetPhoneticf(str)
 with CreateOleObj( "Excel.Application" )
  result = .GetPhonetic(str)
 endwith
fend

No.4565 2017/10/20(Fri) 04:00:30

Re: csvファイルの漢字から半角カタカナに変換したい / リキュール
webページの「フリがなツール」を使用すれば可能と思われます。
名前の読み方はいろいろあるので正しく変換されないものもあります。
届け先.csvは変換.UWSと同じフォルダにおいて下さい。

//変換.UWS
IE = CreateOLEObj("InternetExplorer.Application")
IE.Visible = True
IE.Navigate("http://www.webtoolss.com/hiragana.html")
BusyWait(IE)
IESetData(IE,"0","","id=henkant") // TEXT
IESetData(IE,"","ta") // TEXTAREA
IESetData(IE,"1","","id=henkant") // TEXT
fid = FOPEN("届け先.csv",F_READ or F_WRITE)
gyou = FGET(fid, -1) //行数
For i = 1 to gyou
data = FGET( fid, i) //行読取
IESetData(IE,data,"ta") // テキストエリアに漢字入力
IESetData(IE,True,"","id=hiraganani") // (ひらがなに)BUTTON
BusyWait(IE)
ひらがな = IEGETDATA(IE,"ta2") //ひらがな読取
カタカナ = STRCONV(ひらがな,SC_KATAKANA) //ひらがな→カタカナ
半角カナ = STRCONV(カタカナ,SC_HALFWIDTH) //カタカナ→カタカナ
FPUT(fid,半角カナ,i,2)
next
FCLOSE(fid)
IE.Quit() //IE終了

Procedure BusyWait(ie)
 Sleep(0.5) // Wait
 Const TIME_OUT = 90
 tm = Gettime()
 repeat
  Sleep(0.2)
  ifb Gettime() - tm > TIME_OUT
   MsgBox("Time Out:BusyWait")
   ExitExit
  endif
 until (! ie.busy) and (ie.readyState=4)
 Sleep(0.5)
Fend

No.4567 2017/10/20(Fri) 12:34:24

Re: csvファイルの漢字から半角カタカナに変換したい / stuncloud
いろいろ出てきますね!
僕はここを参考にしてpowershell()関数でやってみました、MSIMEの機能っぽいですね
http://www.pine4.net/Memo/Article/Archives/424


fid = fopen("届け先.csv", F_READ)
namelist = fget(fid, F_ALLTEXT)
fclose(fid)

// 読み出しテキスト例:
// 高田 佳子
// 吉田 博文

list = split(namelist, "<#CR>") // 名前の一覧を配列にする
csv = GetNameRubyListCsv(list)

fid = fopen("届け先.csv", F_WRITE)
fput(fid, csv, F_ALLTEXT)
fclose(fid)

// 書き出しテキスト例:
// 高田 佳子,タカダ ヨシコ
// 吉田 博文,ヨシダ ヒロフミ

function GetNameRubyListCsv(list)
 cmd = replace(pscmd, "%KANJILIST%", "'" + join(list, "','") + "'")
 hiragana = split(trim(powershell(cmd)), "<#CR>")
 for i = 0 to length(list) - 1
  list[i] = list[i] + "," + strconv(hiragana[i], SC_KATAKANA or SC_HALFWIDTH)
 next
 result = join(list, "<#CR>")
fend

textblock pscmd
Add-Type -TypeDefinition @'
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

namespace MsIme
{
public class IFELang
{
public static string GetPhonetic(string str)
{
IFELanguage ifelang = Activator.CreateInstance(Type.GetTypeFromProgID("MSIME.Japan")) as IFELanguage;
int hr = ifelang.Open();
if (hr != 0)
{
throw Marshal.GetExceptionForHR(hr);
}
string yomigana;
hr = ifelang.GetPhonetic(str, 1, -1, out yomigana);
if (hr != 0)
{
throw Marshal.GetExceptionForHR(hr);
}
ifelang.Close();
return yomigana;
}
}
// IFELanguage2 Interface ID
//[Guid("21164102-C24A-11d1-851A-00C04FCC6B14")]
[ComImport]
[Guid("019F7152-E6DB-11d0-83C3-00C04FDDB82E")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IFELanguage
{
int Open();
int Close();
int GetJMorphResult(uint dwRequest, uint dwCMode, int cwchInput, [MarshalAs(UnmanagedType.LPWStr)] string pwchInput, IntPtr pfCInfo, out object ppResult);
int GetConversionModeCaps(ref uint pdwCaps);
int GetPhonetic([MarshalAs(UnmanagedType.BStr)] string @string, int start, int length, [MarshalAs(UnmanagedType.BStr)] out string result);
int GetConversion([MarshalAs(UnmanagedType.BStr)] string @string, int start, int length, [MarshalAs(UnmanagedType.BStr)] out string result);
}
}
'@

echo %KANJILIST% | % {
[MsIme.IFELang]::GetPhonetic($_)
}
endtextblock

No.4568 2017/10/20(Fri) 14:05:05

Re: csvファイルの漢字から半角カタカナに変換したい / sen
みなさん、ありがとうございます。
圧倒されます。
ゆっくり、腰をすえてやってみます。

No.4570 2017/10/20(Fri) 20:40:35

Re: csvファイルの漢字から半角カタカナに変換したい / satocha
stuncloudさん
IMEの逆変換とは気付きませんでした。勉強になりました。

先の投稿の「漢字を仮名に変換する機能はWindows標準では持っていません」の記述を撤回します。

No.4572 2017/10/21(Sat) 03:13:33
CHKIMGで発生したエラーについて / automaton2017
いつもお世話になっております。
PC操作の自動化にUWSCを利用させて頂いているものです。
最近、CHKIMG関数を組み込んだスクリプトを実行中に、下記のようなエラーMSGが表示されました。

「CHKIMG: 画像取得、またはリソース確保の失敗 中断しますか?」

このエラーMSGについて、下記の2点についてご教授頂けませんでしょうか。

1. MSGにある"画像取得の失敗 またはリソースの確保の失敗"とは、引数に設定している比較用の画像ではなく、CHKIMG関数が画面の画像を取得する処理に失敗しているという認識であっているでしょうか。


2. (ここに記載した情報だけで特定はできないと思われるので、一般的な話として)このエラーMSGが発生する原因としては、どういったものが考えられるでしょうか。
※メモリが不足している、PCの処理負荷が高いなどでしょうか。



※CHKIMGに同じ処理を何百回と実行している中で、一度だけ発生して、それ以降は今のところ再発していません。
※CHKIMG関数は、画像ファイル名のみを引数に指定して使用しておりました。

No.4571 2017/10/20(Fri) 21:46:47
システムのシャットダウン(略 / Y.Sum
FAQに下記回答があるのですが、回答のようなプログラムに変更しても、
GETACTIVEOLEOBJのところで同様のエラーが出てしまいます。プログラムとしては、

1.createoleobjでIEを作成し一定の処理を行う
2.IEを閉じ、ループ終了する
3.1から繰り返す

といったものです。
何が原因かが全くつかめず、同様のケースはそもそもあるのか、環境依存なのか、
お分かりの方いらっしゃいますでしょうか。

--以下FAQ引用--

IE終了後にまた CREATEOLEOBJ関数にて IEを起動するとエラー("システムのシャットダウンは既にスケジュールされています")が出る  #N46
  通常起動の場合にはエラーが出ませんので、以下のようにすると避ける事ができます。
  try
   IE = CREATEOLEOBJ("InternetExplorer.Application")
  except
   EXEC("C:\Program Files\Internet Explorer\iexplore.exe")
   IE = GETACTIVEOLEOBJ("InternetExplorer.Application")
  endTry

No.4553 2017/10/18(Wed) 17:32:09

Re: システムのシャットダウン(略 / Y.Sum
追記

エラー内容を記載わすれておりました。

COM_Error
●●行目: IE = GETACTIVEOLEOBJ("InternetExplorer.Application")

No.4554 2017/10/18(Wed) 17:38:47

Re: システムのシャットダウン(略 / Y.Sum
すみません。自己解決といいますか、回避方法が思いつきました。


WHILE TRUE
try
IE_main = CREATEOLEOBJ("InternetExplorer.Application")
break
except
SLEEP(1)
endTry
WEND


ただ、根本解決にはなってないので、もし、こうすれば大丈夫といった方法があればご教示下さいますとありがたいです。。。

No.4555 2017/10/18(Wed) 17:47:26

Re: システムのシャットダウン(略 / しろまさ
それで良いと思いますよ。
IEオブジェクト開放中にGetしようとすると出るエラーなので、他の対応は(私には)思いつきませんね。

ほぼ同コードを以前に書きました^^
IEのオブジェクトを取得する関数。
http://siromasa.html.xdomain.jp/uwsc/u_term/InternetExplorerApplication.html

※4562返信(下げ嗜好のため追記)
ありがとうございます。励みになります^^ 最近?数年?LSJ釣が忙しくて更新サボりがちですが、
業務中に使えそうな基礎知識を見つけたらまたアップしますので、たまに見に来てください^^

No.4556 2017/10/18(Wed) 18:15:33

Re: システムのシャットダウン(略 / Y.Sum
>しろまささん
コメントありがとうございます!
いつもHP拝見させていただいてます!
しろまささんがOKと仰るのであれば、自信がもてました!

No.4562 2017/10/19(Thu) 15:35:48
callでユーザー関数読込COMMON.のTHREADで呼び出す方法 / さやか
共通化.uwsという多数のprocedureを入力されているファイルがあります。
callで共通化.uwsを呼び出してCOMMON.でTHREADで呼び出したいのですがどうすればいいでしょうか?
COMMON.THREAD 奇数(リンク一覧,Pattern)だとうまくできません。

call C:\Users\aruke\Desktop\共通化.uws

Dim res1 = COMMON.THREAD 奇数(リンク一覧,Pattern)

No.4550 2017/10/18(Wed) 10:32:35

Re: callでユーザー関数読込COMMON.のTHREADで呼び出す方法 / stuncloud
COMMON というのはModule(またはClass)のことですよね
それで 奇数() がその中の関数ですかね?
その場合のthread呼び出しは

thread COMMON.奇数(リンク一覧, Pattern)

となります
またthreadだと戻り値を受けることはできず、var変数を定義しても値を返しません
なので

module COMMON
 public 奇数result = EMPTY

 procedure 奇数(foo, bar)
  //処理
  奇数result = 結果
 fend
endmodule

のように定義して COMMON.奇数result を介して結果の値を受け取る感じになります
ただし COMMON.奇数() の処理が 奇数result に値を代入するところまで進んでいないと COMMON.奇数result はEMPTYしか返さないので、そこはループで待機するなりするなどの工夫をしてください

No.4551 2017/10/18(Wed) 12:30:50

Re: callでユーザー関数読込COMMON.のTHREADで呼び出す方法 / さやか
stuncloud様、返信ありがとうございます。
thread COMMON.奇数(リンク一覧, Pattern)でスレッドはうまくできました。
最終的にしたい処理がCOMMONで呼び出した配列を使用したいのですがうまくできません。

1であれば結果がaと表示される。
2だとha1aaが定義されていませんと表示される
2ケースで結果がaと表示させる方法ないでしょうか?

1、
call C:\Users\aruke\Desktop\_共通化.uws
THREAD tete()
print ha1aa[0]

procedure tete()
public ha1aa[2]="a","b","c"
Fend


2、
call C:\Users\aruke\Desktop\ショットカット構文一覧\00_共通化.uws
THREAD COMMON.tete()
print ha1aa[0]


C:\Users\aruke\Desktop\ショットカット構文一覧\00_共通化.uwsには下記が入力されている。

CLASS COMMON

procedure tete()
public ha1aa[2]="a","b","c"
Fend

endCLASS

No.4552 2017/10/18(Wed) 14:50:12

Re: callでユーザー関数読込COMMON.のTHREADで呼び出す方法 / stuncloud
print COMMON.ha1aa[0]

ちなみに
> public ha1aa[2]="a","b","c"
の部分はpublicが付いてるのでスクリプト実行のわりと最初の方で宣言されます
COMMON.tete()を呼ぶ必要すらないです

print COMMON.ha1aa[0]

CLASS COMMON
 public ha1aa[2]="a","b","c"
endCLASS

つまりこう書くのとほぼ同じです
1のケースも同様にtete()を呼ぶ必要がないです

なんかいろいろと筋が悪そうですね
そもそもthreadが必要かどうかもあやしい
何がしたいのかわからないのでなんとも言えませんが…

あえてこの方向でやるとしたら

print length(COMMON.ha1aa) // この時点で配列の長さ0
THREAD COMMON.tete()

repeat
 sleep(0.1)
until length(COMMON.ha1aa) > 0

print COMMON.ha1aa[0] // threadで呼んだCOMMON.tete()が配列を代入する処理が終わったらprintする

CLASS COMMON
 public ha1aa = safearray(0, -1) // 長さ0の配列(SafeArray)を宣言しておく

 procedure tete()
  sleep(1)
  ha1aa = split("a b c") // 関数内で変数に配列(SafeArray)を代入
 fend
endCLASS

こんな感じになると思います
UWSCの配列変数は後から任意のサイズと値を代入するのは骨が折れるので扱いの楽なSafeArrayを使っています
COMMON.tete()の処理が終わって初めてCOMMON.ha1aaから値を読み出せます

# 僕ならこんな実装にはしませんが

No.4557 2017/10/18(Wed) 18:36:35

Re: callでユーザー関数読込COMMON.のTHREADで呼び出す方法 / さやか
print COMMON.ha1aa[0]で処理できるとは考えもつきませんでした。

やっている処理としては、リンク一覧にあるリンクにアクセス、正規表現でデータ抽出し、それを偶数番号のリンクはaという配列に奇数番号のリンクはbという配列にいれて、それをa配列とb配列を統合しファイルに出力するという処理です。

00_共通化.uwsにあるpublic ha2[5]とpublic ha1a[5]の[]の中の5を、正規表現でデータ抽出が6回あるから5としているのですが、この数字をいれずにpublic ha2[]のような任意の形でするとエラーになります。

この数字はやはりいれて置く必要があるのでしょうか?

下記がスクリプトです。
call C:\Users\aruke\Desktop\ショットカット構文一覧\00_共通化.uws

出力ファイル="C:\Users\aruke\Desktop\adj.txt"
リンク一覧="C:\Users\aruke\Desktop\リンク一覧.txt"
Pattern="<span class=<#DBL>number<#DBL>"

textblock area1
北海道:東北:関東:東海:北信越:関西:
endtextblock

Public regvb=CREATEOLEOBJ("VBScript.RegExp")

THREAD COMMON.偶数取得(出力ファイル,リンク一覧,area1,Pattern)

SLEEP(2.0)

COMMON.奇数取得(リンク一覧,area1,Pattern)

fid=fopen(出力ファイル, F_WRITE)
for i = 0 to length(COMMON.ha2)-1
if i = 0 then
fput(fid,COMMON.ha1a[i]+"<#CR>"+COMMON.ha2[i],-2)
else
fput(fid,COMMON.ha1a[i]+"<#CR>"+COMMON.ha2[i])
endif
next
fclose(fid)

Function regvb_Execute(str, Pattern, IgnoreCase=TRUE, Global=TRUE)
regvb.IgnoreCase=IgnoreCase
regvb.Global=Global
regvb.Pattern=Pattern
Matches=regvb.Execute(str)
Result=Matches
Fend
---------------------
C:\Users\aruke\Desktop\ショットカット構文一覧\00_共通化.uwsには下記のスクリプト。

CLASS COMMON
procedure 奇数取得(リンク一覧,area1,Pattern)
call C:\Users\aruke\Desktop\ショットカット構文一覧\00_共通化.uws

//配列カウント
hi=0
Dim res = COMMON.test_hairetu(リンク一覧)
public ha2[5]

Dim hai_area1 =SPLIT(area1,":")


FOR i = 1 TO length(res) -1 STEP 2 //1 3 5
TRY
   IE1 = CREATEOLEOBJ("InternetExplorer.Application")
  EXCEPT
   EXEC("C:\Program Files\Internet Explorer\iexplore.exe")
   IE1 = GETACTIVEOLEOBJ("InternetExplorer.Application")
  ENDTRY
IE1.visible = true

IE1.navigate(res[i])

SLEEP(0.5)
ClkItem(GetID("Windows", "#32770", 1), "OK")
ClkItem(GetID("Windows", "#32770", 1), "このページから移動")
ClkItem(GetID("Windows", "#32770", 1), "プログラムを終了します")
ClkItem(GetID("Windows", "#32770", 1), "プログラムを再起動します")
ClkItem(GetID("ページからのメッセージ", "#32770", 1), "OK")
ClkItem(GetID("ページからのメッセージ", "#32770", 1), "このページから移動")
ClkItem(GetID("ページからのメッセージ", "#32770", 1), "プログラムを終了します")
ClkItem(GetID("ページからのメッセージ", "#32770", 1), "プログラムを再起動します")
CONST TIME_OUT = 60
tm = Gettime()
REPEAT
SLEEP(1)
ifb Gettime() - tm > TIME_OUT
break
endif
UNTIL (! IE1.BUSY) AND (IE1.READYSTATE=4)
SLEEP(0.5)
id = hndtoid(IE1.hwnd)
SLEEP(0.5)

文字列全体=IE1.document.body.innerhtml
Public regvb=CREATEOLEOBJ("VBScript.RegExp")

Matches=regvb_Execute(文字列全体, Pattern)

ha2[hi]=hai_area1[i]+":"+val(Matches.Item(0).SubMatches(0))
IE1.quit
hi=hi+1
NEXT     
fend

procedure 偶数取得(出力ファイル,リンク一覧,area1,Pattern)
call C:\Users\aruke\Desktop\ショットカット構文一覧\00_共通化.uws

Dim hai = COMMON.test_hairetu(リンク一覧)
public ha1a[5]

//配列カウント
hi=0

Dim hai_area =SPLIT(area1,":")

FOR y = 0 TO length(hai)-1 STEP 2 //0 2 4

TRY
   IE = CREATEOLEOBJ("InternetExplorer.Application")
  EXCEPT
   EXEC("C:\Program Files\Internet Explorer\iexplore.exe")
   IE = GETACTIVEOLEOBJ("InternetExplorer.Application")
  ENDTRY
IE.visible = true
IE.navigate(hai[y])

SLEEP(0.5)
ClkItem(GetID("Windows", "#32770", 1), "OK")
ClkItem(GetID("Windows", "#32770", 1), "このページから移動")
ClkItem(GetID("Windows", "#32770", 1), "プログラムを終了します")
ClkItem(GetID("Windows", "#32770", 1), "プログラムを再起動します")
ClkItem(GetID("ページからのメッセージ", "#32770", 1), "OK")
ClkItem(GetID("ページからのメッセージ", "#32770", 1), "このページから移動")
ClkItem(GetID("ページからのメッセージ", "#32770", 1), "プログラムを終了します")
ClkItem(GetID("ページからのメッセージ", "#32770", 1), "プログラムを再起動します")
CONST TIME_OUT = 60
tm = Gettime()
REPEAT
SLEEP(1)
ifb Gettime() - tm > TIME_OUT
break
endif
UNTIL (! IE.BUSY) AND (IE.READYSTATE=4)
SLEEP(0.5)
id = hndtoid(IE.hwnd)
SLEEP(0.5)

文字列全体=IE.document.body.innerhtml

Public regvb=CREATEOLEOBJ("VBScript.RegExp")

file1 = FOPEN(出力ファイル, F_READ or F_WRITE8 or F_NOCR)

Matches=regvb_Execute(文字列全体, Pattern)

ha1a[hi]=hai_area[y]+":"+Matches.Item(0).SubMatches(0)
IE.quit
hi=hi+1
next
fend

procedure 奇数取得(リンク一覧,area1,Pattern)
call C:\Users\aruke\Desktop\ショットカット構文一覧\00_共通化.uws

//配列カウント
hi=0
Dim res = COMMON.test_hairetu(リンク一覧)
public ha2[5]

Dim hai_area1 =SPLIT(area1,":")


FOR i = 1 TO length(res) -1 STEP 2 //1 3 5
TRY
   IE1 = CREATEOLEOBJ("InternetExplorer.Application")
  EXCEPT
   EXEC("C:\Program Files\Internet Explorer\iexplore.exe")
   IE1 = GETACTIVEOLEOBJ("InternetExplorer.Application")
  ENDTRY
IE1.visible = true

IE1.navigate(res[i])

SLEEP(0.5)
ClkItem(GetID("Windows", "#32770", 1), "OK")
ClkItem(GetID("Windows", "#32770", 1), "このページから移動")
ClkItem(GetID("Windows", "#32770", 1), "プログラムを終了します")
ClkItem(GetID("Windows", "#32770", 1), "プログラムを再起動します")
ClkItem(GetID("ページからのメッセージ", "#32770", 1), "OK")
ClkItem(GetID("ページからのメッセージ", "#32770", 1), "このページから移動")
ClkItem(GetID("ページからのメッセージ", "#32770", 1), "プログラムを終了します")
ClkItem(GetID("ページからのメッセージ", "#32770", 1), "プログラムを再起動します")
CONST TIME_OUT = 60
tm = Gettime()
REPEAT
SLEEP(1)
ifb Gettime() - tm > TIME_OUT
break
endif
UNTIL (! IE1.BUSY) AND (IE1.READYSTATE=4)
SLEEP(0.5)
id = hndtoid(IE1.hwnd)
SLEEP(0.5)

文字列全体=IE1.document.body.innerhtml
Public regvb=CREATEOLEOBJ("VBScript.RegExp")

Matches=regvb_Execute(文字列全体, Pattern)

ha2[hi]=hai_area1[i]+":"+val(Matches.Item(0).SubMatches(0))
IE1.quit
hi=hi+1
NEXT     
fend

procedure 偶数取得(出力ファイル,リンク一覧,area1,Pattern)
call C:\Users\aruke\Desktop\ショットカット構文一覧\00_共通化.uws

Dim hai = COMMON.test_hairetu(リンク一覧)
public ha1a[5]

//配列カウント
hi=0

Dim hai_area =SPLIT(area1,":")

FOR y = 0 TO length(hai)-1 STEP 2 //0 2 4

TRY
   IE = CREATEOLEOBJ("InternetExplorer.Application")
  EXCEPT
   EXEC("C:\Program Files\Internet Explorer\iexplore.exe")
   IE = GETACTIVEOLEOBJ("InternetExplorer.Application")
  ENDTRY
IE.visible = true
IE.navigate(hai[y])

SLEEP(0.5)
ClkItem(GetID("Windows", "#32770", 1), "OK")
ClkItem(GetID("Windows", "#32770", 1), "このページから移動")
ClkItem(GetID("Windows", "#32770", 1), "プログラムを終了します")
ClkItem(GetID("Windows", "#32770", 1), "プログラムを再起動します")
ClkItem(GetID("ページからのメッセージ", "#32770", 1), "OK")
ClkItem(GetID("ページからのメッセージ", "#32770", 1), "このページから移動")
ClkItem(GetID("ページからのメッセージ", "#32770", 1), "プログラムを終了します")
ClkItem(GetID("ページからのメッセージ", "#32770", 1), "プログラムを再起動します")
CONST TIME_OUT = 60
tm = Gettime()
REPEAT
SLEEP(1)
ifb Gettime() - tm > TIME_OUT
break
endif
UNTIL (! IE.BUSY) AND (IE.READYSTATE=4)
SLEEP(0.5)
id = hndtoid(IE.hwnd)
SLEEP(0.5)

文字列全体=IE.document.body.innerhtml

Public regvb=CREATEOLEOBJ("VBScript.RegExp")

file1 = FOPEN(出力ファイル, F_READ or F_WRITE8 or F_NOCR)

Matches=regvb_Execute(文字列全体, Pattern)

ha1a[hi]=hai_area[y]+":"+Matches.Item(0).SubMatches(0)
IE.quit
hi=hi+1
next
fend

endCLASS

No.4559 2017/10/18(Wed) 21:59:37

Re: callでユーザー関数読込COMMON.のTHREADで呼び出す方法 / stuncloud
話題が変わっています
threadについては解決していると思いますので、ここらで打ち切ってください

それと、質問に付随してコードを書く場合は質問の内容に沿ったものだけにしてください
質問内容に関係のない部分も含めたコードを長々と書かれても困ります
正直これを読み解くことに労力を割きたくありません (なので読んでません)

あとはちょっとだけヒントです
配列変数はひとまず適当なサイズで宣言しておいて、あとからサイズを変更できます
これを踏まえた上で希望の実装ができない場合は改めて質問スレッドを建ててください

public 配列[-1]
print length(配列) // この時点では長さ0

配列にデータを格納()

for data in 配列
 print data
next

procedure 配列にデータを格納()
 配列サイズ = 配列に入るデータ数()
 // 配列サイズを変更する、配列サイズではなく添字の最大値を指定することに注意
 resize(配列, 配列サイズ - 1)
 for i = 0 to 配列サイズ - 1
  配列[i] = 配列に入るデータ(i)
 next
fend

No.4560 2017/10/19(Thu) 10:09:21

Re: callでユーザー関数読込COMMON.のTHREADで呼び出す方法 / さやか
stuncloud様、大変失礼しました。教えて頂きましたコードで考えてみます。
ありがとうございました。

No.4561 2017/10/19(Thu) 11:32:02


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


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