ばんのしゃーによかばんた さん 2004年 04月 27日 22時 37分 32秒

>管理人むたぐち さん 2004年 04月 25日 18時 52分 22秒
>Text-To-Speechのエンジンを使って喋ります。

Class IAgentCtlCharacterEx

Property TTSModeID As String
というのがあるので、これかな?

例のHTAで、
TextToSpeech.Speak "Click Me!"
msgbox TextToSpeech.TTSMode
とやると
c5c35d60-da44-11d1-B1F1-0000F803E456
がTTSModeIDのようなので、

Set AgentControl= CreateObject("Agent.Control.2")
'Set AgentControl= CreateObject("Agent.Control")
AgentControl.Connected = True
AgentControl.Characters.Load "Merlin","c:\winNT\msagent\chars\merlin.acs"
'AgentControl.Characters.Load "Merlin","D:\Office\Office\Saeko.acs"
Set Merlin = AgentControl.Characters("Merlin")
Merlin.Show
Merlin.TTSModeID="{c5c35d60-da44-11d1-B1F1-0000F803E456}"
Merlin.Speak "hello"
WScript.Sleep 7000
Merlin.Speak "good bye"
WScript.Sleep 7000
Merlin.Hide

とすると、
冴子先生はしゃべってくれませんでしたが、
マーリンは渋い声( Samさん? )でしゃべりました。

ゆぎ さん 2004年 04月 27日 22時 29分 02秒

すみません。
IEの操作を間違えて、たくさん質問が入ってしまいました。
見苦しくしてしまいました。
本当にすみません。

最終的には最初と最後の質問についてご存知の方がいらしたら、
ご助力ください。
お願いします。

ゆぎ さん 2004年 04月 27日 22時 09分 46秒

下の質問に追加です。

あるアプリケーションを実行するVBSを作りました。
その実行中に、ほかのアプリケーションやらなにやらを、
実行できないようにしたいのですが、実現可能でしょうか?
本やwebを見たのですが、そういった事項はなかったように思います。
どなたかご存知でしたら教えてください。

【環境】
OS:windows98以上
  office97以上

ゆぎ さん 2004年 04月 27日 22時 02分 42秒

下の質問に追加です。

VBSであるアプリケーション以外の実行を抑止することはできますか?
本やwebを見たのですがなかったので。
どなたかご存知でしたら教えてください。

【環境】
OS:Windows98以上
Office:97以上
IE:5以上

ゆぎ さん 2004年 04月 27日 22時 02分 37秒

下の質問に追加です。

VBSであるアプリケーション以外の実行を抑止することはできますか?
本やwebを見たのですがなかったので。
どなたかご存知でしたら教えてください。

【環境】
OS:Windows98以上
Office:97以上
IE:5以上

ゆぎ さん 2004年 04月 27日 21時 27分 17秒

こんばんは。

VBScriptでコモンダイアログを出力し、その値を取得する方法を
教えてください。
オブジェクトはExcelを使用しようと思っています。

よろしくお願いします。

【環境】
OS:Windows98以上
Office:97以上

管理人むたぐち さん 2004年 04月 25日 22時 33分 59秒

http://www.microsoft.com/msagent/downloads/user.asp

MS AgentをText-To-Speechで喋らせるには、WinXPでも、
SAPI 4.0 runtimeをダウンロードしてインストールする必要があるようです。

あと、英語のほかに、日本語のスピーチエンジンを入れた場合、
Merlin.LanguageID=1033(&H0409)とすると英語を、
Merlin.LanguageID=1041(&H0411)とすると日本語を喋ります。

詳しくは、ここのSDK ドキュメント(*.chm)を参照してください。
http://www.microsoft.com/msagent/downloads/developer.asp

管理人むたぐち さん 2004年 04月 25日 18時 52分 22秒

To: ばんのしゃーによかばんた さん

> MS Agent

オフィスアシスタントとMS Agentのキャラクターファイルって、
互換性があったんですね。
拡張子が同じだから、もしやとは思ってたんですが。
こちらの環境でも、MS Agentから冴子先生を呼ぶことができました。
WinXPのエクスプローラの検索コンパニオンでも呼び出せますね。

ちなみに、冴子先生は、日本語版Officeの独自キャラクターらしいです。
http://d.hatena.ne.jp/keyword/%BA%E3%BB%D2%C0%E8%C0%B8
http://www.microsoft.com/japan/Backstagejpn/wmv/vol_02/wmv.asp

MSAgent でGoogleを探してみると、こんなのを発見しました。
http://sannkakukin.hp.infoseek.co.jp/agent.htm
萌えキャラのAgentって絶対だれか作ってそうだよなぁ、とずっと思ってたんですが、
やはりありますね。
なお、このサイトには、WSHからAgentを呼び出すサンプルもあります。

> でも、MS Agentて声に出して喋るんですよね。どうやるんでしょう?

Text-To-Speechのエンジンを使って喋ります。
ちょっと調べたんですが、Speakメソッドの引数に、"Output Tags"というものを
指定してやると、喋ってくれるみたいです。
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msagent/spoutput_2v1w.asp
が、ここのコードでは、マーリンさんは喋ってくれませんでした。
他に何か条件ややり方があるのかもしれません。
情報をお持ちの方は、補足願います。

> オブジェクトブラウザ

あれをスクリプトでコピーアンドペーストするとは、考えもつきませんでした。
ほかに、TLI.TLIApplicationを使う手もありますね。
WSH補完クンhttp://www.geocities.co.jp/SiliconValley-Oakland/4672/に、
キーワード定義ファイルを自動生成するのに、これを使ったスクリプトが
同梱されていた(?)んですが、最新バージョンのには入ってないようですね。
# 私もなくしてしまいました。

> dialogHelper

どせいさんフォント、懐かしいです。
http://member.nifty.ne.jp/Hifuni/dosei/

ついでにこっちも。ドラクエフォント。
http://slime4.hp.infoseek.co.jp/font/font.html

さらについでに。有名ですが、みかちゃんフォント。
これで論文とかを打ち出すと楽しいです。
http://mikachan-font.com/index2.html

# 関係ないところに反応してみました。

ばんのしゃーによかばんた さん 2004年 04月 25日 18時 22分 54秒

Excelのセキュリティ警告の回避方法。

一般には、デジタル署名を付ける、ですが、以下の方法もあります。

単に開く場合、
Set xl=CreateObject("Excel.Application")
Set book=xl.WorkBooks.Open("なんとか.XLS")
'Set book=xl.WorkBooks.Open(WScript.Arguments(0)) 'Dropなら
xl.Visible=True
'book.RunAutoMacros(1) 'Auto_Open()を実行
WScript.Quit

自動実行する場合、
Set xl=CreateObject("Excel.Application")
Set book=xl.WorkBooks.Open("なんとか.XLS")
'Set book=xl.WorkBooks.Open(WScript.Arguments(0)) 'Dropなら
'xl.Visible=True
book.RunAutoMacros(1) 'Auto_Open()を実行
book.Close
xl.Quit
WScript.Quit

