高橋 さん 2001年 01月 11日 13時 33分 03秒

LenB()関連、過去ログにありましたね。
お騒がせして申し訳ありません。m(_ _)m

>Kenji Yamamotoさん
>高橋さん:以下のツールを使うと、データ変換は楽にできそうです。
>ちょっとお試しいただけますか。
>私は職場のOutlookで、いつも、購読しているMLのログを mget uf で取り出して、
>こちらのツールで変換してOutlook2000のほうにドラッグアンドドロップで収納しています。
>結構便利です。
>
わざわざありがとうございます。
さっそくDLしてみたのですが、出力ファイル形式でOutlook(97/98/2000)が選べませんでした…
http://member.nifty.ne.jp/hont/mail/index.html のほうには取消線らしきものが引いてあり、
今は対応していないのかな? と思っています。

ところで、
>こちらのツールで変換してOutlook2000のほうにドラッグアンドドロップで収納しています。
>
ということは、.msgでしょうか?>MailExp出力ファイル

結局、「掲示板の記事をMUAで」という野望は、下記で出来ました。
1.wshbbs.vbs で.emlに保存
2.作成した.emlをOE5にドラッグアンドドロップ
3.Outlook2000でOE5のデータをインポート

>>結局、職場のOutlook2000にはインポートエンジンがインストールされておらず、
インポートウィザード中の記述を良く読んでいませんでした。「インターネットメールやアドレス
をインポート」で出来ました。
むたぐちさん、Kenji Yamamotoさん、ご迷惑をお掛けしました。m(_ _)m
# これで気兼ねなくログを読めます。
# と思ったら、急な打合せが…(−−;

# OE5のデータファイルをOutlook2000で読み込むと、なぜか受信日時が「なし」に。
# 送信日時はあるのに…

Kenji Yamamoto さん 2001年 01月 11日 08時 46分 19秒

管理人様:リロードしたら複数回書き込まれてしまいました。(T_T)
可能なら、以下の私のメッセージは同一文面ですので、削除をお願いしたいのですが。
申し訳ありませんが、宜しくお願いいたします。m(__)m

Kenji Yamamoto さん 2001年 01月 11日 08時 46分 17秒

管理人様:リロードしたら複数回書き込まれてしまいました。(T_T)
可能なら、以下の私のメッセージは同一文面ですので、削除をお願いしたいのですが。
申し訳ありませんが、宜しくお願いいたします。m(__)m

Kenji Yamamoto さん 2001年 01月 11日 08時 46分 15秒

管理人様:リロードしたら複数回書き込まれてしまいました。(T_T)
可能なら、以下の私のメッセージは同一文面ですので、削除をお願いしたいのですが。
申し訳ありませんが、宜しくお願いいたします。m(__)m

Kenji Yamamoto さん (kenjiaxl01@geocities.co.jp) 2001年 01月 11日 08時 44分 25秒

高橋さん:以下のツールを使うと、データ変換は楽にできそうです。
ちょっとお試しいただけますか。
私は職場のOutlookで、いつも、購読しているMLのログを mget uf で取り出して、
こちらのツールで変換してOutlook2000のほうにドラッグアンドドロップで収納しています。
結構便利です。

詳細は以下のURLから。

JWNTUG Newsletter - 2000.08.17 日号 (Vol.5/No.025)
[Soft] メールボックス移行・分割ツール MailExp
http://www.jwntug.or.jp/services/newsletter/view.html?no=20000817#5
メール分割移行「MailExp」
http://www.digico-m.com/shin1/
Outlook Express 5 Mail Converter
http://www02.so-net.ne.jp/~home/oe5conv/
VB5 ランタイムモジュール
http://www2.lint.ne.jp/~lrc/win/etc/vb5/vb53atx1.exe
よもやまメールデータ移行方法紹介のページ
http://member.nifty.ne.jp/hont/mail/index.html

以上

山本謙次

Kenji Yamamoto さん (kenjiaxl01@geocities.co.jp) 2001年 01月 11日 08時 44分 19秒

高橋さん:以下のツールを使うと、データ変換は楽にできそうです。
ちょっとお試しいただけますか。
私は職場のOutlookで、いつも、購読しているMLのログを mget uf で取り出して、
こちらのツールで変換してOutlook2000のほうにドラッグアンドドロップで収納しています。
結構便利です。

詳細は以下のURLから。

JWNTUG Newsletter - 2000.08.17 日号 (Vol.5/No.025)
[Soft] メールボックス移行・分割ツール MailExp
http://www.jwntug.or.jp/services/newsletter/view.html?no=20000817#5
メール分割移行「MailExp」
http://www.digico-m.com/shin1/
Outlook Express 5 Mail Converter
http://www02.so-net.ne.jp/~home/oe5conv/
VB5 ランタイムモジュール
http://www2.lint.ne.jp/~lrc/win/etc/vb5/vb53atx1.exe
よもやまメールデータ移行方法紹介のページ
http://member.nifty.ne.jp/hont/mail/index.html

以上

山本謙次

松島 さん (matsushima@popup.org) 2001年 01月 11日 01時 19分 07秒
URL:http://www.popup.org/ai/

はじめまして、松島と申します。
HTA関連のネタを探していて流れてきた者です。

HTAに、メニューバーを付けたい、と思っているのですが、
探せど探せど「これぞ!」というものが見つかりません。

とりあえず、
http://desktop.qut.edu.au/teched/us_99/TOOLS/V_STUDIO/9-201/MENU/MENU.HTM
を元に
http://db.popup.org/matsushima/temp/20010110/sample.html
を作ってみたのですが、まだまだ理想には遠いかな、といった感じです(^^;)。
(挙動関係の作りこみが甘いのと、表現力の問題が…)

標準でインストール済みのActiveX Controlか、HTCなどのみで実現させたい
のですが、なにかよいサンプルをご存知でしたら、教えていただければ嬉しいです。

よろしくお願いします。

高橋 さん 2001年 01月 10日 17時 48分 09秒

高橋です。
お世話様です。

>管理人むたぐちさん
>電卓
vbscalc2.vbsに書かれていたので、昔Downloadさせて頂いた
vbscalc.vbsを開いてみました…すごい発想ですね、これ。
M$-DOSでバッチ(ファイル)を作っている感じですね。(^^)
いや、ホントすごいです。
>=======================================================================
>'#ところで、vbscalc.vbsってのもあったんですが、お蔵入りとなりました。
>'Executeを利用しないと凄いことになります(^^;
>=======================================================================

>管理人むたぐちさん
>LenB()
VBSのみ使った方法でこちらの掲示板ログで試してみました。
# 条件は下記の通り
# かなりいい加減ですが…
# ソースは長くなるので、とりあえずおいておきます
CPU PentiumIII 550MHz
Memory 128MB
OS Windows OSR2.1
他PG (全停止)
掲示板ログサイズ 1.52MB
時間計測 JScriptのGetTime()で「終了 - 開始」

