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

ExcelをUWSCで起動するとアカウントのエラーが出る / ftuj5
Excelを手動で起動すると問題ないのですが、UWSCで起動するとアカウントのエラーが出ます。アカウントのエラーが出ても特別Excelの操作には問題はないのですが気になります。

アカウントのエラーが出た後に手作業でアカウントの修復を実行しても、なぜか修復できません。一度ブックを閉じて、Excelを手動で起動し直すと、エラーが出なくなります。

マイクロソフトの公式サイトで質問しようかとも思いましたが、UWSCに関わることなのでこちらで質問しました。UWSCでExcelを起動してもアカウントのエラーが出なくなる方法があれば、教えていただければ幸いです。よろしくお願いします。

No.5625 2018/08/15(Wed) 09:44:36

Re: ExcelをUWSCで起動するとアカウントのエラーが出る / ftuj5
エラーが出るようになったのは2週間前くらいからで、以前は問題なく動作していました。Excelの更新が関係しているのでしょうか?ちなみにExcelのバージョンは2016です。
No.5626 2018/08/15(Wed) 09:47:13

Re: ExcelをUWSCで起動するとアカウントのエラーが出る / Rayna
>>5626 ftuj5 さん

Windows7 x64、Excel 2016、UWSC 5.3.0.2 (Pro[exe|uws] / Free[uws])にて
以下のコードを検証したところ、Microsoftアカウントのエラーは確認できませんでした

2週間ほど前にExcelの更新をしたのならそれが原因かもですね

私の環境では2週間以上前からExcel2016を使っていて、Windows Updateもしていますが
Microsoftアカウントのエラーは出たことがないので、環境の問題ですかね...
---
Option Explicit
Dim Path_Excel = "C:\Program Files (x86)\Microsoft Office\root\Office16\EXCEL.EXE"
Dim Id_Excel, Obj_Excel
Dim WaitSec = 10

// DosCmd
DosCmd(Path_Excel, TRUE)
Id_Excel = GetId(" - Excel", "XLMAIN", -1)
Progress(WaitSec)
CtrlWin(Id_Excel, CLOSE)

// Exec
Exec(Path_Excel)
Id_Excel = GetId(" - Excel", "XLMAIN", -1)
Progress(WaitSec)
CtrlWin(Id_Excel, CLOSE)

// CreateOleObj
Obj_Excel = CreateOleObj("Excel.Application")
Obj_Excel.Visible = TRUE
Progress(WaitSec)
Obj_Excel.Quit
Obj_Excel = NOTHING

// XLOpen
IfB GET_UWSC_PRO Then
 Obj_Excel = XLOpen(EMPTY, XL_NEW)
 Progress(WaitSec)
 XLClose(Obj_Excel, TRUE)
 Obj_Excel = NOTHING
EndIf

Procedure Progress(Sec)
 SlctBox(SLCT_BTN, Sec, "Excel 待機中([X] to Skip)")
FEnd

No.5627 2018/08/16(Thu) 12:58:42

Re: ExcelをUWSCで起動するとアカウントのエラーが出る / ftuj5
Raynaさん、回答ありがとうございました。

私が作ったのは、デスクトップ上にBook1.xlsxがあるとして次のようなコードです。↓
objWshShell = CREATEOLEOBJ("WScript.Shell")
path = objWshShell.SpecialFolders("Desktop")
EXCEL = CREATEOLEOBJ("Excel.Application")
EXCEL.visible = True
file = path + "\Book1.xlsx"
EXCEL.workbooks.open(file)
ex = GETID("Book1.xlsx", "XLMAIN", -1)
CTRLWIN(ex, MAX)

アカウントのエラーが出る時と出ない時があります。パソコンの起動直後だと出やすいような気がします。

No.5632 2018/08/17(Fri) 19:29:37

Re: ExcelをUWSCで起動するとアカウントのエラーが出る / Rayna
>>5632 ftuj5 さん

再起動後に私のと ftuj5 さんのソースを同環境で実行してみましたが、
エラーは確認できませんでした。お力になれず残念です

No.5635 2018/08/18(Sat) 11:49:12

Re: ExcelをUWSCで起動するとアカウントのエラーが出る / ftuj5
Raynaさん、ありがとうございました。

エラーが出ても、特別エクセルの操作には問題がないので気にしないことにします。お手数をおかけしました。

No.5636 2018/08/18(Sat) 17:22:33
fopen関数で文字列を正常に取得できない / ライチ
--------------test.uws--------------
dim arr[] = _
"foo",_
"bar",_
"baz"
------------------------------------