Auto_Open()は手動でRunAutoMacroしてやらないと動かないみたいですが、
Auto_Close()は自動で動くようです。

因みに、
この方法は、Excelのセキュリティレベルを「高」にして、
セキュリティ警告なしにマクロを無効、にしていても使えます。

また、Excelのセキュリティレベルが「中」のとき、
Set book=GetObject("なんとか.XLS")
では、セキュリティ警告が出ます。

ばんのしゃーによかばんた さん 2004年 04月 25日 18時 21分 41秒

訂正です。

>ばんのしゃーによかばんた さん 2004年 04月 02日 18時 55分 39秒
>clipboardDataの続き
>GetDataだけならIEでなくても、MSHTMLだけで動きます。

の以下の行、

>Set Document=GetObject(WScript.FullName,"htmlfile")

このままだとWScript/CScriptが死にます。

>環境依存を避けるため、上の例では、ローカルファイルなら、なんでもよいので、
>スクリプトファイル自身を指定しています。

のとおりで、正しくは、

Set Document=GetObject(WScript.ScriptFullName,"htmlfile")
Do While Document.readyState<>"complete"
WScript.Sleep 100
Loop
WScript.Echo Document.ParentWindow.ClipboardData.GetData("Text")

でした。

したがって、オブジェクトブラウザからNotePadへは、

Set wShell=CreateObject("WScript.Shell")
Set Document=GetObject(WScript.ScriptFullName,"htmlfile")
Do While Document.readyState<>"complete"
WScript.Sleep 100
Loop

prev=""
For n=1 To 50
Do While Not wShell.AppActivate("Microsoft Visual Basic")
WScript.Sleep 100
Loop
WScript.Sleep 100
wShell.SendKeys "{TAB}"
WScript.Sleep 100
wShell.SendKeys "^a"
WScript.Sleep 100
wShell.SendKeys "^C"
WScript.Sleep 100
text=Document.ParentWindow.ClipboardData.GetData("Text")
If prev=text Then Exit For
prev=text
Do While Not wShell.AppActivate("メモ帳")
WScript.Sleep 100
Loop
wShell.SendKeys "^V"
WScript.Sleep 100
wShell.SendKeys "{ENTER}"
Do While Not wShell.AppActivate("Microsoft Visual Basic")
WScript.Sleep 100
Loop
WScript.Sleep 100
wShell.SendKeys "+{TAB}"
WScript.Sleep 100
wShell.SendKeys "{DOWN}"
WScript.Sleep 100
Next
WScript.Quit

となります。

ばんのしゃーによかばんた さん 2004年 04月 25日 16時 27分 39秒

>管理人むたぐち さん 2004年 04月 03日 19時 00分 25秒
>dialogHelperも面白そうですね。

これは、以下と同じもののようです。

>管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2002年 02月 01日 01時 41分 18秒
>To: Lib30 さん
>> MSDNを久しぶりに見てたらいつの間にか新しいオブジェクトなどの
>> リファレンスが追加されていました。
>> そういうわけで、フォント名一覧を取得するスクリプト
>こういうことができると、アクセス解析に、「どせいさんフォント使用率」という
>項目を追加したりすることが可能なわけですね(謎)
>すげえありがちですが、改造してみました。

ただ、CLSIDが少し違っているようで、それらを直すとこうなります。

<HTML>
<HEAD>
<meta http-equiv="Content-Type"
content="text/html; charset=shift_jis">
<TITLE></TITLE>
<SCRIPT type="text/javascript">
function getSystemFonts(){

var cnt = dlgHelper.fonts.length;
var str = "フォントの総数:" + cnt + "<br>";
var list = new Array();
for (var i = 1; i < cnt; i++){
list.push("<font face=" + dlgHelper.fonts.item(i) + ">" + dlgHelper.fonts.item(i) + "</font><br>")
}
str += list.sort().join("");
fontlist.innerHTML = str;
}
</SCRIPT>
</HEAD>
<BODY>
<OBJECT ID="dlgHelper" CLASSID="CLSID:3050f4e1-98b5-11cf-bb82-00aa00bdce0b" width="0px" height="0px"></OBJECT>
<INPUT TYPE="button" value="フォント取得" onclick="getSystemFonts()">
<SPAN ID="fontlist"></SPAN>
</BODY>
</HTML>

ばんのしゃーによかばんた さん 2004年 04月 25日 16時 26分 23秒

ExcelマクロのRunでは、Functionの関数値が得られないので、
前回は、Subに変えて、activecellに設定して返すようにしていましたが、
それよりも、Subに変えて、引数を追加して返すようにすればよい。

ということで、long配列をByte配列に変えるサンプル。

Book2.XLSのsheet1のソースモジュール。
Sub LongArrayToByteArray(LongArray, ByteArray)
Dim Bytes() As Byte
Dim k, n As Long
n = UBound(LongArray)
ReDim Bytes(n)
For k = 0 To n
Bytes(k) = CByte(LongArray(k))
Next
ByteArray = Bytes
End Sub

VBS
Set xl=CreateObject("Excel.Application")
xl.Visible=True
xl.WorkBooks.Open "Book2.xls"
Call xl.Run( "sheet1.LongArrayToByteArray",Array(1,2,3),Bytes)
WScript.Echo TypeName(Bytes)
For k=0 To UBound(Bytes)
WScript.Echo AscB(MidB(Bytes,k+1,1))
Next
xl.Quit

ばんのしゃーによかばんた さん 2004年 04月 25日 16時 24分 29秒

>管理人むたぐち さん 2004年 04月 24日 15時 31分 55秒
>次は冴子先生を召喚する方法を…。

Assistant.FileName="C:\Program Files\Microsoft Office\Office\Saeko.acs"
ですね。

>これで思い出したのが、MS Agentなんですけども、WinXPだとデフォルトで
>マーリンさんが入ってるんですよね。

MS Agentですか。Win2Kにもマーリンが入ってました。動きますね。
Win98SEには入れた覚えがないのですが、少し古い(98-09-17 17:42)MSAgentが
入っていました。でもマーリンがない。代わりに冴子先生を指定したら動きました。
でも、MS Agentて声に出して喋るんですよね。どうやるんでしょう?

>> WSHからExcel経由でWin32APIを使う方法。
>これはWSHからWin32APIを使いたいのだーという執念みたいなのを感じました。
>が、実際はここまでやる人もいなさそうな感じです。

いえ、単純に、定番(?)のDynaCallを入れてないし、
折角、Excelを持っていて、Win32APIが使えるのに、もったいないし、
世の中、DynaCallを入れているひとより、Excelを持っているひとのほうが
断然多いだろうな、ということで、DynaCallの代わりにExcelを使ってみました。

ところで、
以前、話題に登った、アクティブウィンドウを検出する方法です。
精度が悪い(タイミング依存)なので、あまり実用向きではありません。
同じ手は、Leftが取れるオブジェクトなら使えるかも。