入力:掲示板ログからReadLine
出力:バイト長 タブ 入力文字列 → 出力用ファイル
10回実行し、平均16886ミリ秒でした。
やはりあまり速くない(遅い)です。
職場ではごく当り前に使っていますが…(^^;
速度が要求される場面では、やはりCやDelphiでCOM化したほうが有利ですね。

# 結局、職場のOutlook2000にはインポートエンジンがインストールされておらず、
# 「掲示板の記事をMUAで」という野望は、あえなく散りました…
# 現在、他の方法を画策中です。

管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2001年 01月 10日 17時 07分 35秒
URL:http://www.roy.hi-ho.ne.jp/mutaguchi/

To: こん さん

> 電卓をDLしてみたのですが
> msg=Replace(msg,":","")
> Execute "ans=" & msg
> ans=Eval ("ans")
> の意味がわかりません解説していただけませんか?

まず、Replace関数と、Executeステートメントと、Eval関数については、VBSのヘルプで
お調べください。

要するに、
1行目で、msgという文字列から":"を取り除く。(複数行を1行でまとめたコード対策…だったと思う)
2行目で、msgという文字列を、VBSのコードとして実行する。
たとえば、msgに"1+1"という文字列が入っていたら、ans=1+1というコードが実行される。
3行目で、2行目の実行結果ansに入っている値を、ansという変数に入れる。
上の例で行くと、ans=2 となる。
…ということになります。

ただ、これはかなり昔に作ったスクリプトで、今の私なら2〜3行目を合わせてこう書きます。
ans=Eval(msg)
この方が分かりやすいですね。

こん さん (gct1@lycos.ne.jp) 2001年 01月 10日 15時 32分 20秒

はじめまして
WSHを学び始めたものです
電卓をDLしてみたのですが
msg=Replace(msg,":","")
Execute "ans=" & msg
ans=Eval ("ans")
の意味がわかりません解説していただけませんか?
お願いします

管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2001年 01月 10日 15時 20分 39秒
URL:http://www.roy.hi-ho.ne.jp/mutaguchi/

To: なおきん さん

> 一つ質問なのですが,JScriptでtry catchが実行できないバージョン5未満での
> 環境で,エラー処理は行えますか?

http://www.microsoft.com/japan/developer/workshop/languages/jscript/handling.asp
を読むとわかりますが、方法はない、そうです。

# 知らなかった…。

なおきん さん 2001年 01月 10日 14時 11分 03秒

いつもこの掲示板に質問させて頂いています.
(大変(本気で)参考にさせていただいてます.

一つ質問なのですが,JScriptでtry catchが実行できないバージョン5未満での
環境で,エラー処理は行えますか?
例えば
regread(foobar)とかで,そのキーが読めたら(存在したら)そのまま,
読めなかったら(存在しなかったら),何か書く.
ようなケース(なんでもいいんですが)

で,try catchを使わないと,regread(存在しないキー)の時点で実行時エラーとして止まってしまいますよね?

これをバージョン5未満のtry catch使えない状況で,実現する方法ってありますか?

#なにかグローバル変数みたいなのないのかな・・・?

ご教授お願いします.

管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2001年 01月 10日 13時 56分 35秒
URL:http://www.roy.hi-ho.ne.jp/mutaguchi/

To: 高橋 さん

> Outlook2000の.PSTファイルに出来れば最高なんですが、いかんせん意味不明…

Outlook Expressの*.emlを読み込ませることはできないんでしょうか。
OutlookはOLEオートメーションで操作可能なので、インポートする別の方法があるかも
しれませんね。

> LenB()に関しては、職場でも話題が豊富です。
> なんとかならないものかと Users.gr.jp で過去ログを漁っていたところ、こんなの
> を見つけました。(ASP-ML)

いちばん簡単な方法として、一字一字、その文字が1バイトかそうでないかを
調べる方法が、よく挙げられていますね。
これだと、VBSの機能だけでできる反面、非常に時間がかかってしまうという
デメリットがあります。
この方法で数MBのテキストを調べるとき、実用的な速度が出るものでしょうか(^^;

高橋 さん 2001年 01月 09日 18時 08分 21秒

高橋です。
お世話様です。

>管理人むたぐちさん
>・WSHLab掲示板の記事をDatulaなどのMUAで読むスクリプト
>読んで字のごとく、この掲示板の記事をDatulaとかで読むためのスクリプトです。
>
これ、いいですね!
Outlook2000の.PSTファイルに出来れば最高なんですが、いかんせん意味不明…
(職場標準)
自宅はOEなので、オッケーなのですが。(^^)

>本当は、Datulaの*.idxファイルをスクリプトで構築させるつもりだったのですが、
>LenB関数が半角英数字でも2バイトを返すという、例のUNICODEによる弊害によって
>できなかったのです。
># セクター(512byteごとの境界)のはじめに各記事を配置しないといけないのですが、
># LenB関数がShift-JISの文字列長を正確に返さないので不可能です。
>
LenB()に関しては、職場でも話題が豊富です。
なんとかならないものかと Users.gr.jp で過去ログを漁っていたところ、こんなの
を見つけました。(ASP-ML)
ASP-MLを「ShiftJIS and コード」で検索すると、LenB()等に関する熱い議論を見る
ことができますよ。

管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2001年 01月 08日 02時 00分 07秒
URL:http://www.roy.hi-ho.ne.jp/mutaguchi/

ずいぶん書き込みが減っていますね(^^;
どうも私が忙しくなると、書き込みが増える傾向にあるようなないような。


To: Kenji Yamamoto さん

> こんにちは。早速、例のスクリプトを走らせてみました。

どうも、リクエスト And 動作報告、ありがとうございました。
結局、うちの掲示板でのサンプルになってしまいましたが(^^;

余談になりますが、このスクリプトはIE関係のコンポーネントを使用しているため、
IEのキャッシュを利用できるというメリット(副作用にもなりうるのですが)が
あります。

> サポート技術情報のページも、パターンは決まっています。(日米とも)

サポート技術情報のページも、いずれインポートできるようにしたいと思っています。
が、その前にちょっと面白いテーマをみつけたので、こちらから手をつけています。

http://kt.sakura.ne.jp/~timeflow/M/
http://kaede.sakura.ne.jp/~nikeno/incm/
を見るとわかるのですが、世の中には、掲示板ブラウザというのが結構存在します。
で、その中で、掲示板の記事を保持しておくためのCMTフォーマットというのが
あることを知りました。このCMTファイルを、mbxファイルあるいはemlファイルに
変換するスクリプトを作成中です。
これが完成すると(といってもこのスクリプト自体は簡単にできる)、掲示板の記事を
CMTフォーマットにするスクリプト*1さえあれば、どんな掲示板でもMUAで読めるように
なります。ツリー式掲示板なら、スレッド構造も維持してインポート可能です。

*1…INCMという掲示板ブラウザのプラグインとして、結構いろいろな種類のものが現存している。
ただし、PerlやRubyで書かれたものがほとんど。

さらに、CGIスクリプト自体が、CMTフォーマットに対応している例(Win98.FAQ掲示板で
使われているWeb Forumなど)もあり、これはダウンローダーさえ作れば簡単にCMTファイル化
することができるため、これも作る予定です。

問題は、現状では投稿がMUAからはできない、ということですが、これもちょっとした方法を
編み出したので、もしかすると実現するかもしれません。
具体的には、本文中あるいはヘッダに「返信用URL」を付け加えます。そのURLは、file://から
始まるローカルなURLにしておきます。それをクリックすると、あらかじめ用意しておいた、
投稿用フォームHTMLを実行するようにするわけです。

> 私はスクリプトにまだ詳しくないのでアレですが、こういう風に MUA に依存しないで処理できるのは、大変いいことだと思います。
> 正直感動しています。(大げさではなく。)

ええ、私も、WSHでこんなこともできるんだなあ、という感慨にふけっていました(^^;

Kenji Yamamoto さん (kenjiaxl01@geocities.co.jp) 2001年 01月 07日 19時 25分 15秒
URL:http://www.yamamotofamily.net/

こんにちは。早速、例のスクリプトを走らせてみました。
結構いい感じですね。アーカイブをEdMaxにインポートしました。
定期的に実行することで、むたぐちさんの掲示板もウォッチできるようになり、うれしい限りです。(^^)

サポート技術情報のページも、パターンは決まっています。(日米とも)
私はスクリプトにまだ詳しくないのでアレですが、こういう風に MUA に依存しないで処理できるのは、大変いいことだと思います。
正直感動しています。(大げさではなく。)
今後とも、宜しくお願いいたします。m(__)m
偶に参ります。それでは。
このメッセージは Lynx 2.8.14 /dev14 で作成しています。
# 改行がうまくいくといいな…(汗)

【おじさま】 さん (tomiyama@seagreen.ocn.ne.jp) 2001年 01月 05日 10時 33分 32秒
URL:http://homepage1.nifty.com/~tomiyama/

管理人むたぐちさん

明けましておめでとうございます。

>失礼しました。12/26の返信を抜かしていました。

いえいえ、私も家族旅行で今日までアクセスできませんでしたし。

重複起動の抑制については、やはりレジストリなどに自前で何か
お印を書き込むということになるのですね。

スクリプトそのものは実行ファイルではないのでそんな気はして
いたのですが。

ではでは、今年も宜しくお願いします。

管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2001年 01月 04日 17時 01分 50秒
URL:http://www.roy.hi-ho.ne.jp/mutaguchi/

○更新情報

・投稿王は誰だ!? for Datula
を再公開しました。再公開のいきさつはコメント行に書いておきました。
あと、ver1.5で動作しなくなっていたバグを修正してます。

・WSHLab掲示板の記事をDatulaなどのMUAで読むスクリプト
読んで字のごとく、この掲示板の記事をDatulaとかで読むためのスクリプトです。
ネットニュースで、「Microsoftのサポート技術情報をEdMaxで取り込む方法がある」という
話が出ていたので、それなら我らがDatulaでもと、作ってみたのです。
使い方等はコメント行に書いてあるので見てください。
結構新鮮な感じがしますよ。
投稿王は誰だ!? for Datulaと併用すれば、この掲示板の投稿王もわかります(^^;
# って、一番投稿しているのは私に決まってますが(爆)

本当は、Datulaの*.idxファイルをスクリプトで構築させるつもりだったのですが、
LenB関数が半角英数字でも2バイトを返すという、例のUNICODEによる弊害によって
できなかったのです。
# セクター(512byteごとの境界)のはじめに各記事を配置しないといけないのですが、
# LenB関数がShift-JISの文字列長を正確に返さないので不可能です。

それにしても正規表現使いすぎだ(^^;
正規表現は実に奥が深いですね。とりあえず
http://www.ceres.dti.ne.jp/~sugiura/hidemaru/qa/4_regulr.html
を見て自分のやりたいことのやり方をみつけ、
http://www.din.or.jp/~ohzaki/perl.htm
を見て、これははまるとやばいぞ、ということを認識した次第です。
なんでもかんでも正規表現使えばいいってもんでもないみたいです。

また、これは作成途中で思いつき急遽実装した機能ですが、AKiOSさんのWSH Lab.掲示板
記事検索スクリプト(HTA)と、記事ファイルの共有ができるようにしました。
さらに、このHTAのダウンロード用モジュールとして機能するようにしてみました。


To: うらら さん

> *.vbsのみでプログラムを作成しようとしています。
> JavaScriptは使用しない予定です。

となると、だいぶ対象が絞られてきますね。

VBSのFunctionプロシージャは

Function procname(option1,option2)
.
.
.
.
procname=...
End Function

というかんじで、値を呼び出し元に返すことができます。
呼び出し方はたとえば次のようになります。

MsgBox procname(a,b)

# よく考えると、このあたりの話はLesson6に書いてました。

HTMLの場合だと、たとえば

-main.htm-
<script language="vbscript" src="script1.vbs"></script>
<script language="vbscript" src="script2.vbs"></script>
<script language="vbscript">
Msgbox procname1(3,4)
MsgBox procname2(4,5)
</script>

-script1.vbs-
Function procname1(option1,option2)
procname1=option1 + option2
End Function

-script2.vbs-
Function procname1(option1,option2)
procname1=option1 * option2
End Function

のように、別ファイル化したスクリプト(*.vbs)内で定義された関数を
メインのHTMLから呼び出したりすることが可能です。

WSH2.0の*.wsfファイルでも、このように定義したプロシージャを含む*.vbsを
インクルード(具体的には<script>要素を複数使います)した場合、他のどの<script>
要素に書かれたスクリプトからも同様に呼び出し可能になります。
HTMLの場合と、ほぼ同様のふるまいをします。

うらら さん 2001年 01月 04日 13時 51分 12秒

To)むたぐち さん
お世話になります。

何事においても初心者のもので。説明不足ですみません。
*.vbsのみでプログラムを作成しようとしています。
JavaScriptは使用しない予定です。

では、宜しくご指導願います。

管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2001年 01月 03日 18時 17分 39秒
URL:http://www.roy.hi-ho.ne.jp/mutaguchi/

To: 【おじさま】 さん

失礼しました。12/26の返信を抜かしていました。
質問に答えるのが面倒だったとかじゃないです(^^;

> <Reference guid="00020813-0000-0000-C000-000000000046" />
>
> とやったらOKでした。
>
> <Reference guid="{00020813-0000-0000-C000-000000000046}" />
>
> もOKなのですが、どちらの記載が本当なのでしょう。

どっちでしょうね。まあ、どっちでも動くなら、どっちでもいいのでしょう(^^;

> 詳しいことはまるで分かりませんが、IE や FileSystemObJect などと
> 違ってタイプライブラリを直接指定してやらないと参照できないタイ
> プがあるってことでしょうか。多分 Word や Access も同様だと思い
> ます。

どうもそうらしいですね。タイプライブラリが別ファイルなのかもしれません。

> ところで WSF では Excel がない環境で動かした時などのエラートラ
> ップは可能なんでしょうか。<?job ?> は関係あります?

私も<?job ?>の挙動についてはよくわかっていないところがあります。
10-16 管理人むたぐち さん 2000/03/06 12:37 でもerror属性の働きがわからない、
と言ってました。
もしかすると、<script>内でのエラーをトラップするかしないかの宣言ではなくて、
<object>や<reference>で発生したエラーをトラップするものなのかも。
試してみる価値ありですね。

> それから VBS で CreateObject したものは不要になった時点で Nothing
> してやるのが望ましいということになっていると思いますが、WSF の
> <object> 要素の場合にはこれに相当する処理の必要はないのでしょう
> か。あるとしたらどこでどうするのでしょう。

これはわからないですね。
まあ、スクリプト終了時には勝手にNothingにしてくれてるんでしょう。

Nothingにしないといけない場合は、CreateObjectを使ってくれ、ってことなんでしょう。

> 最後に全然関係ない質問ですが、hogehoge.vbs の重複起動の抑制って
> できますか。一応過去ログは検索してみたのですが。

スクリプトの冒頭に、
If レジストリキーに記述がない Then
レジストリに書き込む
Else
WScript.Quit
End If

スクリプトの最後に
レジストリキーを削除

でOKではないでしょうか。
# これだと強制終了すると、二度と立ち上がらないな(^^;

WMIを使えばもっとかっこいい処理ができるかな、と思ったんですが、
Win32_Processには、プロセスのコマンドライン引数を取得するプロパティがないので
無理っぽいです。
(どのスクリプトも、wscript.exeで動いているということしかわからないので区別がつかない)

管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2001年 01月 03日 17時 09分 12秒
URL:http://www.roy.hi-ho.ne.jp/mutaguchi/

みなさま、あけましておめでとうございます。
今世紀は、COMとWSHが消え行く世紀ですが、.NETという「わけはわからんがなんだかすごそう」
なものが登場する世紀です。みなさん、期待しましょう。
とりあえず.NETがどんなもんであるか、知りたい方は、Win2000と.NET SDKを用意しましょう。
WSHユーザーでVBS使いの方は、拡張子vbのファイルを眺めるだけでもいいです(^^;
# なんでもできてしまうみたいだなあ…。すごい。

○更新情報

・Lines:ヘッダ付加 for Datula
は、私のため、というか、msnews.microsoft.comのために作ったツールです(^^;
あまり使う人もいないでしょうが、ソースは面白いかもしれません。
SendKeysと正規表現に今さらはまってます。

前回、正規表現のことはJSヘルプが詳しい、と書きましたが、最新版であればVBSヘルプにも
同じ内容のトピックがありますね。失礼しました。
ただ、VBSヘルプには、Multilineプロパティの説明がなかったりして駄目ですね。
それと、根本的に、VBSの正規表現は記述がめんどくさい、というのがあります。
/nantoka/gim とか指定できる簡便さにはかなわないですね。

ところで、「最初の空行までの文字列と、その空行以降の文字列をそれぞれサブマッチさせる」には
どうしたらいいんでしょう?

# 前回のスクリプト、修正がありました。ファイル名が大文字小文字を区別しないという基本的な
# ことを忘れていました(^^;

・テクニック集
shell:DriveFolder でマイコンピュータが開けるぞ、とかいう話です。microsoft.public.scripting.wsh
で出てました。
今年はまずテクニック集を拡充したいところです。あとはLesson、技術情報の順かな。


To: うらら さん

> プログラム1つ1つをモジュール化したいのです。
> メインのプログラムから別プログラムを呼び出し、
> Return値で何らかの値を返すといった形式なんですけど・・・

すいません、私がわからなかったのはもっと根本的なことで、「何のプログラムの話か」
ってことです。
プログラムといってもいろいろあります。スクリプトに限定してもいろいろな
シチュエーションが想定できます。

たとえば、

・JavaScriptを*.jsという外部ファイルにし、HTMLから呼び出す際、各jsファイルの関数の
返り値を得る方法
・VBScriptを*.vbsという外部ファイルにし、*.wsfファイル(WSH)からインクルードした際、
各vbsファイルのプロシージャの返り値を得る方法
・VBScriptを*.wscファイルでコンポーネント化し、それを*.js(WSH)からCreateObject
した場合、*.wscファイルで定義されたメソッドの返り値を得るようにする方法
・ASP中で…の話はあまりわからないので省略しますが、インクルードはできたはず。

ぱっと思いついたものだけでもいろいろあります。
これをスクリプトの話に限定しないとなると、さらに対象は増えてしまいます。

というわけで、どういう状況(プログラムの種類と言語)での話なのかについて、
情報をください。あ、私に答えられるかどうかはまた別の話ですが(^^;

うらら さん 2001年 01月 03日 01時 07分 31秒

うららです。
あけましておめでとうございます。

To)むたぐちさん
何の事だかわかりませんでしたか。すみません。

プログラム1つ1つをモジュール化したいのです。
メインのプログラムから別プログラムを呼び出し、
Return値で何らかの値を返すといった形式なんですけど・・・

これでわかりますか?

管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2000年 12月 31日 21時 53分 47秒
URL:http://www.roy.hi-ho.ne.jp/mutaguchi/

○今世紀最後の(ありがちなフレーズ)更新情報
スクリプトを2個追加しました。
どちらも割と便利に使えるんじゃないかと思います。

「ファイル名が重複しないように移動」では、初めて正規表現を使ってみました。
…それにしても、VBSのヘルプはわかりにくいなあ。
# patternプロパティの(pattern)の説明が間違っています。
# 「一致した部分は、Matches コレクションの…」ではなく、
# 「一致した部分は、SubMatches コレクションの…」が正解。

正規表現に関しては、JSのヘルプも同時に参照したほうがいいです。
なぜか、JSのヘルプにVBSの場合の説明があったりします(^^;

正規表現の機能自体は、VBS5.5でSubMatchesコレクションが追加されたことでJSに
追いついてきましたが、まだ未実装な機能もあるみたいです。
# これは配列に関しても同様ですね。

ReplaceメソッドとSubMatchesコレクションの使い方がわかったのが、今回の収穫かな。
これは結構使えますね。


To: 【おじさま】 さん

フォローありがとうございました。
おっしゃるとおり、cscript.exeの出力と、コマンドの出力は別々の方法で
リダイレクトしないといけません。

> ただ Win2k の場合には Command.com ばかりではなく Cmd.exe
> がありますので、これを使うことで何か方法があるかもしれま
> せんが、これは試していません。

cmd.exeもcommand.comと同様にリダイレクトが可能です。
/uオプションを使うと、UNICODEで出力したりもできます。


To: うちだ さん

> COMMAND及びCMD双方試してみましたが
> やはり別コンソールで動作してしまうらしく
> リダイレクトで1ファイルには保存出来ませんでした。

私はdirで試してみたんですが、【おじさま】さんの方法でうまくいきました。
この方法が使えるのは、内部コマンドだけなのかもしれません。

> わかりやすいHPでとても重宝しています。

うちのページが何かのお役に立っているなら、うれしいですね。


To: 高橋 さん

> M$のページに、WSH5.6の話が載っていますので、一読されてみてはいかが
> でしょうか(ベータ版)。
> http://www.microsoft.com/japan/developer/workshop/languages/clinic/scripting11132000.asp

どうもありがとうございます。
そうですね、WSH5.6があればすべて解決です。
うちださんのような要望が、全世界から寄せられていたのでしょうね(^^;


To: うらら さん

> Functionとして作成した処理の結果を
> Return値として受け取るにはどうしたら良いのでしょうか?
>
> Functionとして作成しているプログラムとFunctionをCallしている
> ものは、別物です。
> 実行した結果を受け取りたいんですけど・・・

うーん、ちょっとこれだけでは何のことかわかりません。
呼び出す側と呼び出される側がそれぞれ何なのか、明確にしていただかないことには…。


それではみなさま、良いお年を。

うちだ さん 2000年 12月 28日 19時 31分 06秒

うちだです。
高橋さん、貴重な情報ありがとうございます。
早速、参考にさせて頂きます。
ありがとうございました。

うらら さん 2000年 12月 28日 17時 30分 04秒

初めて利用させて頂きます。うららと申します。
宜しくお願いいたします。

Functionとして作成した処理の結果を
Return値として受け取るにはどうしたら良いのでしょうか?

Functionとして作成しているプログラムとFunctionをCallしている
ものは、別物です。
実行した結果を受け取りたいんですけど・・・

所有している書物では調べてのですが、
わからなかったので。(;_;)

初歩的な事だと思いますが回答を宜しくお願いいたします。



MIFFY さん (miffy@newyork.co.jp) 2000年 12月 28日 10時 14分 39秒

管理人むたぐち さんへ
迅速な解答ありがとうございました。
参考になりました。
これからも宜しくお願いいたします。

高橋 さん 2000年 12月 27日 21時 26分 14秒

高橋と申します。
よろしくお願いいたします。

>うちださん
M$のページに、WSH5.6の話が載っていますので、一読されてみてはいかが
でしょうか(ベータ版)。
http://www.microsoft.com/japan/developer/workshop/languages/clinic/scripting11132000.asp

−−一部引用−−
>WSH 5.6 では、親スクリプトの環境変数をすべて共有するコマン
>ド プロセスでプログラムやスクリプトを開始する機能を導入し
>ました。また、親スクリプトが子プロセスからのあらゆる出力を
>キャプチャできます。効果的な手段がほとんどなく、出力をテキ
>スト ファイルにキャプチャし、そのテキスト ファイルを読み取
>るようなプログラムを実行する必要がなくなったので、この最後
>の機能は特に役に立ちます。
>

うちだ さん (moon_99@yahoo.co.jp) 2000年 12月 27日 17時 02分 08秒

TO おじさま

詳細な説明ありがとうございます。

COMMAND及びCMD双方試してみましたが
やはり別コンソールで動作してしまうらしく
リダイレクトで1ファイルには保存出来ませんでした。

WIN2KにCMD.exeがある事を知らなかったので
大変ためになりました。
本当にありがとうございます。

TO 管理人さん
わかりやすいHPでとても重宝しています。
またこれからもWSHを使用する為お世話になる事があると
思いますのでよろしくお願い致します。

【おじさま】 さん (tomiyama@seagreen.ocn.ne.jp) 2000年 12月 27日 11時 35分 53秒
URL:http://homepage1.nifty.com/~tomiyama/

うちださん

手元に Win95/98 環境がありませんので比較はできませんが
Win2k の場合には確かに

command /c cscript //nologo フルパスファイル名.VBS > ログファイル名

この方法ですと Cscript.exe の出力結果のみがリダイレクト
されます(//nologo を消すと良く分かります)。

VBS の中で DOS のプログラムを実行すると、Cscript.exe が
動いているコンソールとは別に DOS プログラムを動かすコン
ソールが立ち上がりますので、上記コマンドラインのリダイレ
クトはあくまで Cscript.exe が動いているコンソールでのみ
有効で、DOS プログラムのコンソールには有効にならないとい
うのは、むしろ自然な気がします。

ですから VBS の中に記載された DOS プログラムのリダイレク
トは、VBS の中でやってやる必要があるように思います。

あまり自信はありませんが、Win2k で Command.com を使う限り、
Wscript の Echo も DOS プログラムの出力結果も両方ともリダ
イレクトするならば

WScript.Echo "Test"
Set oWShell = CreateObject("WScript.Shell")
oWShell.Run "command /c DOS プログラムのフルパス>>ログファイルのフルパス"
Set oWShell = Nothing

こんな感じで

command /c cscript //nologo フルパスファイル名.VBS>ログファイルのフルパス

こうなってしまうのかもしれません。

ただ Win2k の場合には Command.com ばかりではなく Cmd.exe
がありますので、これを使うことで何か方法があるかもしれま
せんが、これは試していません。

うちだ さん 2000年 12月 26日 20時 32分 04秒

管理人どのへ
すみません。同質問を掲示してしまいました。
削除を願います。↓

うちだ さん (moon_99@yahoo.co.jp) 2000年 12月 26日 20時 25分 43秒

始めまして最近見させて頂いています。
WSH初心者ですがよろしくお願いします。

WSHでのリダイレクションについて質問をさせて下さい。

VBSよりC言語のプログラムを実行しC言語にてprintfした内容を
リダイレクションにてlogに保存したいのですが、
win95(ie5.5)の環境では正常にEcho、C言語のprintfが
ファイル出力されたのですが
WINNT・WIN2k(ie5.5)の環境ではVBSのEcho等は出力されるのですが
C言語のprintfが出力されません。
WSHはすべて最新の環境です。
95とNTで何か実行の方法が違うのでしょうか?
実行方法は
command /c cscript //nologo フルパスファイル名.VBS > ログファイル名
です。

ご指導の程、宜しくお願い致します。

うちだ さん (moon_99@yahoo.co.jp) 2000年 12月 26日 19時 07分 13秒

始めまして最近見させて頂いています。
WSH初心者ですがよろしくお願いします。

WSHでのリダイレクションについて質問をさせて下さい。

VBSよりC言語のプログラムを実行しC言語にてprintfした内容を
リダイレクションにてlogに保存したいのですが、
win95(ie5.5)の環境では正常にEcho、C言語のprintfが
ファイル出力されたのですが
WINNT・WIN2k(ie5.5)の環境ではVBSのEcho等は出力されるのですが
C言語のprintfが出力されません。
WSHはすべて最新の環境です。
95とNTで何か実行の方法が違うのでしょうか?
実行方法は
command /c cscript //nologo フルパスファイル名.VBS > ログファイル名
です。

ご指導の程、宜しくお願い致します。

サラ さん 2000年 12月 26日 18時 37分 16秒

To むたぐち さん
回答ありがとうございます。
>IEがクッキーファイルをopenしているからかなあ、という気もしますが
>よくわかりません。
私もそう思ったんですが、普通に削除できるので
よくわからないです。

>私の環境(Win98SE+IE5.01sp1)では
>fs.deletefile "c:\windows\cookies\*.*"
>で消せました。
もう1回やってみます。
わざわざ試して頂いて本当にありがとうございました。

管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2000年 12月 26日 14時 47分 57秒
URL:http://www.roy.hi-ho.ne.jp/mutaguchi/

To: サラ さん
> フォルダを自分が作ったテスト用の物を指定すると
> きちんと動作するのですが、windows\cookies を
> 指定すると、ファイル削除のところで”書きこみできません”
> とエラーがでます。
> cookiesフォルダには書きこみ禁止のファイルもないですし、
> trueオプションもつけているのですが、なぜでしょう?

うーん、なぜでしょうね?
IEがクッキーファイルをopenしているからかなあ、という気もしますが
よくわかりません。

私の環境(Win98SE+IE5.01sp1)では
fs.deletefile "c:\windows\cookies\*.*"
で消せました。



To: 岡本といいます。 さん

> >For Each...Nextでしか各要素にアクセスできません。
> >これは仕様ですね。
> 少し残念ですが、この方法では無理!というのが分かっただけでも良かったです。

実はFor Eachでしか駄目、というわけではなく、サブフォルダ名を指定すれば
いけるのですが(↓の書き込み参照)、列挙するのは無理ですね。

> SAP社R/3というERPパッケージの開発言語(ABAP)では、R/3上で動作する言語
> のほかに、VBスクリプトと同じぐらいコンポーネントとか使用できるんです。
> よく、ABAPに移植する為にここのサイトで勉強させてもらっってます。

というと、FileSystemObjectを呼び出して利用できるってことですね。
ABAPって、ActiveX Scriptなのでしょうか。


To: まさはる さん

> To:管理人たむぐちさん

また間違われてしまった(;_;)

> 初歩的な質問にお答え頂き、ありがとうございます。今後ともよろしく
> お願い致します。

いえいえ、こちらこそ。


To: Makoto さん

> SafeArray はメソッド、プロパティを持っていないので
> Array.Count でエラーになります (Array(0).Count ではなく)
> これで簡単に区別できるかな...

私、単純に0から要素数-1の要素があるオブジェクトや配列のことをSafeArrayと
いうものだとばかり思っていたんです(^^;

> Item がとりうる引数は コンポーネントによります

なるほど。
でも、数値を指定できたほうがいろいろ便利だと思うんですが(^^;
ちなみに、Shell.ApplicationのFolderItemsコレクションなら、
数字でもファイル名でも指定できるので便利です。
(つまり For I=0 To n とFor Each x In y 両方使える)

>  [id(0xfffffffc), propget, restricted, hidden]
>  IUnknown* _NewEnum();
> の restricted は スクリプト言語からのアクセスが不可能であるという属性で
> オブジェクトブラウザで見えなかったり、VB(S) から直接使えないのはこのためです

FileSystemObjectのFoldersコレクションでは、hiddenかつrestrictedなので、
オブジェクトブラウザで「非表示のメンバを表示」しても見えないわけですね。
一方、Shell.ApplicationのFolderItemsコレクションなら、「非表示のメンバを表示」
すると、_NewEnumプロパティが見えるんですが、おそらくhiddenであるものの
restrictedではないからなんでしょうね。

【おじさま】 さん (tomiyama@seagreen.ocn.ne.jp) 2000年 12月 26日 14時 30分 30秒
URL:http://homepage1.nifty.com/~tomiyama/

管理人むたぐちさん

>WSH2.0からの*.wsfファイルを使えば、定数値をそのまま記述することが
>できますが、WSH1.0では駄目ですね。
>詳しくは「WSH2.0の新機能」をどうぞ。

.wsf って何だ? などど書くと折角あれだけ詳しく解説されている
むたぐちさんに叱られてしまいますね(^^;)。

早速調べてみました。Excel で試しましたが

<Reference object="Excel.Application" />
<Reference object="Excel.Application.9" /> こういうのもあったので

どちらも参照するタイプライブラリがないというエラーになってしま
います。object="progID" がダメならもうひとつの guid="typelibGUID"
はどうだろうとレジストリで探して

<Reference guid="00020813-0000-0000-C000-000000000046" />

とやったらOKでした。

<Reference guid="{00020813-0000-0000-C000-000000000046}" />

もOKなのですが、どちらの記載が本当なのでしょう。テストに使っ
た WSF ファイルはこんな感じです。適当に Excel の定数名を選んだ
のですが、ちゃんとオブジェクトブラウザと同じ値を返しました。

<Job id="ReferenceExample">
<Reference guid="00020813-0000-0000-C000-000000000046" />
<Script language="VBScript">
MsgBox "&H" & Hex(xlNormal)
MsgBox "&H" & Hex(xlHAlignCenter)
</Script>
</Job>

ちなみに

<Object id="oXL" progid="Excel.Application" reference="no" />

これはOKですが

<Object id="oXL" progid="Excel.Application" reference="yes" />

これはやはり参照するタイプライブラリがないというエラーになりま
す。

詳しいことはまるで分かりませんが、IE や FileSystemObJect などと
違ってタイプライブラリを直接指定してやらないと参照できないタイ
プがあるってことでしょうか。多分 Word や Access も同様だと思い
ます。

ところで WSF では Excel がない環境で動かした時などのエラートラ
ップは可能なんでしょうか。<?job ?> は関係あります?

それから VBS で CreateObject したものは不要になった時点で Nothing
してやるのが望ましいということになっていると思いますが、WSF の
<object> 要素の場合にはこれに相当する処理の必要はないのでしょう
か。あるとしたらどこでどうするのでしょう。

最後に全然関係ない質問ですが、hogehoge.vbs の重複起動の抑制って
できますか。一応過去ログは検索してみたのですが。

Makoto さん 2000年 12月 26日 01時 46分 48秒

Makoto です。

To:むたぐち さん

SafeArray はメソッド、プロパティを持っていないので
Array.Count でエラーになります (Array(0).Count ではなく)
これで簡単に区別できるかな...

>> Itemメソッドはあります、が、キーとして数字のインデックスを与えることはできません。

Item がとりうる引数は コンポーネントによります
Item の引数が VARIANT 型でも、数値しか与えられない物もあるでしょう
文字列のみであることもしかり
コンポーネントがどの型に対応してるか、です
これは Item に限らず VATINAT を扱うプロパティ、メソッドにあてはまります


>>まず、_NewEnumプロパティはありません。オブジェクトブラウザで非表示の

_NewEnum は VB やスクリプトから使えないようになっています
私は OLE/COM Object Viewer 派の人なので
オブジェクトブラウザで見えないのを考慮しませんでした(^^;
以下、WScript.exe のタイプライブラリ情報を Object Viewer で見る手順を書きます

File メニュー -> View TypeLib で wscript.exe を読み込むと
新しくウインドウが開きます
見易くするため View メニュー -> Group by type kind にします
すると CoClasses という項目があると思います
これが、オブジェクトの情報です
その中の coclass Folders が Folderコレクションです
Folders は IFolderCollection というインターフェイスを実装していて
(I で始まるのはインターフェイスを意味するプレフィックス)
IFolderCollection は Add, Item, _NewEnum, Count という
プロパティとメソッドを持っているとわかります

 [id(0xfffffffc), propget, restricted, hidden]
 IUnknown* _NewEnum();
の restricted は スクリプト言語からのアクセスが不可能であるという属性で
オブジェクトブラウザで見えなかったり、VB(S) から直接使えないのはこのためです

ちなみに coclass IHost_Class が
wscript.exe(cscript.exe) が内部でもっている WScriptオブジェクト です

ひっし さん 2000年 12月 25日 23時 45分 42秒

シロベさん、返答ありがとうございました。
返事が遅れて、すいません。環境が変わってやっと
メールができるようになりました。
 シロベさんの教えてくださった方法で、直してみたのですが、
VBの場合ちょっと巧く行かなくて頑張っています。もう少し
正規表現について、勉強して完成すればいいなって思ってます。
シロベさんのソースは、とても参考になり、ありがとうござい
ました。また、行き詰まったりしたらこちらに書き込みをして
お聞きするかもしれないので、宜しくお願いします。

まさはる さん (kkato@webserve.ne.jp) 2000年 12月 25日 15時 16分 36秒

To:管理人たむぐちさん

> > SaveAsメソッドの後ろにある「44」の番号はExcelの定数だと
> > 思うのですが、これらの情報を探すことが出来ません(;;)。もし
> > HPや書籍等でご存知のところがありましたら、教えて頂けないで
> > しょうか。出来ればOffice全般を把握できれば幸いに思います。
>
> VBAのオブジェクトブラウザ(F2キーで起動)で、SaveAsメソッドを
> 調べてみてください。
> おそらく、SaveAs(filename As String, flag As hogehoge)
> のような説明が出ると思います。ここで、"hogehoge"をクリックすると、
> "hogehoge"の定数値(構造体の場合もあるが…)の一覧が出ると思います。
> 各定数名を見れば、その意味するところは大体想像できますし、実際の
> 定数の値も
> 参照できます。
>
> 完全に想像ですが、44というのは、上書き禁止とか、HTML形式にするとかの
> フラグを表す数値の合計だと思います。
>
> # というか、ヘルプに載ってたりしません?
>
ありがとうございました。

オブジェクトブラウザを使って「wookbook」の「fileformat」プロパティを
調べると、下に「Property FileFormat As XlFileFormat」が出ます。
ここで「XlFileFormat」をクリックすると定数の一覧が出て、そこで
今回使用した定数の実際の値「44」まで参照することが出来ました。

ちなみにヘルプからこの値を探し出すことは出来ませんでした。

初歩的な質問にお答え頂き、ありがとうございます。今後ともよろしく
お願い致します。

岡本といいます。 さん (takahiro_okamoto@solver.co.jp) 2000年 12月 25日 12時 11分 12秒

To: 管理人むたぐち さん

回答ありがとうございました。
>For Each...Nextでしか各要素にアクセスできません。
>これは仕様ですね。
少し残念ですが、この方法では無理!というのが分かっただけでも良かったです。

>For Each...Nextではなく、
>> objff.SubFolders.Count分ぐるぐる回して
>> 一覧表示する良い方ありませでしょうか?
SAP社R/3というERPパッケージの開発言語(ABAP)では、R/3上で動作する言語
のほかに、VBスクリプトと同じぐらいコンポーネントとか使用できるんです。
よく、ABAPに移植する為にここのサイトで勉強させてもらっってます。

サラ さん 2000年 12月 25日 02時 18分 36秒

またもや質問ですいません。
今、クッキーを消去するようなスクリプト
を作っているのですが、
フォルダを自分が作ったテスト用の物を指定すると
きちんと動作するのですが、windows\cookies を
指定すると、ファイル削除のところで”書きこみできません”
とエラーがでます。
cookiesフォルダには書きこみ禁止のファイルもないですし、
trueオプションもつけているのですが、なぜでしょう?
手動での削除はできました。お手数ですが、ご解答おねがいします。

サラ さん 2000年 12月 25日 01時 39分 05秒

>管理人むたぐち さん
レスありがとうございます。
ご指摘の通りディレクトリを*で指定していたのが
いけなかったようです。

管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2000年 12月 25日 01時 04分 09秒
URL:http://www.roy.hi-ho.ne.jp/mutaguchi/

To: ガリー.jr さん

> ガリー.jrです。覚えてますか?(別に覚える必要ないけど)

覚えてますよ(^^;
そんなに物覚えのいいほうではないんですけど(^^;

> また、困った事があったのでやってきました。今回の困った
> 事と言うのは、VBSでアプリを非表示で起動して、しばらく
> してから表示するというのをやりたいのですが、やり方が見
> つからないということです。

そのアプリが、二重起動抑制機能をもっているということが前提と
なりますが、
WshShell.Run "hoge.exe",0,True
として、まず非表示で立ち上げ、WScript.Sleepでウェイトを取った後、
WshShell.Run "hoge.exe",1,True
とすればいけそうな気がします。


To: 【おじさま】 さん

> 記憶があやふやですが、ヘルプには定数名しか書いていなくて、
> 当然この定数名は WSH では定義してやらないと使えないのです
> が、実際の値は Word のヘルプにはなかったように思います。

それは迷惑な話ですね。
VBAで使うことを前提にしているからなんでしょうが…。

WSH2.0からの*.wsfファイルを使えば、定数値をそのまま記述することが
できますが、WSH1.0では駄目ですね。
詳しくは「WSH2.0の新機能」をどうぞ。

> オブジェクトブラウザなら出てくると思いますが、私は Office
> のオブジェクトブラウザの使い方を知らないので VB6 のを使い
> ました。

Visual Basicエディタを立ち上げてF2キーです。
使い方はVB6と同じです。

> うです。これもちゃんと調べていないのであやふやですが、どう
> も Office については変数名は同じでも実際の値はバージョンに
> よって異なる場合があるようです。

それもまた迷惑な話だ(^^;
wsfファイルで対処するしかないですね。
# HTAはどうしたらいいのだろうか…。


To: Makoto さん

いつもありがとうございます。
やっぱり、COMのことやWindowsプログラムのことは、ぜんぜん理解していない
私でした。

> そのため Microsoft が用意した、大きさのわかる配列の型が SafeArray です
> (IDL、タイプライブラリでは SAFEARRAY)
> たぶん「大きさがわかってて安全だ」という感じで名前が付いたのでしょう

なるほど。MS用語だったのですか。

> あと、オブジェクトがコレクションである条件は
> _NewEnum プロパティ
> Count プロパティ
> Item メソッド
> が実装されているものをいいます

FileSystemObjectのFoldersコレクション(と、ヘルプには書いてあります)は、
これを満たすのでしょうか。
まず、_NewEnumプロパティはありません。オブジェクトブラウザで非表示の
メンバを参照しても駄目です。でも、For Eachでアクセスできます。
Countプロパティはあります。
Itemメソッドはあります、が、キーとして数字のインデックスを与えることはできません。
Foldersコレクションでいくと、フォルダ名を指定することはできます。
例:
msgbox Fs.GetFolder("C:\").SubFolders("Windows").Path

というわけで、Foldersコレクションはコレクションなのかどうか、
私にはよくわかりません(^^;


To: サラ さん

> 初歩的質問ですが、fs.DeleteFile で
> ファイルを消す際、あるフォルダのファイル全てを
> 消したいのですが、*.*は使えないようです。

え、できますけど?
ワイルドカードが使えるのは、ファイル名の部分だけ(つまり、C:\*\*.txtとかはNG)
ということに注意してください。

サラ さん 2000年 12月 25日 00時 04分 33秒

はじめまして
初歩的質問ですが、fs.DeleteFile で
ファイルを消す際、あるフォルダのファイル全てを
消したいのですが、*.*は使えないようです。
どーすればイイか教えてください。

Makoto さん 2000年 12月 24日 05時 55分 38秒

みさなんこんにちは
久しく登場します、Makoto と申します

To:むたぐち さん
>>Foldersコレクションは、いわゆるSafeArrayなのです。
>># いつも「何で"安全配列"なんだ?」と思う(^^;

C言語や低級言語だと、配列=アドレスで、配列のサイズはわかりません
(直接的に記述した場合)
しかし、COM では、サイズのわかってない配列はやりとりできません
なので、C言語等で COM の配列をアクセスするとき
サイズを与えてやる必要があります
そのため Microsoft が用意した、大きさのわかる配列の型が SafeArray です
(IDL、タイプライブラリでは SAFEARRAY)
たぶん「大きさがわかってて安全だ」という感じで名前が付いたのでしょう

あと、オブジェクトがコレクションである条件は
_NewEnum プロパティ
Count プロパティ
Item メソッド
が実装されているものをいいます
VB, VBS の For Each では _NewEnum が内部で呼ばれます
_NewEnum は列挙型オブジェクトを返します
列挙型オブジェクトは、さらに子供のオブジェクトを指してるのが普通です

SafeArray で Variant型を扱い、さらに Variant でオブジェクトを扱うと
コレクションと間違え易いかもしれませんが
コレクションと SafeArray はまったく別ものなので区別しましょう!

JScript だと
SafeArray[0]
Collection(0) 略さないと Collection.Item(0)
って区別できる?!

【おじさま】 さん (tomiyama@seagreen.ocn.ne.jp) 2000年 12月 23日 13時 00分 16秒
URL:http://homepage1.nifty.com/~tomiyama/

管理人むたぐちさん

># というか、ヘルプに載ってたりしません?

以前 Word を WSH で使って HTML をリッチテキストに変換する
のを書いたことがあります。今回の Excel を使ったのと理屈は
同じです。

記憶があやふやですが、ヘルプには定数名しか書いていなくて、
当然この定数名は WSH では定義してやらないと使えないのです
が、実際の値は Word のヘルプにはなかったように思います。
オブジェクトブラウザなら出てくると思いますが、私は Office
のオブジェクトブラウザの使い方を知らないので VB6 のを使い
ました。

で、Word のは私が使うのではなく別な人が必要としたのですが、
その人の環境では動かなくて調べたところ Word のバージョンが
違っていました。私と同じバージョンの Word にしたら動いたそ
うです。これもちゃんと調べていないのであやふやですが、どう
も Office については変数名は同じでも実際の値はバージョンに
よって異なる場合があるようです。ヘルプには変数名しか載って
いないのはこれが理由かもしれないとその時には思いました。

ガリー.jr さん 2000年 12月 23日 10時 44分 18秒

ガリー.jrです。覚えてますか?(別に覚える必要ないけど)
また、困った事があったのでやってきました。今回の困った
事と言うのは、VBSでアプリを非表示で起動して、しばらく
してから表示するというのをやりたいのですが、やり方が見
つからないということです。失礼ですがまたご指導お願いし
ます。

管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2000年 12月 23日 02時 16分 18秒
URL:http://www.roy.hi-ho.ne.jp/mutaguchi/

To: 岡本といいます さん

> > objff.SubFolders.Count分ぐるぐる回して
> > 一覧表示する良い方ありませでしょうか?
>
> 0からobjff.SubFolders.Count-1の間でぐるぐる回してください。
> Foldersコレクションは、いわゆるSafeArrayなのです。

あ、これ嘘でした。私、よく勘違いしてしまうのですが、Foldersコレクションは
SafeArrayではありません。
For Each...Nextでしか各要素にアクセスできません。
これは仕様ですね。

# JScriptでは、コレクション内の要素を列挙するための、Enumeratorオブジェクトが
# あります。これって本家JavaScriptには無い機能です。
# PerlScriptでは、どうやってアクセスするんだろう?
# ActiveScriptRubyは大丈夫なのか?

で、本題に戻るのですが…。

For Each...Nextではなく、

> objff.SubFolders.Count分ぐるぐる回して
> 一覧表示する良い方ありませでしょうか?

としなければいけない理由は何なのでしょうか。
それが分かれば、別のアプローチで攻めてみようと思うのですが、
私にはその理由がわからないので、教えてくださいませ。

管理人むたぐち さん (mutaguchi@roy.hi-ho.ne.jp) 2000年 12月 23日 01時 57分 21秒
URL:http://www.roy.hi-ho.ne.jp/mutaguchi/

おお、なんか書き込みが多いですね。


To: ONO さん

> 私のサイトにあげてあるWSHを利用してExcelファイルをHTMLファイルとして
> 保存するサンプルです。

フォローありがとうございました。
# Excelは持っているのですが、スクリプトから制御したことはまだありません(^^;

> Set FS=CreateObject("Scripting.FileSystemObject")
> fName = FS.GetParentFolderName(WScript.ScriptFullName)
> fname = Replace(fname, "%20", " ")
> sname = fname & "\test.htm"

本題とは関係ないのですが、ちょっと気になったので…。
WScript.ScriptFullName、つまりスクリプトのパスに、スペースが含まれている場合、
%20に変換されることがあるのでしょうか。
同様の現象は、HTAでは発生することを確認しているのですが…。
参考記事:
13-28 【おじさま】 さん 2000/04/28 11:34


To: まさし さん

> すいません 管理人むたぐちさんの名前を
> 間違えて呼び捨てで書いてしまいました。
> 大変失礼しました。

いえいえ、「管理人」という役職名があるので呼び捨てではありません。(多分)

むしろ、「管理人」と言われる方が違和感があるかも。
自分で名乗っておいてこう言うのもなんですが。
# やっぱり、管理人は管理人を名乗るべきかと思っていたのですが、
# 別に必要ないような気がしてきました(^^;

なんにせよ、お役に立てたようで良かったです。


To: まさはる さん

> SaveAsメソッドの後ろにある「44」の番号はExcelの定数だと
> 思うのですが、これらの情報を探すことが出来ません(;;)。もし
> HPや書籍等でご存知のところがありましたら、教えて頂けないで
> しょうか。出来ればOffice全般を把握できれば幸いに思います。

VBAのオブジェクトブラウザ(F2キーで起動)で、SaveAsメソッドを調べてみてください。
おそらく、SaveAs(filename As String, flag As hogehoge)
のような説明が出ると思います。ここで、"hogehoge"をクリックすると、
"hogehoge"の定数値(構造体の場合もあるが…)の一覧が出ると思います。
各定数名を見れば、その意味するところは大体想像できますし、実際の定数の値も
参照できます。

完全に想像ですが、44というのは、上書き禁止とか、HTML形式にするとかの
フラグを表す数値の合計だと思います。

# というか、ヘルプに載ってたりしません?


To: 岡本といいます さん

# ん、岡本さんとお呼びしたらいいのかな?

> このロジックの中で、
> For Each w_fix In objff.SubFolders
> tmpString = tmpString & w_fix.Name & chr(13)
> Next
> の部分を
> objff.SubFolders.Count
> の間、ぐるぐる回さなくてはならないことになってしまったのですが、
> objff.SubFolders.Item(1からぐるぐる).Name
> とすると「プロシジャの呼出し、または引数が不整です」となってしまいます。
> objff.SubFolders.Count分ぐるぐる回して
> 一覧表示する良い方ありませでしょうか?

0からobjff.SubFolders.Count-1の間でぐるぐる回してください。
Foldersコレクションは、いわゆるSafeArrayなのです。
# いつも「何で"安全配列"なんだ?」と思う(^^;


To: シロベ さん

> 置換の部分だけですが、試してみてください。

フォローありがとうございます。
私にはわからない質問へのご回答は、本当にありがたいです。

> doc = doc.replace(/<img width=(\d+) height=(\d+) src="\.\/(\d+)\.files\/image(\d+)\.gif">/i,
> "<img src=\"\./$3/image$4.gif\" width=$1 height=$2>");

正規表現が使えれば、スクリプトをもっと有効に利用できるようになるんでしょうが…。
なかなか身に付かないですね。私だけかな?


To: MIFFY さん

> VBスクリプトでマウスの右クリックを効かなくするやり方
> (イベントを無視する?)があると聞いたことがあるのですが、
> ご存知ないでしょうか?

IE5以降で有効な方法ですが、oncontextmenuイベントハンドラを記述し、
その中でreturnValueにFalseを指定することで可能です。
Sub body_oncontextmenu()
window.event.returnValue=False
End Sub
# あっ、body_っていうprefixは有効だったっけ?

単に<body oncontextmenu='return false;'>としてもいいです。(これは厳密には
JavaScriptになる)

HTAなら、hta:application要素のContextMenu属性にnoという属性値を入れてやる
ことでも実現します。(IE5.01以上?)
<hta:application ContextMenu="no">


というわけで、本日の返事書きは終了!

MIFFY さん (miffy@newyork.co.jp) 2000年 12月 22日 20時 54分 25秒

こんにちは。はじめまして。

VBスクリプトでマウスの右クリックを効かなくするやり方
(イベントを無視する?)があると聞いたことがあるのですが、
ご存知ないでしょうか?

よろしくお願いいたします。

シロベ さん 2000年 12月 22日 00時 13分 27秒

To ひっしさん
置換の部分だけですが、試してみてください。
(注意:これはJScriptですので、適宜変更してください)

doc = doc.replace(/<img width=(\d+) height=(\d+) src="\.\/(\d+)\.files\/image(\d+)\.gif">/i,
"<img src=\"\./$3/image$4.gif\" width=$1 height=$2>");

Return