配列変数を定義するとき、見やすいように上記のような書き方をします。
これを fopen関数で開くと、最後の要素が正常に取得できません。

// ファイルを開く
fid = fopen(test.uws)

// 全ての行を出力する
for i = 1 to fget(fid, -1)
 print fget(fid, i)
next

// 出力結果
//=> dim arr[] = _
//=> "foo",_
//=> "bar",_
//=> baz ※ダブルクォートが消えている。

となります。
なので、スクリプトからコメント部のみ削除するスクリプトを書いたのですが、fopen関数で読み込む段階でこのような現象が起こるので意図した結果を得られません。

そこで、

--------------test.uws--------------
dim arr[] = _
"foo",_
"bar",_
"baz" 
------------------------------------

としたら、

// 出力結果
//=> dim arr[] = _
//=> "foo",_
//=> "bar",_
//=> "baz" ※ダブルクォートがある。

というように正常に読み込めました。
一見わかりませんが、 "baz" の後ろに全角スペースが入っています。

これは技術的に仕方のないものなのでしょうか。
バグなのでしょうか。
自己解決したので特に問題とは思っていないのですが。

No.5628 2018/08/17(Fri) 16:39:45

Re: fopen関数で文字列を正常に取得できない / stuncloud
おそらくfget()のcsvとして読み込む機能が悪さをしてるんではないかと思います
試しに
>  print fget(fid, i)
の部分を
 print fget(fid, i, 1)
とすると出力が

dim arr[] = _
foo
bar
baz

になるので、csvのカラムが " でくくられていると " を外す仕様があるのでしょう
それがカラム番号未指定だとしてもその行が単一カラムっぽかったら " を外しているものと思われます
ちょっと仕様バグっぽいですね

全角スペースを後ろに置いた場合は " で括られていない状態になるので回避できたのでしょう
全角スペースでなくとも例えば
"baz" //
としてやっても問題ないです (最初の " の前か最後の " の後にホワイトスペース以外の文字があれば良い)

また、そもそもの読み取り方法を変更することでも回避できます

for line in split(fget(fid, F_ALLTEXT), "<#CR>")
 print line
next

No.5629 2018/08/17(Fri) 17:02:06

Re: fopen関数で文字列を正常に取得できない / しき
fget は元々csvのカンマ区切り列を考慮したものです。
私は一行をそのまま取得したい場合は、fget(fid, i, 0, true) としています

//ヘルプより
戻値 = FGET( ファイルID, 行, [列, ダブルコーテイション] )
 ダブルコーテイション:
   FALSE: 両端のダブルコーテイションは削除する (デフォルト)
   TRUE: 削除しない
   2:   CSV処理にて2つ連続ダブルコーティションを1つに (Excel同等処理)

No.5630 2018/08/17(Fri) 17:32:20

Re: fopen関数で文字列を正常に取得できない / ライチ
返信を読んで解決しました。ありがとうございます。

stuncloud 様
>おそらくfget()のcsvとして読み込む機能が悪さをしてるんではないかと思います
これはほぼ間違いないと思います。
なので、デフォルトのままではなく、fgetの引数を全て指定することによって解決できました。

全てのテキストとして読み込んで split関数で改行区切りということもやってみたんですが、
文字列の中に "<#cr>" みたいのがあって、エラーが出て断念しました。
1日半くらい悩んでからした質問だったのですが、ヘルプに答えがあったとは。。
前回に引き続きありがとうございます。

しき 様
ズバリ解決しました。ありがとうございます。
fgetの最後の引数の存在をすっかり忘れていました。
一度見てはいたのですが今まで使わなかったので盲点になっていたようです。
列を指定しなければ1行をそのまま読めると考えていました。
初心に帰ってヘルプに目を通すべきでした。
今も初心者ですが。

ありがとうございます。

No.5631 2018/08/17(Fri) 19:14:50

Re: fopen関数で文字列を正常に取得できない / ライチ
ちなみに試行錯誤中に特殊文字で気づいたことがあったので、もしかしたら参考になる人がいるかもしれないので、報告も兼ねて書き記しておきます。

--------------test.uws--------------
a = "<#cr>" // 小文字
a = "<#CR>" // 大文字
b = "<#tab>"
b = "<#TAB>"
------------------------------------

// ファイルを開く
fid = fopen(test.uws)