Set wShell=CreateObject("WScript.Shell")
Set shell=CreateObject("Shell.Application")
Set dic=CreateObject("Scripting.Dictionary")
For Each window In shell.Windows
dic.Add window,window.left
Next
wShell.SendKeys "%( m)"
Wscript.Sleep 1000
wShell.SendKeys "{Left}"
Wscript.Sleep 100
wShell.SendKeys "{Enter}"
Wscript.Sleep 100
For Each window In shell.Windows
If dic.Item(window)<>window.left Then Exit For
Next
wShell.SendKeys "%( m)"
Wscript.Sleep 1000
wShell.SendKeys "{Right}"
Wscript.Sleep 100
wShell.SendKeys "{Enter}"
Wscript.Sleep 100
If IsEmpty(window)=False Then
Wscript.Echo dic.Item(window),window.left
End If
Wscript.Quit

最大化、最小化、正規の判定方法も。

Set shell=CreateObject("Shell.Application")
For Each window In shell.Windows
Wscript.Echo window.left,window.width
Next
Wscript.Quit

結果
Maximized -4 808
Minimized 3000 160
Normal 96 628

これを使って特定のWindowをアクティベイトする方法。

Set wShell=CreateObject("WScript.Shell")
Set shell=CreateObject("Shell.Application")
shell.MinimizeAll
Wscript.Sleep 100
For n=1 To 10
wShell.SendKeys "%{Tab}"
Wscript.Sleep 100
If Window.Left<3000 Then Exit For
Next

これって、WSHからWin32APIを使わないのだーという執念みたいなのを感じません?

>To: たむきくん さん
>> 任意のアプリケーションをコントロールするメソッドにどんなものがあるかを調べるには
>>どうしたらいいんでしょうか?
>これは大抵、そのアプリケーションのマニュアルに書いてあります。
>Word、Excelならば、VBAのリファレンスがこれに相当します。

ヘルプですね。ところで、このHTMLヘルプの印刷って、ときどき失敗しませんか。
ヘッダとフッタだけで中身が空白。続けて印刷すると発生しやすいみたいです。
このため、プリンタを一時停止にして、プリンタ画面でドキュメント名が
file://C:\TMP\triPFDBA.htm
のようだったら、印刷中止するようにしてます。

>これだけはVBAの「オブジェクトブラウザ」を併用してやる必要があると思います。
>Word、Excelに限らず、COMのオブジェクトにどんなメンバ(プロパティ、
>メソッド、定数、イベントなど)があるかを調べるのには有効です。

オブジェクトブラウザって、個々のメンバの説明を見るだけで、
メンバの説明をまとめて印刷したり、取り出したりって、できないんですよね。
たくさんのメンバの説明をひとつずつ、全て選択、コピー&ペーストするのって
うんざりしませんか。

そこで、
(1)NotePadを開きます。
(2)オブジェクトブラウザのメンバ一覧の開始行に位置づけます。
(3)以下のVBSを実行します。

Const OLECMDID_PASTE = 13
Const OLECMDEXECOPT_DODEFAULT = 0
Set ie=CreateObject("InternetExplorer.Application")
ie.Navigate "about:blank"
Do While ie.Busy Or ie.ReadyState<>4
WScript.Sleep 100
Loop
ie.document.write "<html><body><textarea id=txt></textarea></body></html>"
ie.document.all.txt.focus

Set wShell=CreateObject("WScript.Shell")

prev=""
For n=1 To 50
Do While Not wShell.AppActivate("Microsoft Visual Basic")
WScript.Sleep 100
Loop
WScript.Sleep 100
wShell.SendKeys "{TAB}"
WScript.Sleep 100
wShell.SendKeys "^a"
WScript.Sleep 100
wShell.SendKeys "^C"
WScript.Sleep 100
ie.document.all.txt.Value=""
Call ie.ExecWB(OLECMDID_PASTE,OLECMDEXECOPT_DODEFAULT)
text=ie.document.all.txt.Value
If prev=text Then Exit For
prev=text
Do While Not wShell.AppActivate("メモ帳")
WScript.Sleep 100
Loop
wShell.SendKeys "^V"
WScript.Sleep 100
wShell.SendKeys "{ENTER}"
Do While Not wShell.AppActivate("Microsoft Visual Basic")
WScript.Sleep 100
Loop
WScript.Sleep 100
wShell.SendKeys "+{TAB}"
WScript.Sleep 100
wShell.SendKeys "{DOWN}"
WScript.Sleep 100
Next
ie.Quit
Set ie=Nothing
WScript.Quit

一度に、最大50メンバまでコピーします。
それ以上は繰り返しどうぞ。

因みに、上で、
wShell.SendKeys "^A"
とすると、効かないし、
wShell.SendKeys "^c"
とすると、改行が変になります。
全くけったいな振る舞いです。

黒騎士F91 さん 2004年 04月 24日 21時 08分 57秒

管理人むたぐち さんRESありがとうございます。
(RESって最近いわねーな(^-^;))
> Call test2(br)
> あるいは
> test2 br
> のようにすれば、参照渡しができます。
> VBSの場合、ByRefはあってもなくても大丈夫です。(省略時は参照渡しなので)
> test2(br)のような書き方は、おそらくイレギュラーなんだと思います。
Σ( ̄口 ̄;)!!
灯台下暗しとでも言うのでしょうか?
単純なのに気が付かない、何を悩んでいたのだろう的な感じです。
サンプルで参照渡しできることを確認したとき、
涙流しながら笑ってしまいそうでした。

ありがとうございます。

管理人むたぐち さん 2004年 04月 24日 15時 31分 55秒

To: ばんのしゃーによかばんた さん

> Office Assistantを使った処理中メーセージ

おお、カイル君だw
WinXP+Office2000の環境でばっちり動作しました。
次は冴子先生を召喚する方法を…。

これで思い出したのが、MS Agentなんですけども、WinXPだとデフォルトで
マーリンさんが入ってるんですよね。
たしかインストール直後のチュートリアルとかで利用されていた気がします。

Set AgentControl= WScript.CreateObject("Agent.Control")
AgentControl.Connected = True
AgentControl.Characters.Load "Merlin","c:\windows\msagent\chars\merlin.acs"
Set Merlin = AgentControl.Characters("Merlin")
Merlin.Show
Merlin.Speak "#1処理中です。"
WScript.Sleep 7000
Merlin.Speak "#2処理中です。"
WScript.Sleep 7000
Merlin.Hide
msgbox "done"

ただし、MS Agentのキャラクターのメソッドは、非同期的に実行されるので、
リアルタイムで情報を喋らせるという用途にはあまり向いてない感じもします。
(同期的に実行する方法ってあるんでしょうか?)

最近、私がこの手の時間のかかる処理を書くときは、cscript.exe強制実行にして、
WScript.Echoして情報をリアルタイム出力してやることがほとんどです。
何だかんだでこれが一番確実で分かりやすいのですね。
強烈に前世紀的なインターフェースですが。
ちなみにcscript.exe強制実行のやり方はWikiに書いておきました。