// 全ての行を出力する
for i = 1 to fget(fid, -1)
 print fget(fid, i) // この件の場合、これ以降の引数の指定は関係ないようです。
next

すると出力結果が、

a = "<#cr>" // 小文字
a = "
" // 大文字
b = "<#tab>"
b = " "

となります。
大文字の方は、特殊文字ではなく、改行は改行していて、タブはタブになっています。
これは正式な仕様かもしれません。
なのでスクリプトファイルの内容をスクリプトでいじくる時は特殊文字は小文字で書いた方が良いようです。
おじゃましました。

No.5633 2018/08/17(Fri) 20:02:41

Re: fopen関数で文字列を正常に取得できない / miles
どうやら、特殊文字(大文字、小文字)の扱いは、ケースにより異なるようです。

1.ファイル読込みやTEXTBLOCK内では、大文字の特殊文字(<#CR><#DBL><#TAB>)のみ変換されます。
 但し、<OPTION指定>のSPECIALCHARで、実行時に特殊文字の変換しないにできます。

2.プログラム本文では、<OPTION SPECIALCHAR>に関わりなく、大文字、小文字とも特殊文字は変換されます。
 (<#CR><#DBL><#TAB><#cr><#dbl><#tab>...)

No.5634 2018/08/18(Sat) 10:41:09
COMオブジェクトがpoint構造体を返してくる / かね
COMオブジェクトがVAR_TYPE=$0024の構造体を返してきてきます。
Point構造体(int32,int32)を返してくるはずなのですが、取り出す方法が分かりませんでした。
ご教示よろしくお願いします。

No.5615 2018/08/09(Thu) 03:19:58

Re: COMオブジェクトがpoint構造体を返してくる / しゅん
再現方法が載ってないと、回答しづらい質問ですね。
独自COMだとどうしようもないですが、標準的な、もしくはせめて評価フリーなもので、再現する方法はありますでしょうか。

No.5616 2018/08/10(Fri) 08:51:16

Re: COMオブジェクトがpoint構造体を返してくる / かね
VAR_TYPE=$0024 (36)
の誤りでした。以下のリファレンスにはユーザ定義となっています。
https://msdn.microsoft.com/ja-jp/vba/language-reference-vba/articles/vartype-function
また、point構造体(int32,int32)でした。誤りだらけの質問で申し訳ないです。m(_ _)m

Chromeブラウザをインストールした環境にて。
Selenium VBAをインストールし、インストールフォルダのchromedriver.exeを最新版に変更します。
https://bintray.com/florentbr/generic/selenium-vba/view/files#files/
http://chromedriver.chromium.org/downloads

参考にしたサイト UWSC + SeleniumVBAでロボットを作ろう - Qiita
https://qiita.com/hirohiro77/items/a317669e6c1a4dafb51a
↑最新のChromeで実行するとエラーになるのでChrome Driverを最新版に差し替えます。

---
driver = createoleobj("SeleniumWrapper.WebDriver")
driver.start("chrome") // chromeを呼ぶ
driver.setImplicitWait(10000)
driver.get("https://www.google.co.jp/webhp?hl=ja&tbs=qdr:d,sbd:1")
element = driver.findElementById("lst-ib")
point=element.Location
PRINT VARTYPE(point)
//PRINT point.x //エラー
//a=VARTYPE(point,VAR_ASTR) //エラー
driver.Stop()
---
取得したpoint変数はどのようにしても使えないものなのでしょうか?

No.5617 2018/08/11(Sat) 04:23:27

Re: COMオブジェクトがpoint構造体を返してくる / しゅん
// Selenium VBAですか、、、。
// たしかに、X,Yが定義されているのに参照できませんね。(PowerShellだと確認できます)
// Int32とのことなので、無理やり取り出すなら、以下のような感じです。

driver = createoleobj("SeleniumWrapper.WebDriver")
driver.start("chrome") // chromeを呼ぶ
driver.setImplicitWait(10000)
driver.get("https://www.google.co.jp/webhp?hl=ja&tbs=qdr:d,sbd:1")
element = driver.findElementById("lst-ib")
point=element.Location
PRINT VARTYPE(point)
//PRINT point.X
DEF_DLL RtlMoveMemory(var DWORD[], SafeArray, DWORD): kernel32
DIM p[1]
RtlMoveMemory(p, point, 4 * 2)
PRINT p[0] + ", " + p[1]
driver.Stop()

PRINT "PowerShellなら"
PRINT POWERSHELL(_script)

TEXTBLOCK _script
$driver = New-Object -Com SeleniumWrapper.WebDriver
$driver.start("chrome") # chromeを呼ぶ
$driver.setImplicitWait(10000)
$driver.get("https://www.google.co.jp/webhp?hl=ja&tbs=qdr:d,sbd:1")
$element = $driver.findElementById("lst-ib")
$point = $element.Location
Write-Host $point.X, $point.Y
$driver.Stop()
ENDTEXTBLOCK


// PowerShellならTEXTBLOCKの中身を入力すれば使えますよ!
// $pointを取得したところで、「$point | gm」と入力すると、X,Yのプロパティがあるのがわかります。

No.5619 2018/08/11(Sat) 13:35:00

Re: COMオブジェクトがpoint構造体を返してくる / かね
しゅん様

ご教示いただき、有難うございます。
DEF_DLLを使う方法で問題が解決できました。
(あるサイトにてJavascriptによって変化するボタンの位置を把握したかったのです。)
POWERSHELLを使い方法ですと、対話形式で進めるのが困難になってしまいますが、
丁寧にコードまで示していただき大変勉強になりました。

重ね重ね有難うございます。m(_ _)m

No.5621 2018/08/13(Mon) 23:39:31

Re: COMオブジェクトがpoint構造体を返してくる / しゅん
PowerShellを使えば、UWSCのスクリプト組むにも便利ですよ、とか、いっそのことUWSCやめてPowerShellのスクリプトにしてはどうでしょう、という提案だったりもしますが、、、ま、いっか。
さらに言うなら、更新のないSelenium VBAやめて、Selenium C#使えば、という話でも。

DEF_DLL、Int32ならDWORDじゃなかったですね。まいっか。
SafeArrayじゃない方がよかった、、、かも。

No.5624 2018/08/14(Tue) 21:32:46
UWSCが消えてしまう / see
お世話になります。
あるサイトの文字を取得しようとすると、一部の場所の文字の時だけ、UWSCが、エラーであったり、STOPするのでなくて、UWSC自体を消されてしまいます。
このような現象は、どう解釈すればいいのでしょうか。
また、このような経験をお持ちの方がいらしたら、ご意見を伺いたいです。

No.5620 2018/08/13(Mon) 19:38:43

Re: UWSCが消えてしまう / 森
ぼくにはそのような経験はありませんが、「本当なのか?」と興味津々ですので、
再現できるスクリプトを提示してくれれば、危険なサイトでない限り確認に協力しますよ。

No.5622 2018/08/14(Tue) 08:12:38

Re: UWSCが消えてしまう / see
危険なサイトでないですし、スクリプトは特別なものではありませんが、森さんでも経験がないとなると、エレメントの動的変化に、PCが追いついていないか、セキュリティソフトで消されているのかと思います。
貴重なご意見ありがとうございました。

No.5623 2018/08/14(Tue) 16:08:42
閉鎖? / Koma
久しぶりに公式見に来たら閉鎖されてますね。
最近のRPAブームで特許侵害だとか言って、大手から圧力でも受けたのでしょうか?
ずいぶん昔から大変お世話になっているので心配です。

No.5611 2018/08/05(Sun) 18:38:08

Re: 閉鎖? / トンボ
大分前からHPの閲覧可否が時々入れ替わり、UWSCバージョンアップが停滞気味といった兆候があって不安を感じていましたが、とうとう恒久的な閲覧不可になりました。今の所、原因は不明です。
https://wiki3.jp/CSWU/page/9 // UWSCの時系列です

No.5618 2018/08/11(Sat) 11:33:10
Chrome系でスライダーの移動、現在地の取得をしたい / pon
やりたいこと
スクロールバーが所定の位置にない場合は移動させる、すでに移動済みならば無視

下記のように記載してみましたが、記載内容が不正と表示されてしまいます。記載内容はwebで同様のことをすれば動作するというページからコピーしてきたので、
動くのでは?という気がするのですが

ACW(GETID("Yahoo! JAPAN - Kinza","Chrome_WidgetWin_1"),-4,-21,1260,768,0)
ID = ("GETID")
sleep (5)
//スライダーの値を取得
vMIN = GETSLIDER(ID,1,SLD_MIN) ★ここの記載が違うと言われます。
vMAX = GETSLIDER(ID,1,SLD_MAX)
print "vMIN =" + GETSLIDER(ID,1,SLD_MIN)
print "vMAX =" + GETSLIDER(ID,1,SLD_MAX)

SETSLIDER(ID,(GETSLIDER(ID)/2))
print "vMID =" + SETSLIDER(ID,1,SLD_MAX)

No.5608 2018/08/05(Sun) 04:11:25

Re: Chrome系でスライダーの移動、現在地の取得をしたい / satocha
>記載内容が不正と表示されてしまいます
UWSCに限らず、システムが出すエラーメッセージはバグつぶしに重要な情報を含んでいます。なんかエラーが出たjでは先へ進めません。

この場合、
「GETID:定義が間違っています
●行目:vMIN = GETSLIDER(ID,1,SLD_MIN)」
と出ているはずです。

エラーが出ているときは、その行に間違いがあることも多いのですが、その行で参照している変数や関数の値が変な値を持っていることも多いです。
まず、この行の記述が正しいかどうかヘルプのGETSLIDERの項目を開いて確かめます。すると、記述のミスはなさそうだ、という判断になります。

次に、この行で使っている変数や関数を調べると、関数はなく、変数として「vMIN」と「ID」の2変数を使っています。vMINの方は値を代入しているだけなので、予約語とかぶらなければ問題ありません。ちなみに予約語一覧もヘルプに出ていますので、確認してください。

次のIDはどうでしょう。こういうときは、当該行の何行か前にIDに値を代入している行があるはずです。みると3行前に
ID = ("GETID")
という行があります。もう一度エラーメッセージを見ると、「GETID:定義が間違っています」とあります。エラーメッセージはこのことを言っているのですね。

この変数を元に戻して書いてやると、エラー発生行「vMIN = GETSLIDER(ID,1,SLD_MIN)」は
vMIN = GETSLIDER("GETID",1,SLD_MIN)
ということになります。

この形を念頭にもう一度ヘルプのGETSLIDERの項と見てみると、いま"GETID"という文字列が入っているGETSLIDERの第一引数は「ID: Windowを識別するID」でなければならないのに、"GETID"という無意味な文字列が入っていることが分かります。

つまり、ID = ("GETID")の行でちゃんとしたブラウザのウインドウIDを代入してやればいいわけです。普通はこのあと、ウインドウIDを得る関数をヘルプの中から探す手間が必要ですが、このソースではうまい具合に直前の行

ACW(GETID("Yahoo! JAPAN - Kinza","Chrome_WidgetWin_1"),-4,-21,1260,768,0)

になにやら手がかりがありそうです。

実際この行だけを切り出し別スクリプトにして実行すれば、ブラウザは狙った位置に動いてくれます。

なので、IDにはACWの第一引数そのまま代入してやればいいことがわかります。
ID=GETID("Yahoo! JAPAN - Kinza","Chrome_WidgetWin_1")

で、おなじことをACWに書くのは無駄なので順番を入れ替えて、
ID=GETID("Yahoo! JAPAN - Kinza","Chrome_WidgetWin_1")
ACW(ID,-4,-21,1260,768,0)

No.5609 2018/08/05(Sun) 08:30:30

Re: Chrome系でスライダーの移動、現在地の取得をしたい / satocha
 長くなったので分けました。上の説明は、バグつぶしについてですが、バグがなくなれば思い通りに動作するかどうかは別です。必ずしもすべてのWindowsアプリケーションがUWSCの組み込み関数でうまく制御できるとは限らないからです。

 特に、ブラウザはWindowsインターフェースとは別にブラウザ独自のインターフェースを持つことが多く、一筋縄でいかないことが多いようです。そこで、ブラウザの自動化はUWSCではなくブラウザ自動操縦に特化した「selenium」を利用したほうがうまくいったりします。

 前置きはこれぐらいにして、手持ちのブラウザで試した結果をお知らせします。残念ながら、お使いのKinzaブラウザは持っていませんので、わかりません。
----------------------------------------------
IE vMIN =0 vMAX =100 正常動作
ID=GETID("Yahoo! JAPAN - Internet Explorer","IEFrame")
----------------------------------------------
PaleMoon firefox系 vMIN =-99999 vMAX =-99999 (UWSCのエラー値)スライダーが取得できていない模様
ID=GETID("Yahoo! JAPAN - Pale Moon","MozillaWindowClass")
----------------------------------------------
GoogleChrome vMIN =0 vMAX =0 スライダー動かず
ID=GETID("Yahoo! JAPAN - Google Chrome","Chrome_WidgetWin_1")

No.5610 2018/08/05(Sun) 08:51:57

Re: Chrome系でスライダーの移動、現在地の取得をしたい / pon
satochaさん

詳しいご説明、複数環境での検証ありがとうございます。
早速私の環境でも試してみたところ
vMIN =0
vMAX =0
vMID =True
と表示され、スクロール情報を取得することはできませんでした。
そこで、マウス操作を記録してスライドバーを直に操作し、
これを.uws化することで、目的の動作を達成できました。
uwscなら大概の自動実行はできるのかと思っていましたが意外とできないこともあるのですね、、、

No.5614 2018/08/07(Tue) 00:11:00
マウスカーソル下のウィンドウを最大化させる方法 / うきょち
マウスカーソル下のウィンドウを最大化したいのですが、下記のコードを試して反応がありません。
stopform(false)をなしでしたら、uwscのウィンドウがでるのでいれています。
何か方法ないでしょうか?

stopform(false)
// マウスカーソル下のウィンドウのタイトルとクラス名を表示
id = GETID(GET_FROMPOINT_WIN)    // マウスカーソル下のウィンドウ
moji = STATUS(id, ST_TITLE)

id1=getid(moji)
ctrlwin(id1,MAX)
---------------------
下記もうまくいきません。

id = GETID(GET_FROMPOINT_WIN)    // マウスカーソル下のウィンドウ
ctrlwin(id1,MAX)

No.5605 2018/08/03(Fri) 20:57:48

Re: マウスカーソル下のウィンドウを最大化させる方法 / 森
スクリプトを実行すためにUWSファイルやUWSCの再生をクリックすると、
それがマウスカーソル下になるので、最大化を実行するまで待機が必要です。
for i = 5 to 0 step -1
 balloon("マウスカーソル下のウィンドウを最大化<#CR> " + i + "秒後に実行します。")
 sleep(1)
next
ctrlwin(getid(GET_FROMPOINT_WIN),MAX)

No.5606 2018/08/04(Sat) 15:16:29

Re: マウスカーソル下のウィンドウを最大化させる方法 / うきょち
森様、返信ありがとうございます。
待機が必要って不便ですね。
指定キーですぐにマウスカーソル下のウィンドウを最大化したいのに。
他の手段考えてみます。

No.5607 2018/08/04(Sat) 21:18:30

Re: マウスカーソル下のウィンドウを最大化させる方法 / HIBI
待機が不便で「指定キーで最大化」という事でしたら、下記はいかがでしょう?
[SHIFT]キーを押した時点のマウス下ウィンドウを最大化して終了します。

Fukidasi("[SHIFT]=最大化", 0, 0, 0, 10, "MS 明朝", $FFFFFF, $550000, 100)
while true
 // ESCでスクリプト終了
 if GETKEYSTATE(VK_ESC) then exitexit
 sleep(0.1)

 // [SHIFT]が問題になる場合、他のキーに変更する
 ifb GETKEYSTATE(VK_SHIFT)
  ctrlwin(getid(GET_FROMPOINT_WIN), MAX)
  exitexit
 endif
wend

No.5612 2018/08/05(Sun) 19:06:31

Re: マウスカーソル下のウィンドウを最大化させる方法 / うきょち
HIBI様、希望通りの動作ができました。
ありがとうございます。

No.5613 2018/08/05(Sun) 19:33:07
ClassとModuleの使い分け / Rayna
いつも拝見して勉強させていただいてます

UWSCにおいてのClassとModuleの使い分けがわからず
私は機能的に同一のものとして、Classで統一して使っているのですが
使い分けている人がおられましたら具体例をご教授ください

宜しくおねがいします

No.5578 2018/07/28(Sat) 12:48:04

Re: ClassとModuleの使い分け / satocha
 おもしろい質問だったので、つい、いろんなことを考えてしまいました(https://plaza.rakuten.co.jp/satocchia/diary/201807280000/)。

 さて、私は、ヘルプで柱として立っている「MODULE-ENDMODULE」しか使っていません。でも、自分のこの機能の使い方には実は二種類あって、一つは通常のモジュールとしての使い方ですが、もう一つは「TextBlock〜EndTextBlock」のカプセル化を実現するために使っています。

 私はpowershellをUWSCから呼び出して使うことが、非常に多く、powershellソースをテキストブロックに記述しているのですが、textblockで定める識別子が常にグローバルスコープを持ってしまうことが以前から悩みでした。

 スクリプトで言うと

function kansuu1()
 result=powershell(src)
 textblock src
   パワーシェルソース1
 endtextblock
fend 

function kansuu2()
 result=powershell(src)
 textblock src
   パワーシェルソース2
 endtextblock
fend 

という感じに書きたいのですが、関数内の「src」がグローバルなスコープを持ってしまうため、二重定義エラーになってしまいます。

 このエラーを避けるため、関数ごとにmodule文を用意し、そのなかで、テキストブロックを定義しています。

function kansuu1()
 result=powershell(kansuu1.src)
 module kansuu1
 textblock src
   ここにソース
 endtextblock
 endmodule
fend

 今回のRaynaさんの質問に触発され、使い方が違うmodule文を利用するなら、片方を「Class」にしてみようかなという気になってきました。

No.5579 2018/07/28(Sat) 21:30:43

Re: ClassとModuleの使い分け / Rayna
>>5579 satocha さん

ブログ拝見させていただきました
元はClassだったのがModuleに変更されて旧名称が残っているのですね
開発背景の事も言われてみればそうかも、と納得しました

関数内でModule定義をしてTextBlock文のカプセル化...
なるほど、そういう使い方も出来るのですね
とても興味深いです
色々制限は付きそうですが、便利そうなので試行錯誤してみようと思います

回答していただきありがとうございました

No.5580 2018/07/28(Sat) 22:50:05

Re: ClassとModuleの使い分け / しゅん
UWSCの文法は、VisualBasicを意識しているかと思います。
もしかすると、Office系のVBAかもしれません。
私の記憶が正しければ、古いVBAのCLASSは、UWSCのCLASSと一致していました。
インスタンス化できるものではなく、処理をまとめただけのもの。
言ってみれば、ただの名前空間です。
それがどこかのタイミングで、CLASSはインスタンス化できるものになり、もとのCLASSはMODULEになりました。

UWSCのModuleエイリアスも、似たようなタイミングで行われたのではないかと思います。
ということで、同じものなので、使い分けはありませんね。
個人的には、オブジェクト指向で言うところのCLASSではなく、現在のVBAのModule相当なので、Moduleのみ使っています。

なお、あまりスクリプトを変えずに、標準関数を呼び出している部分の動作を変えたい、なんて時にもModuleは使えます。
http://d.hatena.ne.jp/junjun777/20150407/uwsc_function_override

No.5591 2018/07/31(Tue) 12:07:35

Re: ClassとModuleの使い分け / Rayna
>>5591 しゅん さん

VBAですか...なるほどです
昔のVBAを触ったことがなかったので思いつきませんでした

>> 個人的には、オブジェクト指向で言うところのCLASSではなく、現在のVBAのModule相当なので、Moduleのみ使っています。
なるほど、機能的に同じものとして打ちやすいClass使ってましたが
紛らわしいのでModule使ったほうがいいですね

>>なお、あまりスクリプトを変えずに、標準関数を呼び出している部分の動作を変えたい、なんて時にもModuleは使えます。
以前拝見させていただきました、他の記事も興味深い事書かれているのでいつも勉強させていただいてます
モジュール内のローカルスコープを利用してる感じですよね、以前は使わせてもらっていました
でも最近はModule内関数、変数、定数ではでは明示的にThisをつけているのであまり使っていません
あまりコーディングを厳密にしないのであればすごく便利な書き方だと思います

数日前の質問に回答していただきありがとうございました

No.5603 2018/08/01(Wed) 16:38:57

Re: ClassとModuleの使い分け / satocha
しゅん様
>私の記憶が正しければ、古いVBAのCLASSは、UWSCのCLASSと一致していました。
これは知りませんでした。有益な情報をありがとうございました。

No.5604 2018/08/02(Thu) 14:48:13
powershellでできること / ネル
uwscの関数をある程度使えるようになったのですが、次の段階としてpowershellの勉強をしていこうかなと思ってます。
powershellを勉強することでuwscでできることも増えるかなと漠然と思ってます。
uwscの関数でできないことがpowershellだとできることがたくさんあるという認識で良いのでしょうか?
みなさんはpowershellをどのように活用されていますか?

No.5585 2018/07/30(Mon) 00:56:18

Re: powershellでできること / しゅん
どのように活用って、、、答えにくい質問ですね!
私は、PowerShellはOS起動時に起動しておくもので、ランチャー・計算機・ハッシュ算出・最低限開発環境・.net実行環境・シャットダウン実行・スケジュール管理、、、と専用のアプリを使ってない操作のほとんどを行っています。
(古い人間なので、CUIが好きだから、というのが大きいですが)

uwscの関数だけだとできることに制限はあります。
ただ、PowerShellもPowerShellの組み込み関数(それをどの範囲で定義するか、という問題はありますが)だけだと、あまりいろいろはできません。
どちらも、外部モジュールを組み込むことで、いろいろ実現できるようになっています。
外部モジュールを組み込むことを想定すると、どちらもできないことはない、と言っても良いレベルになります。
得手・不得手があるくらいです。

個人的には、UWSCが得意なのは、ウインドウ・マウス・キーボード操作と(あまり使いませんが)CHKIMG/SAVEIMG。
それ以外は、PowerShellくらいのイメージです。
ただ、.netにはUIAutomationというウインドウ操作に特化した機能(ただしやや使いにくい)があり、マウス・キーボードもWin32APIでなんとでもなるため、最近はあまりUWSCを使いません。

No.5592 2018/07/31(Tue) 12:12:59

Re: powershellでできること / stuncloud
僕もしゅんさんの影響でPowerShellユーザーになってしまって以来、お仕事の簡略化・自動化でGUIを伴わない場合はもっぱらPowerShellですね
仕事用や趣味用など、様々な自作モジュールをガッツリ作って使っています

UIAutomationについてはそれを扱うPowerShell用モジュールが公開されてて一度使ったことがあるんですが、めんどくさすぎて断念しました
UWSCサイコー!

これからやるならWindows PowerShellだけではなくPowerShell Coreという選択肢もあります
Windows PowerShellは今後機能がアップデートされる予定がなくて、PowerShell Coreに注力していく方針のようです
PowerShell CoreならmacやLinuxでも動きますしね、なかなかすごいですよこれ
Windowsしか使わないなら今のところWindows PowerShellのほうが格段に便利ではあります
僕もメインはWindows PowerShellです

あと、初学者向けならこの本がオススメです
https://www.amazon.co.jp/dp/4839965986
すでにPowerShellを使ってる方にもオススメですよ、僕も買いました!
読んでみると結構知らないことがあって理解を深めるのに重宝してます

No.5596 2018/07/31(Tue) 13:48:31

Re: powershellでできること / ネル
しゅん様、回答ありがとうございます。
私は、主にサイトから情報取得(スクレイピング)してファイルに保存やSublimeエディターで文章を作成したり、ワードプレスで色々することが多いので、PowerShellを学ぶことでUWSCで実現できないことをできるようになればと思いました。

コマンドプロンプトのcopy等の基本的操作をUWSCから操作したりはできていますが、さらに何か効率化できればと思い投稿させて頂きました。UIAutomationやWin32APIの使い方を検索してみようと思います。

No.5597 2018/07/31(Tue) 13:51:58

Re: powershellでできること / ネル
stuncloud様、返信ありがとうございます。

owerShell Coreについて色々調べてみたいと思います。
autohotkeyでキーの入れ替えや入力効率をあげる勉強を
現在しているので、それに並行してowerShell Core勉強していこうと思います。

No.5602 2018/08/01(Wed) 12:35:38
UWSCからVBAの関数の戻り値取得は可能ですか? / ぷにぞう
UWSC側からエクセルVBAの標準モジュールに記述したPublic Functionを呼び出し、その中で処理した結果の戻り値をUWSC側で受け取ることは可能なものなのでしょうか?

よろしくおねがいします。

No.5589 2018/07/30(Mon) 12:33:17

Re: UWSCからVBAの関数の戻り値取得は可能ですか? / しゅん
// 基本、自分はここまでやった、というスクリプトの提示のない質問には答えない主義ですが、、、ま、簡単なので。

// 対象のExcelファイルのみを開いている状態で
// Addという標準モジュールのPublic Functionを、引数4と98で呼び出すサンプル

excel = GetActiveOleObj("Excel.Application")
ret = excel.Application.Run("Add", 4, 98)

No.5593 2018/07/31(Tue) 12:27:14

Re: UWSCからVBAの関数の戻り値取得は可能ですか? / ぷにぞう
単なるSubへのアクセス方法に関してはネットで確認して使っていたのですが、引数の指定の仕方や
戻り値の受け取り方をどうしても見つけることができなくて・・・。
最悪ファイルをキックしようとしていました(汗)。
こういう構文なんですね。

お手数をおかけしました。大変助かりました。
ありがとうございます。

No.5598 2018/07/31(Tue) 20:33:42


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


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