> WSHからExcel経由でWin32APIを使う方法。

これはWSHからWin32APIを使いたいのだーという執念みたいなのを感じました。
が、実際はここまでやる人もいなさそうな感じです。


To: たむきくん さん

> 任意のアプリケーションをコントロールするメソッドにどんなものがあるかを調べるにはどうしたらいいんでしょうか?

これは大抵、そのアプリケーションのマニュアルに書いてあります。
Word、Excelならば、VBAのリファレンスがこれに相当します。
Developerなエディションには、COMのインターフェースのもっと詳細な
リファレンスがあるそうですが、WSHから呼ぶ程度なら、VBAのリファレンスで
十分でしょう。ただし定数の実際の値については記述がありませんので、
これだけはVBAの「オブジェクトブラウザ」を併用してやる必要があると思います。
Word、Excelに限らず、COMのオブジェクトにどんなメンバ(プロパティ、
メソッド、定数、イベントなど)があるかを調べるのには有効です。
ちなみに、オブジェクトブラウザのダイアログを出すには、VBAでF2キーを押すと
すぐ出ます。

Windowsに付属しているCOMオブジェクト(IEやShellなど)に関しては、
MSDNライブラリに記述があります。

また、逆に言うと、マニュアルがないものは、動かして欲しくないという
開発者の隠れた願望があると見るべきでしょう。
こういうのも、オブジェクトブラウザで仕様を調べ、無理やり使ってしまう
ことも可能です。が、ちゃんと動くかどうかとか、正しい使い方などは
分からないわけですから、一筋縄ではいきません。
ですがWSHを使う上での醍醐味でもあります。


To: 黒騎士F91 さん

> VBSにていろいろ試しているのですが、参照渡しができないことに疑問を持っています。

test2(br)

Call test2(br)
あるいは
test2 br
のようにすれば、参照渡しができます。
VBSの場合、ByRefはあってもなくても大丈夫です。(省略時は参照渡しなので)
test2(br)のような書き方は、おそらくイレギュラーなんだと思います。

黒騎士F91 さん 2004年 04月 24日 12時 08分 02秒

VBSにていろいろ試しているのですが、参照渡しができないことに疑問を持っています。
ーーーーー
test1()
Sub test1()
Dim br
br = 1
test2(br)
MsgBox br
End Sub
Sub test2(ByRef val)
val = val + 10
End Sub
ーーーーー
ここのサイトのGoogleサイト内検索:での検索結果でも、
MSの下記の情報でも、できないとはかかれていないので、
何かやり方、できない情報を知っておられる方がいれば、
教えていただきたいです。
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/script56/html/vsstmsub.asp
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/script56/html/vsstmfunction.asp
宜しく御願いいたします。

たむきくん さん 2004年 04月 24日 10時 18分 59秒

任意のアプリケーションをコントロールするメソッドにどんなものがあるかを調べるにはどうしたらいいんでしょうか?本を見ると基本的なことは書いてありますがWord,Excelなどの個別のアプリケーションのコントロールの仕方についてはかいてないです。

ばんのしゃーによかばんた さん 2004年 04月 23日 18時 48分 56秒

WSHからExcel経由でWin32APIを使う方法。

Book1.XLSのthisworkbookのコードモジュールに以下。
ポイントは、
DeclareにPrivateを付ける。
関数/sub名〜にプリフィクスx〜を付ける。
必要ならAliasを付ける。
同名〜でSubを作りx〜を呼び出す。
関数は復帰値をActiveCellに代入する。

Private Declare Function xFindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function xSetForegroundWindow Lib "user32" Alias "SetForegroundWindow" (ByVal hwnd As Long) As Long
Private Declare Sub xSleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Long)
Private Declare Sub xkeybd_event Lib "user32" Alias "keybd_event" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
Sub FindWindow(ByVal lpClassName As String, ByVal lpWindowName As String)
If lpClassName = "" Then lpClassName = vbNullString
If lpWindowName = "" Then lpWindowName = vbNullString
ActiveCell = xFindWindow(ByVal lpClassName, ByVal lpWindowName)
End Sub
Sub SetForegroundWindow(ByVal hwnd As Long)
ActiveCell = xSetForegroundWindow(ByVal hwnd)
End Sub
Sub Sleep(ByVal dwMilliseconds As Long)
Call xSleep(ByVal dwMilliseconds)
End Sub
Sub keybd_event(ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
Call xkeybd_event(ByVal bVk, ByVal bScan, ByVal dwFlags, ByVal dwExtraInfo)
End Sub


以下はVBSファイル。
ポイントは、
同名〜の関数/subを作る。
Call xl.run("thisworkbook.〜", 引数)でExcelマクロを呼び出す。
関数は関数名〜 = xl.ActiveCell.Valueで復帰値を取り出す。

Private Const vbKeyNumpad1 = 97 'テンキーの「1」を表す定数。
Private Const KEYEVENTF_KEYUP = &H2 'キー解放を表す定数。

Set xl=CreateObject("Excel.Application")
'xl.Visible=True
xl.WorkBooks.Open "Book1.xls"

Sub Sleep(Milliseconds)
Call xl.run("thisworkbook.Sleep", Milliseconds)
End Sub

Function FindWindow(ClassName,WindowName)
Call xl.run("thisworkbook.FindWindow",ClassName,WindowName)
FindWindow = xl.ActiveCell.Value
End Function

Function SetForegroundWindow(hwnd)
Call xl.run("thisworkbook.SetForegroundWindow",hwnd)
SetForegroundWindow = xl.ActiveCell.Value
End Function

Sub keybd_event(bVk,bScan,dwFlags,dwExtraInfo)
Call xl.run("thisworkbook.keybd_event",bVk,bScan,dwFlags,dwExtraInfo)
End Sub

'hWnd = FindWindow("SciCalc", "電卓")
hWnd = FindWindow("" , "電卓")

If 0 = hWnd Then
MsgBox "電卓 が起動していません。"
WScript.Quit
End If

Call SetForegroundWindow(hWnd)

Call Sleep(1000)

Call keybd_event(vbKeyNumpad1, 0, 0, 0)
Call keybd_event(vbKeyNumpad1, 0, KEYEVENTF_KEYUP, 0)

xl.ActiveWorkBook.Saved=True
xl.Quit

ばんのしゃーによかばんた さん 2004年 04月 23日 18時 47分 56秒

Office Assistantを使った処理中メーセージ

ポイントは、
モードレスを指定。
ボタンは「なし」を指定。
※モードレスでボタンを指定するとCallback関数が必須となるが、
VBScriptの関数はcallback出来ない。

アニメーションは連続再生するものを指定。
バルーンメーセージの更新は一旦closeして変更して再度Show。

Set xl=CreateObject("Excel.Application")
Set Assistant=xl.Assistant
IsAssistantOn=Assistant.On
Assistant.On=True
Assistant.Visible=True
Assistant.Animation=103
Set Balloon=Assistant.NewBalloon
Balloon.Button=0
Balloon.Mode=2
Balloon.Icon=4
Balloon.Heading="なんとか"
Balloon.Text="#1処理中です。"
Balloon.Show
WScript.Sleep 3000
Balloon.Close
Balloon.Text="#2処理中です。"
Balloon.Show
WScript.Sleep 3000
Balloon.Close
Assistant.Visible=False
Assistant.On=IsAssistantOn
WScript.Quit

以下参考。
Const msoAnimationIdle = 1
Const msoAnimationGreeting = 2
Const msoAnimationGoodbye = 3
Const msoAnimationBeginSpeaking = 4
Const msoAnimationRestPose = 5
Const msoAnimationCharacterSuccessMajor = 6
Const msoAnimationGetAttentionMajor = 11
Const msoAnimationGetAttentionMinor = 12
Const msoAnimationSearching = 13
Const msoAnimationPrinting = 18 '(&H12)
Const msoAnimationGestureRight = 19 '(&H13)
Const msoAnimationWritingNotingSomething = 22 '(&H16)
Const msoAnimationWorkingAtSomething = 23 '(&H17)
Const msoAnimationThinking = 24 '(&H18)
Const msoAnimationSendingMail = 25 '(&H19)
Const msoAnimationListensToComputer = 26 '(&H1A)
Const msoAnimationDisappear = 31 '(&H1F)
Const msoAnimationAppear = 32 '(&H20)
Const msoAnimationGetArtsy = 100 '(&H64)
Const msoAnimationGetTechy = 101 '(&H65)
Const msoAnimationGetWizardy = 102 '(&H66)
Const msoAnimationCheckingSomething = 103 '(&H67)
Const msoAnimationLookDown = 104 '(&H68)
Const msoAnimationLookDownLeft = 105 '(&H69)
Const msoAnimationLookDownRight = 106 '(&H6A)
Const msoAnimationLookLeft = 107 '(&H6B)
Const msoAnimationLookRight = 108 '(&H6C)
Const msoAnimationLookUp = 109 '(&H6D)
Const msoAnimationLookUpLeft = 110 '(&H6E)
Const msoAnimationLookUpRight = 111 '(&H6F)
Const msoAnimationSaving = 112 '(&H70)
Const msoAnimationGestureDown = 113 '(&H71)
Const msoAnimationGestureLeft = 114 '(&H72)
Const msoAnimationGestureUp = 115 '(&H73)
Const msoAnimationEmptyTrash = 116 '(&H74)

Const msoIconNone = 0
Const msoIconAlert = 2
Const msoIconTip = 3
Const msoIconAlertInfo = 4
Const msoIconAlertWarning = 5
Const msoIconAlertQuery = 6
Const msoIconAlertCritical = 7

Const msoButtonSetNone = 0
Const msoButtonSetOK = 1
Const msoButtonSetCancel = 2
Const msoButtonSetOkCancel = 3
Const msoButtonSetYesNo = 4
Const msoButtonSetYesNoCancel = 5
Const msoButtonSetBackClose = 6
Const msoButtonSetNextClose = 7
Const msoButtonSetBackNextClose = 8
Const msoButtonSetRetryCancel = 9
Const msoButtonSetAbortRetryIgnore = 10
Const msoButtonSetSearchClose = 11
Const msoButtonSetBackNextSnooze = 12
Const msoButtonSetTipsOptionsClose = 13
Const msoButtonSetYesAllNoCancel = 14

'Balloon.BalloonType=
Const msoBalloonTypeBullets = 1
Const msoBalloonTypeButtons = 0
Const msoBalloonTypeNumbers = 2

Const msoModeModal = 0
Const msoModeAutoDown = 1
Const msoModeModeless = 2


管理人むたぐち さん 2004年 04月 23日 17時 54分 36秒

BrainFuck <[+-.,]>
http://pc5.2ch.net/test/read.cgi/tech/1036013915/

わずか8種類の文字(=命令)で記述するプログラミング言語だそうです。
変な言語好きにはたまりません。



To: たむきくん さん
> HPから為替相場のデータを取得して為替取引きを自動で行うスクリプトをつくれないでしょうか?

HTTPというプロトコルを利用してデータをやり取りするという意味においては、
技術的には可能です、と言えると思います。
ですが実際は、取得した為替相場のデータを、どのように解釈して、
それに対してどういう取引きを行うルーチンを組むかが肝になるわけです。
つまり、いかに人間の判断ルーチンを、プログラムにトレースできるかどうかですね。
単に為替相場のデータだけを拾っても駄目でしょうから、刻々と変化する社会・経済情勢を
何らかの形で判断データとして与えてやる必要もあるでしょう。
果たして人間と同等以上の利潤を生み出す、取引きプログラムは作れるのでしょうか。
要するに、人工知能ですね。
確かに興味深いテーマではありますが、一掲示板で取り扱えるものでもなさそうです。

ちなみに、為替取引きとまでは行きませんが、ネットオークションに自動入札をする
プログラムならばいくつかあります。
これは、オークション終了直前(1秒前とか)にプログラムによって自動的に入札することで
落札を図るというもので、この方法を「スナイプ」というらしいです。
スナイプは極めて機械的な処理ですので、原理的にプログラムでも可能だということは
容易に推察できます。というかこれは駆け引きとかは全くなく、ただ時間だけの
問題になってくるので、むしろ人間よりプログラムの方が優位と言えるでしょう。

余談ですが、私は真っ先に「人工無能」を連想しました。
人間の文字入力に対して、それに応じた返答を出力をするプログラムを総称してこう呼ばれています。
知能ではなく無能なのは、知能というほどのものでもないので控えめに、ということらしいですが、
返答のバリエーションが豊富なものは、もはや無能とは言えないんじゃないかと思ったり。
私が個人的に最強だと思う人工無能はここです。
http://www.yk.rim.or.jp/~misao/v_neko.html
知らない人に対して、この電気猫でチューリングテストをやってみましょう。

懐かしの偽春菜の時代から、このテーマには興味がある私でありました。


To: のんでる? さん
> 下記のような他ノードへの設定はできないのでしょうか?

WMIのリモート実行も、リモートWSHと同様にDCOMの設定が必要になってきます。

28-36 管理人むたぐち 2001/01/18 11:20
28-46 管理人むたぐち 2001/01/21 20:41
33-26 管理人むたぐち 2001/03/28 17:39

このあたりを参考にしてみてください。

いりや さん 2004年 04月 23日 14時 43分 59秒

kimuchi さん、

> できれば、単純に指定したソフトを起動すると言うことは可能でしょうか?

なるほど。では、例えばこんな感じでしょうか。。マイクロソフト
社製品のいくつかとフリーソフトウェアを起動します。さいごの
0.txt ファイルは、アプリケーション・プログラムだけでなく引数
にファイルを設定して起動する例です。

CSS の設定は最小限にとどめています。Anchor オブジェクトの周
りはマウスカーサを変更したり、文字列をハイライトさせたりする
などして、ユーザ・インターフェイスを改善できるかもしれません
ね。

<html>
<title>
Sample HTML
</title>
<script>

var launcherTable = new LauncherTable();

function launch (name) {
    launcherTable.launch(name);
}

function LauncherTable() {
    // Instance variables
    var WScriptShell = new ActiveXObject('WScript.Shell');
    var table = new Object();
    // Instance methods
    this.register = function (key, value) { table[key] = value }
    this.commandLine = function (key) { return key in table ? table[key].join(' ') : '' }
    this.launch = function (key) {
        var commandLine = this.commandLine(key);
        if (commandLine != '')
            WScriptShell.run(commandLine);
    }
    this.initialize = function () {
        var q = function (s) { return new Array(String.fromCharCode(34), s, String.fromCharCode(34)).join('') }
        this.register('Microsoft Internet Explorer', [q('C:\\Program Files\\Internet Explorer\\IEXPLORE.EXE')]);
        this.register('Microsoft Word', [q('C:\\Program Files\\Microsoft Office\\Office\\WINWORD.EXE')]);
        this.register('Microsoft PowerPoint', [q('C:\\Program Files\\Microsoft Office\\Office\\POWERPNT.EXE')]);
        this.register('Microsoft Excel', [q('C:\\Program Files\\Microsoft Office\\Office\\EXCEL.EXE')]);
        this.register('RealOne Player', [q('C:\\Program Files\\Real\\RealOne Player\\realplay.exe')]);
        this.register('K2 EDITOR', [q('C:\\Program Files\\K2Editor\\K2Editor.exe')]);
        this.register('マインスイーパ', [q('%SystemRoot%\\System32\\winmine.exe')]);
        this.register('c:\\tmp\\0.txt', [q('C:\\Program Files\\K2Editor\\K2Editor.exe'), q('c:\\tmp\\0.txt')]);
    }
    this.example = function () {
        //this.launch('Microsoft Internet Explorer');
        //this.launch('Microsoft Word');
        //this.launch('Microsoft PowerPoint');
        //this.launch('Microsoft Excel');
        //this.launch('RealOne Player');
        //this.launch('K2 EDITOR');
        //this.launch('マインスイーパ');
        this.launch('c:\\tmp\\0.txt');
    }
    // Invoked at instance creation
    this.initialize();
}
</script>
<body>
<h3>簡易 Application Launcher</h3>

青で着色された行をクリックしてみてください。
<ol>
<li><a style='color:#0000ff;' onClick='launch(this.innerText)'>Microsoft Internet Explorer</a>
<li><a style='color:#0000ff;' onClick='launch(this.innerText)'>Microsoft Word</a>
<li><a style='color:#0000ff;' onClick='launch(this.innerText)'>Microsoft PowerPoint</a>
<li><a style='color:#0000ff;' onClick='launch(this.innerText)'>Microsoft Excel</a>
<li><a style='color:#0000ff;' onClick='launch(this.innerText)'>RealOne Player</a>
<li><a style='color:#0000ff;' onClick='launch(this.innerText)'>マインスイーパ</a>
<li><a style='color:#0000ff;' onClick='launch(this.innerText)'>c:\tmp\0.txt</a>
</ol>
</body>
</html>

のんでる? さん 2004年 04月 23日 14時 24分 14秒

下記のような他ノードへの設定はできないのでしょうか?

strComputer = "machine_on_net"
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set objNewJob = objWMIService.Get("Win32_ScheduledJob")
errJobCreated = objNewJob.Create _
("c:\test.bat", "********200000.000000-420", True , 2, , , JobID)
Wscript.Echo errJobCreated

いりや さん 2004年 04月 23日 13時 03分 05秒

たむきさん、

> HPから為替相場のデータを取得して為替取引きを自動で行うスクリプトをつくれないでしょうか?

おもしろいテーマですね。エージェント・プログラムのようです。

たむきくん さん 2004年 04月 23日 12時 59分 39秒

HPから為替相場のデータを取得して為替取引きを自動で行うスクリプトをつくれないでしょうか?

kimuchi さん 2004年 04月 23日 09時 59分 28秒

To:いりや様

ご返信ありがとうございます。丁寧にサンプルをさくせいしていただきありがとうございます。おそらく自分の質問の仕方が悪かったと思うのですが、いりや様が教えてくれたsample.htmlですと、ファイル形式を元に関連付けされたソフトを起動するというものでしょうか?できれば、単純に指定したソフトを起動すると言うことは可能でしょうか?

Furusawa さん 2004年 04月 23日 08時 50分 08秒

管理人むたぐち 様

返信ありがとうございます。
流れは理解できました。
が、今の私のレベルではどうも太刀打ち出来そうも無いので、
もう少しVBS,WSH,WMIの勉強を進めてから再度挑戦したいと思います。
ありがとうございました。

管理人むたぐち さん 2004年 04月 22日 22時 13分 11秒

To: Furusawa さん
> キー名にワイルドカードは使用できないのでしょうか?

おそらくできないと思います。
ワイルドカードの展開は、自力でやるしかないでしょう。
WMIのStdRegProvクラスのEnumKeyメソッドを使えば、サブキーの列挙が
可能なので、各サブキーに対してワイルドカードに合致する
ものを抜き出すようなスクリプトを書くことになると思います。


To: 亮介 さん
> Acessで作成した「DBFファイルの内容を、Accessのテーブルに
> インポートする」

これは私には分かりませんので、識者の回答を待ちましょう。

いりや さん 2004年 04月 22日 19時 05分 29秒

kimuchi サン、

例えば、こんな html ファイルを用意されてみてはいかがでしょうか。
sample.html として保存してクリックしてみてください。

<html>
<title>
Sample HTML
</title>
<script>

function invokeRunMethod(path){
    var WScriptShell = new ActiveXObject('WScript.Shell');
    WScriptShell.Run(doubleQuote(path));
}

function openInMyEditor(path){
    var WScriptShell = new ActiveXObject('WScript.Shell');
    var executablePath = 'C:\\Program Files\\K2Editor\\K2Editor.exe';
    var commandLine = (new Array(doubleQuote(executablePath), doubleQuote(path))).join(' ');
    WScriptShell.Run(commandLine);
}

function doubleQuote(s) {
    var q = String.fromCharCode(34);
    return (new Array(q, s, q)).join('');
}
</script>
<body>
<h3>Microsoft Word files (c:\tmp\0.doc)</h3>
<ol>
<li><a href='c:\tmp\0.doc'>c:\tmp\0.doc</a>
: hrefに設定して開く</a>
<li><a href='sample.html' onClick='invokeRunMethod(this.innerText)'>c:\tmp\0.doc</a>
: WScript&gt;&gt;Run()から開く (フォルダオプションの設定(.doc)に基づく)
</ol>

<h3>Plain text files (c:\tmp\0.txt)</h3>
<ol>
<li><a href='c:\tmp\0.txt'>c:\tmp\0.txt</a>
: hrefに設定して開く</a>
<li><a href='sample.html' onClick='invokeRunMethod(this.innerText)'>c:\tmp\0.txt</a>
: WScript&gt;&gt;Run()から開く (フォルダオプションの設定(.txt)に基づく)
<li><a href='sample.html' onClick='openInMyEditor(this.innerText)'>c:\tmp\0.txt</a>
: WScript&gt;&gt;Run()から開く (K2Editor から開く)
</ol>
</body>
</html>

kimuchi さん 2004年 04月 22日 18時 02分 57秒

こんにちは。質問させてください。WEBサイト上から、ユーザーのパソコンのアプリケーションを起動させたいのです。たとえば、HPを見ている人が、ページ上のあるボタン(リンク?)をクリックして、Wordなどのアプリケーションを起動させることは可能でしょうか?よろしくお願いします。

亮介 さん 2004年 04月 22日 14時 16分 19秒

はじめまして。亮介と申します。
初心者なのですが、1点質問させて下さい。

Accessで作成した「DBFファイルの内容を、Accessのテーブルに
インポートする」というVBAを、VBScriptに変換することは
可能なのでしょうか?手間は結構かかるものでしょうか?

初心者なもので、チグハグな質問をしていたら申し訳ありません。
宜しくお願い致します。

Furusawa さん 2004年 04月 22日 13時 20分 03秒

また教えて頂きたい事が出てきましたので、よろしくお願い致します。

WSH、WMIどちらでも良いのですが、レジストリの特定キー削除を色々
試しているのですが、キー名にワイルドカードは使用できないのでしょうか?
例えば「HKEY_CURRENT_USER\Software\ABC_01」などというキー目の場合、
「HKEY_CURRENT_USER\Software\ABC*」では削除できませんでした。
レジストリのキー名ではワイルドカードが使えないのか、記述が間違っているのか、
わかりません。
今行おうとしているキー名はアプリケーションをバージョンアップすると
キー名が変更されてしまうんで、出来れば上記のような先頭文字だけで
削除できるようにしたいと考えています。
出来ないならあきらめますが、何か情報がありましたらよろしくお願い致します。

牧野 専峰 さん (tmakino@na.rim.or.jp) 2004年 04月 21日 18時 54分 41秒
URL:http://www.use.co.jp

管理人むたぐちさん
ありがとうございます
出来ました
えーこんなことなのとびっくりです!!
どうやって判定しているのか分からないですよね

管理人むたぐち さん 2004年 04月 21日 18時 40分 10秒

To: 牧野 専峰 さん

Fs.CopyFolder "C:\shidaxtest\shidax", "c:\test1\"
のようにすればできると思います。
環境にもよるかもしれません。

牧野 専峰 さん (tmakino@na.rim.or.jp) 2004年 04月 21日 18時 20分 54秒
URL:http://www.use.co.jp

FileSystemObjectを使ってフォルダーの内容をすべてコピーしたいのですが
指定したフォルダーのファイルはコピーされませんよね
これは、何かやり方があるのですか、現在は以下のようにしていますが
1個のステートメントでやりたいのです
Private Sub Command1_Click()

Dim folder As folder
If s.FolderExists("c:\test1") = False Then
s.CreateFolder "c:\test1"
End If

s.CopyFile "C:\shidaxtest\shidax\*.*", "c:\test1\"
s.CopyFolder "C:\shidaxtest\shidax\*", "c:\test1\"
End Sub

フォルダーの削除はすべてけしてくれるんですがね

ゆぎ さん 2004年 04月 21日 11時 08分 03秒

ファイルメーカー起動

To.管理人むたぐちさん
土屋さんのページに行ってみました。
ファイルメーカーの起動とスクリプトの実行は
問題なくできました。

ありがとうございます。

MAKOTO さん 2004年 04月 19日 18時 59分 04秒
URL:IEを終了できました

>管理人むたぐちさん
レス有難うございました。
問題なく思ったように動いてます。
教えて貰った、記述について勉強して覚えておきます。

MSのスクリプトセンターより下記を抜粋して使用したのですが、
Win98、WinMeで動かず困ってたとこでした。
___________________________
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colProcessList = objWMIService.ExecQuery _
("Select * from Win32_Process Where Name = 'Notepad.exe'")
For Each objProcess in colProcessList
objProcess.Terminate()
Next
________________________________

今回、有難うございました。
VBSの便利さが解りました。
VBSの書籍を購入して勉強してみたいと思います。


管理人むたぐち さん 2004年 04月 19日 17時 07分 13秒

「WSH」でGoogle検索すると…
Web全体でもお試しください。かなりびびりました。


To: みわ@WHSの迷い子 さん
> リモートWSH

他にDCOMの設定が必要なようですが、私はあまり詳しくありません。
過去にこの掲示板でも色々話が出てたような気がします。
DCOMをキーワードに探してみてください。

# DCOMって悪用ばっかりされてる印象がありますが…。WSHもですか。


To: ゆぎ さん
> VBSからファイルメーカーPro起動について

ファイルメーカーといえばつちやさんですね。
http://www2.jan.ne.jp/~kajika/
いろいろあるようです。


To: MAKOTO さん
> 起動しているIEを全て終了

もっとも単純には。

Set Shell = WScript.CreateObject("Shell.Application")
For Each oWindow In Shell.Windows
If TypeName(oWindow.Document)="HTMLDocument" Then
oWindow.Quit
End If
Next


To: バス さん
> VBスクリプト講座・応用編のLESSON15に

具体的には何行目でエラーになっていますか?

バス さん 2004年 04月 18日 01時 22分 44秒

下記の質問に対する追記なのですが、
使用しているのは
IE6.0
OS:WIN XP
になります。

まじ、素人なのでよくわかってません。
よろしくお願いします〜

バス さん 2004年 04月 18日 01時 17分 33秒

はじめまして。

VBS初心者の者です。
VBスクリプト講座・応用編のLESSON15に
あるスクリプトをそのままコピーして
使用したのですが、
オブジェクトを記述している行に対して
「オブジェクトがありません」
のエラーが出力されます。

これの原因について、よくあるパターンみたいなのが
あれば教えて欲しいです。
よろしくお願いします。

MAKOTO さん 2004年 04月 16日 14時 26分 37秒

VBSを使用して、IEのProxyの設定を行っています。
あるWEB上より、VBSを実行してProxyの設定を行いたいのです。

Set WShell = WScript.CreateObject("WScript.Shell")
RegPath = "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ProxyEnable"
RegData = 1
RegType = "REG_DWORD"
RegPath = "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ProxyServer"
RegData = "255.255.255.255:8080"
RegType = "REG_SZ"
WShell.RegWrite RegPath,RegData,RegType

上記の処理後に、起動しているIEを全て終了させたいのですが、イマイチ記述がわかりません。

宜しければ、お知恵をいただけないでしょうか?
当初はレジストリのインポートファイルを用いる予定だったのですが、
こちらのサイトを拝見して、VBSの方がさっぱりしていると感じた物で。
これを、機会にWSHの勉強しようと思えました。


Furusawa さん 2004年 04月 16日 11時 06分 06秒

お騒がせ致しました。
自己解決できましたのでご報告しておきます。
下位キーが存在した為駄目だったようですので、WMIを使用した
例で解決できました。
またわからない事がありましたら質問させて頂きます。
有難うございました。

ゆぎ さん 2004年 04月 16日 09時 48分 46秒

VBSを使い始めて3日です。

VBSからファイルメーカーPro起動について悪戦苦闘中です。
やりたいことは、
  1.VBSからファイルメーカProの起動
  2.VBSからファイルメーカProスクリプトの実行
  3.VBSでファイルメーカProスクリプトの終了確認
  4.VBSでファイルメーカProの終了
VBSもファイルメーカも、勉強し始めて日が浅いので
皆目見当がつきません。
よい方法はあるでしょうか。
どなたかご存知の方がいらっしゃれば、ご教授お願いします。

Furusawa さん 2004年 04月 15日 18時 42分 33秒

WSHを今日から勉強し始めました。
プログラム的な事も初めてですので、わからない事が多いですが、
講座を見ながら必死に勉強中です。
壁にぶつかりました。
レジストリの操作のところなのですが、RegDeleteでレジストリキーを
削除する事が出来ないのです。

今試しているコードは以下です。
'On Error Resume Next
Dim WSHShell
Set WSHShell = WScript.CreateObject("WScript.Shell")
WSHShell.RegDelete "HKCU\Software\psap\"

レジストリには「HKCU\Software\psap\」のキーはちゃんと存在します。
これで実行すると
行:    4
文字:   1
エラー:  レジストリキー"HKCU\Software\psap\"を削除できません。
コード:  80070005
ソース:  WshShell.RegDelete
と表示されます。
何か記述を間違えているのでしょうか?
テスト環境はWinXP Pro IE6.0 です。
ご指導よろしくお願い致します。

みわ@WHSの迷い子 さん (sesamix1103@yahoo.co.jp) 2004年 04月 15日 15時 39分 05秒

WSH5.6のリモート機能が動かず苦戦しております。

リモートWSHのセットアップはMicroSoftのページを参考にして以下のように設定しました。
【参考URL】
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/script56/html/wstsksetupofremotewsh.asp

3.サーバー上で Poledit.exe を使用して、リモート WSH を有効にします。
という項目については、管理人むたぐちさんが以前、掲示板に書かれていた

>対応するレジストリキーを直接編集してやる必要があります。
>リモートコンピュータHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows >Script Host\SettingsキーのRemoteという文字列値を0→1にすると、リモ>ートWSHの実行が許可されるようです。

を参考にして(※しかしRemoto文字列値はなかったので、自分で追加した)設定しました。

そしてサンプルプログラムをそのまま使用して、

var Controller = WScript.CreateObject("WSHController");
var RemoteScript = Controller.CreateScript("C:\\test.js","\\\\192.168.10.101");
WScript.ConnectObject(RemoteScript, "remote_");
RemoteScript.Execute();

while (RemoteScript.Status != 2) {
WScript.Sleep(100);
}

WScript.DisconnectObject(RemoteScript);

function remote_Error()
{
var theError = RemoteScript.Error;
WScript.Echo("Error " + theError.Number + " - Line: " + theError.Line + ", Char: " + theError.Character + "\nDescription: " + theError.Description);
WScript.Quit(-1);
}

実行させたのですが、
「オートメーションサーバーはオブジェクトを作成できません」
というエラーが出てしまいます。
原因がまったくわかりません・・・。リモートマシンの方の設定が足りないのでしょうか?
ご存知の方がいらっしゃいましたら、ご教授頂ければ幸いです。

imaimaibah さん (imaimaibah@yahoo.co.jp) 2004年 04月 14日 08時 58分 24秒

HiroBlueさん
ありがとうございます。
完璧です。マイクロソフトにこんないいサイトがあったなんて
知りませんでした。まだまだ検索能力が足りないようです。
ありがとうございました。

HiroBlue さん (hiroblue@lycos.co.uk) 2004年 04月 13日 23時 51分 22秒

>BIOS情報のシリアルの部分を取り出したいのですがどのようにしてよいのかわかりません。

以下参考になりませんでしょうか。

http://www.microsoft.com/japan/technet/treeview/default.asp?url=/japan/technet/scriptcenter/compmgmt/scrcm39.asp

imaimaibah さん (imaimaibah@yahoo.co.jp) 2004年 04月 13日 17時 15分 35秒

こんにちは。

WSH超初心者です。
BIOS情報のシリアルの部分を取り出したいのですがどのようにしてよいのかわかりません。
googleで調べては見たもののなかなか見つからず苦戦中です。
ひとつご教授いただけないでしょうか?

みわ@WHSの迷い子 さん 2004年 04月 12日 23時 25分 17秒

はじめまして。
WHSの迷い子です。

WHSに詳しい方がいらっしゃいましたら、ご教授お願いいたします。
実は、WHSにはWindows間のリモート操作をする機能があるということで、そのサンプルコード、あるいは詳しい情報を探しています(仕事で使うため自分で一から勉強する時間がありません・・・横着して申し訳ないのですが)。

MicroSoftのサイトは見たのですが、説明が難しく理解できませんでした。
リモートマシンの設定方法、等等面倒だ・・という話は聞いたのですが、
御存知の方がいらっしゃれば教えていただけないでしょうか?

【行いたい事】
WindowsXPマシンから、Windows2003サーバーの起動・停止を行いたい。サーバー内に起動・停止の為のバッチファイルはあらかじめ用意されているので、そこを叩ければよい。

参考になるサイト等の情報でも結構です!よろしくお願いいたします!

ばんのしゃーによかばんた さん 2004年 04月 12日 18時 47分 27秒

> 管理人むたぐち さん 2004年 04月 10日 18時 47分 38秒
> あ、もしかして、
> ' 同名ファイルがあったときの処理
> の実行中にエラーがあった場合に、捕捉できないってことかな。

そうです。エラー処理中のエラーには、特に気を付けないといけませんです。

話は変わって、

Windows 2000 Support Toolsのtlist.exeの応用例

> オックン さん 2003年 11月 04日 15時 05分 56秒
> エクセルの終了時にネットワークドライブを切断するために、
> WSHファイルを起動させて、4秒後にRemoveNetworkDriveを実行させています。
> しかし、エラーなどが頻発しているので、、
> 「4秒後」ではなく、「エクセルの終了後」に
> 実行するというコードに変更したいのですが期待通りの動作になりません。

Do While GetPid("excel.exe")<>-1
WScript.Sleep 1000
Loop

Function GetPid(name)
Set wShell=CreateObject("WScript.Shell")
Set oExec=wShell.Exec("""C:\Program Files\Support Tools\tlist.exe"" -p " & name)
GetPid=CLng(oExec.StdOut.ReadAll())
End Function

管理人むたぐち さん 2004年 04月 10日 18時 47分 38秒

あ、もしかして、
' 同名ファイルがあったときの処理
の実行中にエラーがあった場合に、捕捉できないってことかな。

Return