山咲 理 さん 2003年 08月 11日 10時 55分 41秒

To:管理人 むたぐち様

お忙しい中、ご返答ありがとう御座います。
また、お手間を掛けさせてしまい申し訳御座いません。

>そのログがどこにあったかちょっと分からないので、アドレスを書いてもらえますか?

過去ログの http://www.roy.hi-ho.ne.jp/mutaguchi/bbs/list16.shtml に
「moto さん 2000年 06月 26日 11時 38分 58秒」〜「moto さん 2000年 06月 23日 16時 56分 52秒」の辺りで実現できているようです。

motoさんと同じ様なことを、HTMLに埋め込んだVBSから実行したいのですが、可能なのでしょうか?なんとなく、securityの問題上で無理のような雰囲気があるのですが、VBSにてどこまでの事が出来るのか?私個人で判断がつかないものでゥコl佑砲ケ任い気擦督困い燭錣韻任后」

もし、可能であれば、段取りだけでも教えて頂けますと助かります。
現状の私の中では、VBSにて
1、通常使うプリンタの検出
2、そのプリンタの用紙設定の検出
3、B4サイズに値を変更
4、そのプリンタの印刷方向の検出
5、横向きに設定
というようなフローで行きたいと考えているのですがゥ・

Lucifer さん 2003年 08月 11日 03時 23分 46秒

To 管理人さん、あんのうんさん

申し訳ないです。スクリプトまで作ってもらっちゃって・・・

初心者なので構文の意味はイマイチ分かりませんが、取り合えず使わせて頂きます。
丁寧な回答、ありがとうございました。


さん 2003年 08月 10日 17時 15分 58秒

神です。
「Ctrl+Alt+Del」キー押下操作をVBスクリプトから実行可能でしょうか。
以下のコードでは、できませんでした。

Set WSHShell = WScript.CreateObject("WScript.Shell")
WSHShell.SendKeys "^(%{DEL})"

管理人むたぐち さん 2003年 08月 10日 14時 07分 06秒

To: もとこ さん
> 「ファイル拡張子".vbs"を持つスクリプトエンジンはありません。」

まず間違いなく関連付けが壊れてるのが原因だと思います。
簡単なのはWSH5.6の再インストールですが、手動でレジストリを直すのでも良いでしょう。

HKEY_CLASSES_ROOT\.VBSの"標準"を"VBSFile"に。
これで治らなかったら、もう面倒なので再インストールしてくださいませ。


To: ぺこ さん
> あるSELECT(Size=1,Multiple=false)をクリックしたときに表示される
> プルダウンメニューの高さ(行数?)

http://www.asahi-net.or.jp/%7Ebd9y-ktu/html4rec_f/interact/forms.html#edef-SELECT
を見る限り無いんじゃないでしょうか。
CSSもwidth:は効きますがheight:は無視されるようですし…。

# OPTGROUP要素なんてあるんですねぇ。知らなかった。

管理人むたぐち さん 2003年 08月 10日 13時 22分 27秒

To: おむ さん
> 常駐しているプログラムのアイコンをクリックした場合のメニューを実行する方法

これは難しい…というより、ほとんど無理な気がします。
WshShell.SendKeysを使って頑張るという手もありますが、
精度が保証できないですしね。

それでも一応書きますと、Win2000の標準的なデスクトップ配置なら、
次のキー操作を再現すれば、タスクトレイのメニュー表示まで辿り着きます。

Ctrl+Esc→Esc→Shift+Tab→Shift+Tab→(→キー x n回)→Shift+F10
→アクセスキーまたはショートカットキー等

→キーを押す回数は、目的のアイコンの位置になります。
一つ目のアイコンなら0回、二つ目なら1回ですね。
(そのため、アイコンの位置が分かってないと実行不可です)

厳密にやるなら、APIを使ってごにょごにょすることになるんでしょうけど
(Shell_NotifyIconあたりかな?)、WSHでは基本的にAPIへの直アクセスは
無理ですしね。


To: いりや さん
> WSH/JScript でも識別子に全角文字列が使用できますね。

これは知りませんでした。しかし、無理して使うこともない気がしますね。
US版なWindowsで実行するとどうなるかとか、気になるところですけど。


To: tk さん
> ターミナルサーバにログインするユーザーのコンピュータ名の取得

ちょっとWSHとの関連性も含めて、私には分からないです。
もう少し説明がほしいです。


To: せっぱ さん
> クライアント側に入っているプログラムによってログオンスクリプトのWSHの
> 動作に影響がありますか?(VBのプログラムのランタイムが影響するとか)

そのログオンスクリプトが、VBプログラムを何らかの形で呼び出しているなら、
あるいはVBプログラムがWscript.Networkに干渉する何かの動作をしているなら、
可能性はあると思いますが、それ以上は何とも…。


To: タナーキー さん
> VBの参考書

私はVB5LEに付属していた、Books Onlineというオンラインチュートリアルで
勉強しましたので、私からは紹介する本はとくにありませんですね。
一般論として、プログラムを学習するのは、書籍よりもオンラインヘルプやWebページがいいと思います。
何よりもサンプルコードがコピーアンドペーストできるのが大きいです。
サンプルを手打ちするのは時間がもったいないですからね。


To: 彩香 さん
> C# Buildre Ver.1(日本語版)

私もインストールしてみました。
とりあえず、VB6とほとんど変わらない使い勝手で、C#のウィンドウアプリがタダで組める
というだけで感動モノですね。
こんなものが無償配布されたら、Visual C#の入門版が売れなくなるんじゃないかなぁ。


To: かば さん
> http

httpってそんなに複雑なプロトコルじゃないですから、勘所を押さえれば
結構、簡単に扱えますよ。
問題は、WSHから簡単に扱う方法が限られてるってことですが。
(特に日本語が…)


To: Lucifer さん
> 入力した文字列を*****みたいに非表示に

あんのうんさんが投稿されたような、IEを併用するのが汎用的な方法だと思います。

WinXPなら、ScriptPW.Passwordというオブジェクトを使うと実現できるようです。
ただしcscript.exe使用時のみ。
http://groups.msn.com/windowsscript/windowsxp.msnw

ほかにもXPだとUserAccounts.CommonDialog, SAFRCFileDlg.FileOpenなんてのを使って、
「ファイルを開く」コモンダイアログを出せるみたいなことが書いてありますが、
本当なんですかこれ。
(あまりにも堂々と書いてあるのでかえって気づかなかった…)

> Jscriptでは可能だとか?

JScriptにはそもそもInputBox関数に相当する機能が無かったりします。
WSH+JS使い泣かせなとこですね。IEとかならpromptメソッドが使えるものの、
WSHだと外部オブジェクトに頼るしかないですからね。
VBSが優位に立っている数少ない部分です。


To: 山咲 理 さん
> "通常使うプリンタ"に設定されているプリンタの"用紙サイズ"と"印刷方向"を変更

そのログがどこにあったかちょっと分からないので、アドレスを書いてもらえますか?

WSH+VBSでできるが、IE+VBSでできないというケースが生じるのは、
大抵ActiveXのセキュリティ絡みです。
おそらく今回もセキュリティの問題で引っかかると思いますがそれは後で考えましょう。

山咲 理 さん 2003年 08月 09日 16時 13分 37秒

はじめまして、山咲と申します。
VBSにて作業したい事があり、Googleにて検索していた所こちらのサイトにたどり着き、皆様のお力をお借りできればと思い質問させて頂きます。

VBSにて実現したいのですが、VBSをHTMLファイルに埋め込み実行させます。
実行させる内容は、現在"通常使うプリンタ"に設定されているプリンタの"用紙サイズ"と"印刷方向"を変更させたいと考えております。過去ログを検索した所、WSHを使用することにより可能である事は大体理解できたのですが、VBSにて可能かどうか?不勉強なため理解と構想に苦しむものがあります。
大変お手数をお掛け致しますが、HTMLに埋め込んだVBSにて通常使用しているプリンタの用紙設定(例:B4に設定)と印刷方向(例:横に設定)を変更することは可能なのでしょうか?

お忙しい中申し訳御座いませんが、みなさまご返答よろしくお願い致します。

あんのうん さん 2003年 08月 08日 23時 58分 34秒

To Lucifer さん

Inputboxは簡単な入力用ですので、パスワードを伏字に
する等の機能はありません。方法としてはダイアログ表示用
のフリーのコンポーネントを使う等の方法もありますが、
IEを使う手もあります。簡単に作ってみました。
(ボタンを押した時のイベントを拾う所はもうちょっとスマート
 にしたいのですが、思いつきませんでした)
--------------------------------------------------------
Dim moWindow
Dim mbFinished,mbOK,mbUID,mbPass

Set moWindow = WScript.CreateObject("InternetExplorer.Application", "IE_")
moWindow.Navigate2 "about:blank"
With moWindow.Document.ParentWindow
.Document.Write "<html><head><head><body><table>" & _
"<tr><td>ID</td><td><input type='textbox' name='UserID'></td></tr>" & _
"<tr><td>PASSWORD</td><td><input type='password' name='Password'></td></tr>" & _
"</table><br><br>" & _
"<input type='button' value=' OK 'class='ok' id='cmdOK'/> " & _
"<input type='button' value='CANCEL' class='cancel' id='cmdCancel'/>" & _
"</body></html>"
.MoveTo .Screen.AvailWidth/2-150,.Screen.AvailHeight/2-150
.ResizeTo 300,200
.Document.Title ="認証"
End With
With moWindow
.Toolbar = False
.Statusbar = False
.Menubar = False
.Visible = True
.Resizable = False
Set .document.all.cmdCancel.onclick = GetRef("evtCancel")
Set .document.all.cmdOK.onclick = GetRef("evtOK")
.Document.All.UserID.Focus
End With
mbFinished = False
Do
WScript.Sleep 50
If mbFinished Then Exit Do
Loop
Set moWindow = Nothing
If mbOK Then
Msgbox mbUID & ":" & mbPASS

Else
Msgbox "Canceled"

End If

'イベント
Sub evtCancel
mbFinished = True
moWindow.Quit
End Sub
Sub evtOK
mbUID = moWindow.Document.All.UserID.Value
mbPASS = moWindow.Document.All.Password.Value
mbOK = True
mbFinished = True
moWindow.Quit
End Sub
Sub IE_onQuit
mbFinished = True
End Sub

ぺこ さん 2003年 08月 08日 01時 56分 46秒

ご存知の方にとっては呆気ない質問で申し訳ないのですが
WEBとかHelpとかを探しても見つからないので書き込みさせて頂きました。

あるSELECT(Size=1,Multiple=false)をクリックしたときに表示される
プルダウンメニューの高さ(行数?)を指定したいのですが
その設定値を持っているプロパティはどれでしょうか?
それともそんなモノ無いのでしょうか?

何方かご存知でしたら、宜しくお願いします。

いりや さん 2003年 08月 07日 18時 28分 06秒

もとこさん,

はじまして,いりやと申します。

msdn Online に Windows Scripting Host のエラーメッセージ一覧が掲載さ
れています。まずこちらを見てみると解決するために次に何から取り掛かれ
ばよいのか,その取っ掛かりがつかめるかもしれません。

メッセージ名の意図する所はこちらのようです。

msdn Online (us) 該当メッセージ説明
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/script56/html/wserrthereisnoscriptengineforfileextensionfileextension.asp

msdn Online (japan) 該当メッセージ説明
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/script56/html/wserrthereisnoscriptengineforfileextensionfileextension.asp

また一覧はこちらから。

msdn Online (us), Error Messages,
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/script56/html/wsorierrormessages.asp

msdn Online (japan), Error Messages,
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/script56/html/wsoriErrorMessages.asp


もとこ さん (m-yamasa@hcu.co.jp) 2003年 08月 07日 18時 01分 52秒

初めまして、こんにちわ。
行き詰まっているので、どうか力を貸してください。

拡張子".vbs"のファイルを実行しようとしているのですが
あるマシンだけ以下のようなエラーが表示されます。
「ファイル拡張子".vbs"を持つスクリプトエンジンはありません。」

調べてみると、wscript.exeもちゃんと存在するし
アイコンもちゃんと".vbs"のアイコンなのです。
何か対策方法があれば教えて下さい。
宜しくお願い致します。

いりや さん 2003年 08月 06日 16時 04分 58秒

nono さん、

ダウンロードしてからファイルを取り込むところまで、もしスクリプトを開示
できるようであればこちらに紹介いただくことは可能ですか??

ファイル名を変更するタイミングが文脈からよくわからなかったのでお聞きし
ています。

nono さん 2003年 08月 06日 15時 58分 23秒

教えてください!
毎日ダウンロードするファイルが同じ名前で取り込みますので、名前が
一緒だと上書きしてしまうのです。
毎日、AAA.txtというファイルを取り込みます。そのファイルを年月日時分秒.txtのようにファイル名変更できないでしょうか?
システム日付から自動でファイル名の変更ができるようにしたいのです。
プログラムのスキルが全くと言っていいほど無いので、なんとかMS−DOSで
作ろうかと試みたのですが、日付を持ってきてファイル名にすることは不可能でした。

いりや さん 2003年 08月 05日 16時 47分 50秒


かばさん、

| IEのイベントやメソッドについて調べていたときにも、最終的にMSDNに
| たどり着いていてしまったのですが、、、正直よくわかりませんでした(笑)
| 早く日本語でもWSHのところかいてくれませんかねぇ・・・。

わたしも初めて msdn Online で Dynamic HTML と Internet Explorer の頁
を読んだ時は、どういう機能が提供されているのか利用できるのかチンプン
カンプンでした。

少し慣れが必要のようです。わたし自身は1年ぐらいずっとにらめっこして、
ようやく Microsoft 社のエンジニアの書いたことがわかるようになってきま
した。そんな感じです。

もっとも慣れると、例えばこんなナビゲーションがチャッチャと書けるよう
になります。(関数群が一揃いあれば数十分もあれば書きあげられます)

ぜひぜひ頑張ってください。


[ サンプルの説明 ]

goo のオンライン辞書ページを訪れて [スクリプト] を国語辞典で調べます。

なるべくマウスやキーボードの操作を模倣するようわざと書き下しています。
そのため、少々くどいかもしれません。


[ 実行の仕方 ]

スクリプト中の全角スペースを半角スペース2つに置き換えて、sample.js
というファイル名で保存しダブルクリックしてください。起動します。


[ WSH/JScript から WSH/VBScript に ]

特に JScript 言語に特化した機能は使っていませんので、VBScript へのポー
ティングは容易に行えると思います。


[ スクリプト (sample.js) ]

example1();

function example1() {
    var aShell = new ActiveXObject("WScript.Shell");
    aShell.popUp("goo の辞書ページを使用して [スクリプト] を国語辞典で調べます。", 1);

    // 0. Create and get the reference to an automation object for Internet Explorer.
    //
    var anInternetExplorer = new ActiveXObject("InternetExplorer.Application");
    anInternetExplorer.visible = true;

    // 1. Navigate http://www.goo.ne.jp
    //
    anInternetExplorer.navigate("http://www.goo.ne.jp");
    timeout = 30;
    if (!waitUntilLoadingHasCompletedWithTimeout(anInternetExplorer, timeout)) {
        aShell.popUp("タイムアウトが発生しました。処理を中断します。");
        WScript.quit(1);
    }

    // 2. Focus and click to [辞書] anchor.
    //
    anHTMLCollection = anInternetExplorer.document.getElementsByTagName("A");
    anHTMLElement = findHTMLElementByInnerText(anHTMLCollection, "辞書");
    if (anHTMLElement == null) {
        aShell.popUp("アンカー [辞書] が見つかりません。処理を中断します。");
        WScript.quit(1);
    }
    anHTMLElement.focus();
    anHTMLElement.click();
    if (!waitUntilLoadingHasCompletedWithTimeout(anInternetExplorer, timeout)) {
        aShell.popUp("タイムアウトが発生しました。処理を中断します。");
        WScript.quit(1);
    }

    // 3. Fill in the blank.
    //
    aForm = anInternetExplorer.document.forms(0);
    aForm.MT.focus();
    aForm.MT.value = "スクリプト";

    // 4. Focus and click to [国語] button.
    //
    anHTMLCollection = aForm.getElementsByTagName("INPUT");
    anHTMLElement = findHTMLElementByValue(anHTMLCollection, "国語");
    if (anHTMLElement == null) {
        aShell.popUp("インプット [国語] が見つかりません。処理を中断します。");
        WScript.quit(1);
    }
    anHTMLElement.focus();
    anHTMLElement.click();
    if (!waitUntilLoadingHasCompletedWithTimeout(anInternetExplorer, timeout)) {
        aShell.popUp("タイムアウトが発生しました。処理を中断します。");
        WScript.quit(1);
    }

    // 5. 後始末
    //
    aShell.popUp("ナビゲーションを終了します。", 1);
}

function findHTMLElementByInnerText(anHTMLCollection, key) {
    for (var i = 0; i < anHTMLCollection.length; i++) {
        anHTMLElement = anHTMLCollection.item(i);
        if (anHTMLElement.innerText == key)
            return anHTMLElement;
    }
    return null;
}

function findHTMLElementByValue(anHTMLCollection, key) {
    for (var i = 0; i < anHTMLCollection.length; i++) {
        anHTMLElement = anHTMLCollection.item(i);
        if (anHTMLElement.value == key)
            return anHTMLElement;
    }
    return null;
}

function waitUntilLoadingHasCompletedWithTimeout(anInternetExplorer, timeout) {
    var elapsedSecs = 0;
    var waitSecs = 0.1;
    do {
        if (elapsedSecs > timeout)
            return false;
        else {
            WScript.sleep(waitSecs * 1000);
            elapsedSecs = elapsedSecs + waitSecs;
            var b1 = anInternetExplorer.busy == false;
            var b2 = anInternetExplorer.readyState == 4; // 4 = READYSTATE_COMPLETE
            var breakCondition = b1 && b2;
        }
    } while (!breakCondition) // repeat until breakCondition becomes true.
    return true;
}

Lucifer さん 2003年 08月 05日 16時 36分 44秒

こんにちは。
いつもここのリファレンスを参考に、勉強させて頂いています。
今回はVBScriptを使って、サーバー認証させようと考えています。
そこでInputBoxで認証するVBScriptを作ったのですが、入力した文字列を*****みたいに非表示に出来ません。
このような場合、どうすれば良いのでしょうか?
それともVBscriptでは、入力フィールドの文字列を表示にする事は、難しいのでしょうか?
(Jscriptでは可能だとか?JSは全然勉強してないので分かりませんが・・・)

どなたか、アドバイスを頂ければ嬉しいです。

かば さん 2003年 08月 05日 15時 29分 03秒

to いりやさん

ページのご紹介ありがとうございます。
御察しのとおりオートメーションオブジェクトについて理解したのは
前回の質問のあとでした(汗)
IEのイベントやメソッドについて調べていたときにも、最終的にMSDNに
たどり着いていてしまったのですが、、、正直よくわかりませんでした(笑)
早く日本語でもWSHのところかいてくれませんかねぇ・・・。

フレームの取得については、前回あきらめてしまったので、
MSDNの英語とにらめっこしながら、もうちょっと研究してみます。
有益な情報ありがとうございます!今後ともよろしくお願いします。

かば さん 2003年 08月 05日 15時 03分 32秒

to むたぐちさん

ご回答ありがとうございます。お礼が遅れてしまいもうしわけございません。

今回の説明をしていて思ったのですが、私はかなり知識の欠落があるようで
プログラムもだましだましやってたため、ご迷惑おかけしてもうしわけありません。
重ねまして、アドバイスありがとうございます。

今回の件では、起動後にひらくIEを一つに絞ることで解決してしまいました(汗)
これなら、前回の書き込みのスクリプトでも動かせました。

WSHとIEについてですが、私も(?)WSHでIEのオートメーション化は難ありだと
感じております。とくにネットワークの遅延、エラー、など不測の事態が
起こる場合の対処を考えますと、なにかちがう手段のほうがいいの
かなぁ・・・と思ってしまいました。httpをしゃべったほうが
きっと早いんでしょうが、、、その技術を身につけるのはもっと大変では!?

それでも、皆様のご協力のおかげで、
目的のページに到着できない場合は再ログインを行うようにしたり、
ファイルのダウンロードに失敗した場合(サーバが混雑など)での再実行を
などを、実現することができました。
このまましばらくはずるずるとWSHで頑張ると思います(笑)
私もちゃんと技術がついて、お役に立つような時がくるように頑張ります。
これからもよろしくお願いします。

いりや さん 2003年 08月 05日 12時 19分 05秒

彩香さん、

| いりや さんへ
|
| いろいろ貴重な情報をありがとうございます。
|
| >当面は、Word, Excel についてはプロセスをたちあげておいて、それからス
| >クリプトなりコンテクストメニューから選べば、印刷後も 当然) プロセスが
| >残っていますが、コマンドの実行は完了できると思っています。
|
| これで当面は逃げるようにします、これであれば何とか実用で
| 使ってゆけそうです、どうもありがとうございますm(__)m

暫定対処ですのでもっと的を得たものができたらお知らせします!! (でもた
ぶんちょっと時間がかかる...。

上記以外のアプローチをとるのであれば、すでに皆さんで検討済みのオート
メーションオブジェクトを利用する方法が有効に思います。

シェルにまかせることによって「ファイルを誰が印刷するのか利用者は知ら
なくてよい」という立場から一転、「印刷をするのは誰かを決めてかかる」
わけですから、ファイル種別による (印刷を行うアプリケーションの) 担当
者割り振りを利用者がおこなってやらねばなりません。

ファイル数によっては煩雑さがあるものの、確実です。

それに .doc, .xls, .pdf ぐらいを扱えればよいという前提つきならば、担
当者割り振りったって 3 人ですからコーディング量にしてもたいしたことな
いですよね、ケースバイケースかな・・・。

いりや

彩香 さん 2003年 08月 05日 11時 48分 17秒

いりや さんへ

いろいろ貴重な情報をありがとうございます。

>当面は、Word, Excel についてはプロセスをたちあげておいて、それからス
>クリプトなりコンテクストメニューから選べば、印刷後も 当然) プロセスが
>残っていますが、コマンドの実行は完了できると思っています。

これで当面は逃げるようにします、これであれば何とか実用で
使ってゆけそうです、どうもありがとうございますm(__)m

C# Buildre Ver.1(日本語版)がDL可能になっていますね、
早速DLしてしまいました^^

いりや さん 2003年 08月 05日 11時 26分 48秒

| $ for f in `ls [1-9]*.txt | mysort`; do lpr -Pprn1; done
|
| という one-liner で片付くのに。(mysort は自分でこさえた整列スクリプト)

$ for f in `ls [1-9]*.txt | mysort`; do lpr -Pprn1 $f ; done

すみません、$f が抜けていました。

いりや さん 2003年 08月 05日 11時 08分 53秒

彩香さん、

| 例えば、フォルダの中にWord、Excel、Text等の
| 異なる印刷可能なファイルが存在したとして、
| 右クリックからのコンテキストメニューで[印刷]を実行すると、
| これは印刷の抜けが発生します。
|
| 今思えば、これもシェルによるものだったのでしょうか?

うむむ・・・これはこちらではまだ未確認ですね、[印刷] のかわりに[開く]
で代替して確認を行っている限りですが。

| これを回避したいが為に作ったスクリプトでしたが、
| スクリプトでもシェルを使っていて、結局、
| 同じ事をしていたのかと、その後、いろいろ考えたり
| してそんな事を思っていました。

まだ結論は出す段階にはありませんが、シェルの提供するサービスを利用す
るときにはちょっと思慮考慮が必要だ、ということはおおよそ分かってきま
した。

大概のものは print コマンドを実現するために 1 個のプロセスを生成して
そのプロセスが印刷を請負い印刷を終えると消滅する、という方式を採用し
ています。

ですが、なかには複数のプロセスを生成すると具合が悪いものがあったり上
記の方式は空間 (メモリ) 効率が悪いということで 1 個のプロセスに複数の
DDE のコネクションを確立して印刷の要求を受付けているアプリケーション
もあります。

利用者からシェルを通じて指示の出す出し方によっては後者の方式の場合ま
だ見えていないタイミング・イッシューがあり難儀しています。ここの所が
明確になれば、シェルを通じてコマンドを実行するときのポイントがピシッ
とおさえられて、コマンド実行の抜けを回避できるのではないか?? と期待し
ています。

現時点では DDE を利用する場合たとえば Microsoft Word の場合を例にとる
とプロセスを 1 個立ち上がっていると抜けは回避できるようです。

当面は、Word, Excel についてはプロセスをたちあげておいて、それからス
クリプトなりコンテクストメニューから選べば、印刷後も 当然) プロセスが
残っていますが、コマンドの実行は完了できると思っています。現時点での
暫定対処です・・。(もしくは .DOC, .XLS のオプション設定設定で
[FileExit 2] が書かれてあるところを落としてやる)


いりや

追伸 しかしな〜 Linux で印刷するときなんか

$ for f in `ls [1-9]*.txt | mysort`; do lpr -Pprn1; done

という one-liner で片付くのに。(mysort は自分でこさえた整列スクリプト)

いりや さん 2003年 08月 05日 10時 36分 26秒

タナーキーさん、

vbvbvb.com をご覧になってはいかがでしょうか。スタート地点として
おすすめです。(私は Win32 API のとっかかりに gTips を利用してい
ます)

http://www.vbvbvb.com/jp/index.html

タナーキー さん 2003年 08月 04日 21時 08分 21秒

初めまして。
プログラム初心者の人間です。
最近VBを仕事で使うようになったのですが、
全然分からなくて参考書を買おうと思っています。
書店などにも行ったのですが、たくさんありすぎて
どれがいいのか分からなくなってきています。
もし宜しければ、お勧めの参考書を何冊か紹介していただけないでしょうか??
よろしくお願いいたします。

せっぱ さん 2003年 08月 04日 16時 51分 04秒

はじめまして
WIN2000サーバのログオンスクリプトで、ネットワークドライブとネットワークプリンタの割当を
Wscript.Networkを使用して行っていますが、クライアント(XP)にVBプログラムをインストール後
ネットワークプリンタの割当の部分で、サーバのCPU使用率が100%になり、下がらないままになります。
(VBのプログラムをインストールする前は、CPU使用率は下がっていました)

ただ、VBのプログラムを入れているクライアントでも、ログイン後、
クライアント側でスクリプトを実行してネットワークプリンタの割当を行うと
CPU使用率は上がりますが、その後下がります。
(この場合、サーバのログオンスクリプトはネットワークドライブの割当のみ行うスクリプトに変更)

ログオンスクリプトは、vbScriptで作成し、WSHのAddWindowsPrinterConnectionメソッドを使用して
ネットワークプリンタの割当を行っています。
ScriptEngineMajorVersionなどのVersionは、サーバもクライアントも5.6.7426です。
VBのプログラムは、VB6 SP5で作成し、NTでインストーラー(ディストリビューションウィザード)を
作成しました。

WSHのWscript.Networkってログオンスクリプトでネットワークプリンタの割当をやるのと、
クライアントでネットワークプリンタの割当をやるのとでは、何か違いがあるのでしょうか?
クライアント側に入っているプログラムによってログオンスクリプトのWSHの
動作に影響がありますか?(VBのプログラムのランタイムが影響するとか)

何ぶんどこから調べてよいものやら見当がついていない状態です。(VB?WSH?)
何か思い当たる事とかありましたら、教えて頂けないでしょうか?
宜しくお願い致します。

tk さん 2003年 08月 04日 15時 30分 47秒

はじめまして

ターミナルサーバにログインするユーザーのコンピュータ名の取得を
行いたいのですが、このようなことは可能なのでしょうか?
ターミナルサーバーを利用しない場合はすぐできたのですが

参考になる資料などありましたら教えていただけますでしょうか

彩香 さん 2003年 08月 04日 14時 53分 16秒

こんにちは、いりやさん。

シェルの件調べて頂いていたんですね、ありがとうございます。

例えば、フォルダの中にWord、Excel、Text等の
異なる印刷可能なファイルが存在したとして、
右クリックからのコンテキストメニューで[印刷]を実行すると、
これは印刷の抜けが発生します。

今思えば、これもシェルによるものだったのでしょうか?

これを回避したいが為に作ったスクリプトでしたが、
スクリプトでもシェルを使っていて、結局、
同じ事をしていたのかと、その後、いろいろ考えたり
してそんな事を思っていました。


いりや さん 2003年 08月 04日 14時 40分 04秒

おむさん、

Windows Scripting Host でなくともオッケーなのならば、巷に出回っている
画面操作マクロ系のアプリケーションプログラムを利用すれば一発です。

参考記事
Vector, 特集 オートマティックで行こう
http://www.vector.co.jp/magazine/spotlight/030521/sl0305211.html

いりや さん 2003年 08月 04日 14時 10分 45秒

むたぐちさん、あさじゃけんさん、

| > でも、きっと、日本語基準のプログラム言語ってあっても、流行らないだろうなぁ・・・とか思いつつ。
| > ・・・どこかで、そんなのがあったような気がしますね(汗)
|
| 日本語で書くプログラム言語といえば、ひまわりとかMINDとかですね。
| VBでも変数名は日本語を使えたりしますが。
| (VBSでは不可能)

WSH/JScript でも識別子に全角文字列が使用できますね。私は文字列リテラ
ルとコメント以外に日本語を書く機会があまりなかったので、プログラム中
に書くのにはまだ慣れていませんが、α→β() というような感じで使い始め
ました。例えば list→string(list) のように。

識別子 (変数名と関数名) に日本語を使ってみましたがまだ馴染めていませ
ん。。

http://www.af.wakwak.com/~simizu/cgi-bin/uwscbbs2/cocoqa.cgi?log=23
http://hidebbs.net/bbs/umiumi?s=7&n=15883825

いりや さん 2003年 08月 04日 13時 52分 29秒

つちやさん、彩香さん、

シェルのプリント つづき

まだのんびり調べています。少し分かったことを。print コマンドではなく
open コマンドで試してわかったことです。

(1) ShellExecuteA() Win32 API を直接実行する分には指示が落ちることは
  ない。

(2) デスクトップから複数ファイルを選択して "開く" メニューを選ぶ分に
  は指示が落ちることはない。

(3) Component Object Model を利用して実行すると指示が落ちることが確認
  された。

最初は DDE の通信規約 (プロトコル) をシェルか Microsoft Word が守って
いないからでは? あるいは Microsoft Word の DDE を利用した print コマ
ンドの実装 (シェルのレジストリ設定) がしょぼいからでは?? とか考えてい
たのですが、(1), (2) は 100% 成功することから、そのどちらでもなさそう
だ、という見通しをたてて、今 (3) の実行形態を調べているところです。

また、並行してシェルの提供する print コマンドという (利用者への) サー
ビスををそもそも Microsoft 社がどのように規定して、それを提供するアプ
リケーションはどういう基準で作らなければならないのか、も
UserInterface Guideline を中心に読んでみました。

その結果、シェルはあくまでコマンドを提供するための枠組みを提供するの
みで、そのコマンドの実行を請負っているわけではなく、アプリケーション
に渡すところまでのようです。

いりや

いりや さん 2003年 08月 04日 13時 24分 05秒

かばさん、

新たなウインドウをオープンさせて場合、そのウインドウに対応するオート
メーションオブジェクト (InternetExplorer.Application) が生成されるよ
うです。

ですので、それを探し当て、そのオブジェクトに対して操作を指示するとい
うアプローチとむたぐちさんが紹介されている「●起動中のIEを操作」方式
は、解決の方向として間違っていないと思います。

あとは、むたぐちさんが指摘されている通り、候補が複数あったときにどれ
が対象のオブジェクトなのか識別する糸口を見出して、それで該当オブジェ
クトを引き当てれば、あとは淡々と操舵するための指示をスクリプトで表現
してやれば達成できるのではないでしょうか。

               ★☆

それから、そちらが一段落したら、一度オートメーションオブジェクトのプ
ロフィール (プロパティー、メソッド) を、msdn Online などで一通り俯瞰
されることをおすすめします。

msdn Online, InternetExplorer Object,
http://msdn.microsoft.com/library/default.asp?url=/workshop/browser/webbrowser/reference/objects/InternetExplorer.asp#InternetExplorer


document オブジェクトと window オブジェクト及び open() メソッドをおさ
えておけば、自らウインドウを作成捕捉することが可能となります。

msdn Online, document Object,
http://msdn.microsoft.com/library/default.asp?url=/workshop/author/dhtml/reference/objects/obj_document.asp

msdn Online, open Method (document),
http://msdn.microsoft.com/library/default.asp?url=/workshop/author/dhtml/reference/methods/open_1.asp

msdn Online, window Object,
http://msdn.microsoft.com/library/default.asp?url=/workshop/author/dhtml/reference/objects/obj_window.asp

msdn Online, open Method (window),
http://msdn.microsoft.com/library/default.asp?url=/workshop/author/dhtml/reference/methods/open_0.asp


また document オブジェクトのコレクションの一つである frames
(document.frames[]) コレクションの説明をご覧いただければ、フレームを
持つウインドウの背後にある構造が明るみに出ます。その構造をしっかり認
識できればウインドウ中の任意の document オブジェクトを引き当てること
ができるようになります。

msdn Online, frames Collection,
http://msdn.microsoft.com/library/default.asp?url=/workshop/author/dhtml/reference/collections/frames.asp

いりや

edge さん 2003年 08月 04日 09時 49分 01秒

edgeです
たむぐちさんの指摘どうりに今日やったら
うまくいきました
たむぐちさん、有難うございました

edge さん 2003年 08月 01日 21時 53分 49秒

edgeです、たむぐちさんご指摘有難うございます
明日から土日でお休みなので、
来週月曜日に早速試してみます
経過報告もそのときにしますので
有難うございました

おむ さん 2003年 08月 01日 19時 54分 51秒

はじめまして

今回このサイトのWSHテクニック集の
右クリックメニュー実行を参考にVBSでプログラムを組ませて頂きました

そこで、疑問に思ったのですけどれども
常駐しているプログラムのアイコンをクリックした場合にも同様の事は
できないのでしょうか

何ぶん素人なもので
解ってない質問かもしれないのですが
どなたか教えて頂けないでしょうか?


管理人むたぐち さん 2003年 08月 01日 17時 40分 31秒

To: edge さん

NT4.0でWMIを利用するには、WMIコアコンポーネントの追加インストールが必要です。
http://www.microsoft.com/downloads/details.aspx?displaylang=ja&FamilyID=AFE41F46-E213-4CBF-9C5B-FBF236E0E875


To: adidas さん

DCOMの構成、権限あたりでつまづいてると思いますが、どこをどうすれば動くようになるかは
一概に言えないので省略させていただきます。
WMIのリモート実行はなかなか難しいですね。

adidas さん 2003年 08月 01日 10時 45分 26秒

はじめまして、アディダスです。
MSDNで、リモートホストの情報を取得するサンプルスクリプトどおりに
実施しているのですが、エラーが出てしまいます。

Set wbemServices = GetObject("winmgmts:\\" & "リモートホスト")

Microsoft VBScript 実行時エラー: 書き込みできません。: 'GetObject'
どなたかご存知の方がいましたら、教えてください。
お願いします。

edge さん 2003年 08月 01日 10時 01分 28秒

はじめまして、edgeと申します
私のところで、下記の環境において
VBScriptを実行するとエラーになってしまいます
環境 WindowsNT4.0(ServicePack6 IE5.5)

スクリプトの内容
for each Process in GetObject("winmgmts:").InstancesOf ("win32_process")
'WScript.Echo Process.ProcessId, Process.name
if Process.name = "NOTEPAD.EXE" then
Process.Terminate()
end if
next

エラーメッセージ内容
行 1
文字 1
コード 800401E4
エラー 無効な構文です
ソース NULL

VBScriptの新バージョン?をマイクロソフトのサイトから
持ってきてインストールはしました
インストファイル SCR56JP.EXE(VBScript5.6)

しかし、上記のエラーです。
そこで、エラーコードの800401E4で検索したところ
SiteServer3なる物をインストしている場合同じエラーが
発生すると記述してありましたが、
当方では使用しておらず、原因がわかりません

どなたかご助言いただけないでしょうか?

管理人むたぐち さん 2003年 07月 31日 21時 14分 55秒

To: zume さん
> AKiOSさんの記事検索プログラム

私の環境(Win2000+IE6sp1)では正常に動作するんですよね。
ただ、この掲示板で何回か正常動作しないという報告を受けてますので、
環境依存するのかもしれません。
IE5.5系列が怪しいのかも。


To: いろは さん
gnu=ヌーとは気づきませんでした。
しかし、Gnu is Not Unixをもじった、同語反復的なネーミングって他にも結構見かける気がします。
それが一つの意味のある単語になるかどうかは、もうどうでもいいみたいです。
とはいえ具体例がすぐに思いつかないのは私がWin使いだからかな。


To: あさじゃけん さん
> だって、VB.NET覚えるなら、VisualC#.NET覚えたほうが、よさそうなんだもん。(爆

私もそう思います。VB.NETは、一応、次世代WSHを見越して先行学習です。

> ひまわりとかMIND

この掲示板で話題が出たので覚えてただけですけどね。
にしても、ひまわりは何気に多機能ですね。書庫も扱えるしsocketもあるしwindowも出せるし。
標準であれだけのことができるのは、WSH派としては羨ましいと思うことも。


To: かば さん

> 複数のIEが立ち上がっている場合はどのように指定すればよいのかがわからず

If TypeName(Window.document)="HTMLDocument" Then
If Window.document.href="(URL)" Then
のように条件を追加すればいいんじゃないでしょうか。
(関係ないですが、VB.NETならIf A AndAlso B Thenが使えるシチュエーションですね)

個人的には、複数ページにまたがるオートメーション操作は、色々と誤差とかでてきますんで、
あまりお勧めできないです。
httpを喋って、直接サーバーと通信した方がいいのではないでしょうか。
標準機能なら、msxml2.xmlhttpが使えます。
(レスポンスの文字列の扱いには色々と厄介な問題がありますが、詳しくはログを参照)
BASP21のソケットオブジェクトを使うのでも良いでしょう。

最初のページを表示してから、そのリンク先に飛ぶ理由は、リファラの設定が必要なためと
勝手に想像しましたが、環境変数HTTP_REFERERを設定すればそれは回避できます。
また、フォームに値を入れてボタンを押しsubmitという操作も、POSTメソッドを指定して
openというコードに対応します。

彩香 さん 2003年 07月 31日 16時 40分 36秒

こんにちは、つちやさん

>参考までに、DAO&Excel2000でバグがあったりもします。

ありゃ、これは知りませんでした。
データが抜けるのがバグで分っていると怖くて使えないですね。

私はOffice XP 以降しか使った事がないので
偶然にも助かっていたんですね(^^;


つちや さん 2003年 07月 31日 16時 13分 07秒

こんにちは。

> Excel関数のCopyFromRecordsetを使う方法が高速です。

ですね。
配列で範囲を指定するのが面倒なので、実はこちらの方が使用頻度が高かったり。

参考までに、DAO&Excel2000でバグがあったりもします。
マイクロソフト サポート技術情報 - 414048
[XL2000]DAO3.6でCopyFromRecordsetを使用するとデータが欠ける
http://support.microsoft.com/default.aspx?scid=kb;ja;JP414048

ちなみに、DelphiからExcelに配列を渡すときには、バリアント配列というのを使います。(いろんなことを試しましたが)

彩香 さん 2003年 07月 31日 15時 48分 48秒

こんにちは、彩香です。

>Excelのセルは配列みたいなものなので、配列をそのまま入れてしまえるわけですね。

これをはじめて知った時、
構造体まるごと代入できればと試したことがありました(^^;

>'レコードを挿入
>SHT.Range(SHT.Cells(R+1, C),SHT.Cells(Ubound(Records,1)+R+1,UBound(Records,2)+C)) = Records

GetRowsは確かに使いずらいですね、
ADOを使うのならば、取得したレコードを直接代入できる
Excel関数のCopyFromRecordsetを使う方法が高速です。

私は配列を使うか、これを使っています^^

つちや さん 2003年 07月 31日 13時 24分 15秒

Dear あさじゃけん さん

どもです。

> Delphi関係は、私はわからないので、ユミンさんの対応お願いします(笑)
対象になった過去ログには、Delphiを始めて数時間の私がいます。
その後あんまり進歩していない気も。。。

Excelのセルは配列みたいなものなので、配列をそのまま入れてしまえるわけですね。
(なんという論理)
そういえば過去ログにもあったかも。(そんな気もしてきました)

>> SELECT文の結果を一気に配列で取り出すメソッド
> それは便利ですね!ほしい!(笑)

ADOのGetRowsメソッドだと、Excelの場合だと行列が逆になってしまうので、
Excelをデータベースビューアとして使っている私には念願のメソッドなのでした。
たとえば次みたいにします。

Set Conn = CreateObject("MySQLCOM.Connection") 'インスタンスの形成
Conn.Host = "ServerName" 'ホストサーバーの指定
Conn.User = "UserName" 'ユーザー名の指定
Conn.Password = "Password" 'パスワードの指定
Conn.Port = 3306 '3306がデフォルト
Conn.Database = "DBName" '使用するデータベースを指定
Conn.Compress = True 'データ圧縮を使用するなら
Conn.Connect 'ここで接続

Conn.Execute "SELECT * FROM tseito" 'SQLを発行します。

If Conn.HasRecordset Then 'レコードセットが取得できたときだけ実行
Fields = Conn.FieldNames 'フィールド名をまとめて取得
Records = Conn.GetRecords '全レコードをまとめて取得

Set XL = CreateObject("Excel.Application") 'Excelのインスタンス作成
XL.Workbooks.Add '新規ワークブック作成
XL.Visible = True '見えるように
Set SHT = XL.ActiveSheet '最前面のシートを変数にセット
R = 1 '範囲の左上の列指定
C = 1 '同じく行指定
'フィールド名を挿入
SHT.Range(SHT.Cells(R, C),SHT.Cells(R,UBound(Fields)+C)) = Fields
'レコードを挿入
SHT.Range(SHT.Cells(R+1, C),SHT.Cells(Ubound(Records,1)+R+1,UBound(Records,2)+C)) = Records
End If
Conn.Close '接続をとじる
Set Conn = Nothing

これでSSLに対応すれば、途中でネットを流れるデータを暗号化できるわけで、
これは是非とも、と思っているのですが、先は長そうです。

> http://www.mysql.com/doc/en/Secure_connections.html
> ここなんて、参考になりませんかね?(汗)

そうなんです。ここなんですよ。
ここのSetting Up SSL Certificates for MySQLの最後のところでハマっているのでした。
うまくいったら公開しようと思っていたのですが、
MySQL本体のコンパイルしなおしも必要かもしれず、難航しているのでした。

あさじゃけん さん 2003年 07月 31日 09時 58分 16秒

>つちやさんへ
Delphi関係は、私はわからないので、ユミンさんの対応お願いします(笑)

で。早速、お返事(^^

> 配列に入れて、そのままシートの範囲に入れてしまうのが一番速いのではと思ったりします。
その話題、ここの過去ログにもありましたよ。
過去ログみて、「すげーーそんなことできるのかよ!」とか三村風に思ってみた覚えがあります(笑)
言われて見れば、単純な話ですが、実際思いつきませんでしたもの。

しかし、ほんとにExcelのセルにループしながら入れてると、遅くてかないません。
ちなみにWSHだけでなく、VBAでやっても遅いです・・・

> SELECT文の結果を一気に配列で取り出すメソッド
それは便利ですね!ほしい!(笑)


> 肝心のMySQL本体でのSSL機能をアクティブにする方法がわかってなかったり。。。
私も良く分かってませんので、情報提供として、当たってるか分かりませんが、
http://www.mysql.com/doc/en/Secure_connections.html
ここなんて、参考になりませんかね?(汗)
ハズれてたらごめんなさい(^^;;;;

つちや さん 2003年 07月 31日 00時 24分 41秒

MySQLを操作するMySQLCOMというのを製作中ですが、
MySQLとのSSL通信機能をつけようとは思っているのですが、
肝心のMySQL本体でのSSL機能をアクティブにする方法がわかってなかったり。。。

SELECT文の結果を一気に配列で取り出すメソッドをつけたのですが、
この配列はWSHでそのまま使えるし、
Excelのワークシートにそのまま入れてしまえるので、結構便利。
一般的に、ExcelにWSHから値を代入する場合は、Forを二つ使って、
シートの列と行をループしながら処理すると結構時間がかかるので、
配列に入れて、そのままシートの範囲に入れてしまうのが一番速いのではと思ったりします。


Dear ユミンさん

> Excelファイルが6つほどあり、起動用のExcelファイルは、他の
> Excelファイルを起動するための選択メニュー用のファイルで、
> 同一シート上にコマンドボタンが6つほどあり、それぞれのボタン
> をクリックすると、そのリンクのブックが起動するという仕組みです。

それであれば、Delphiでフォームを作り、ボタンを6つ作って、
それぞれにファイルを開くコマンドを設定すればいいのでは。
(つまり、起動用のExcelファイルをDelphiで作るということで)

ユミン さん 2003年 07月 30日 15時 15分 10秒

つちやさん(土屋さん?)、

うまく起動することができました。
ご指摘のとおり、Delphi側のフォームが不要な
コードがわかりませんでした。

ありがとうございました。

> ExcelVBAブックを、「exe」化して実行ファイルにしたい

この意味不明な件ですが、今回の実行ファイルに、元のExcel
ファイルを同梱したものに簡単なインストーラをつけて、配布し
ようとしているのですが、元のExcelファイルをユーザに直接触
ってほしくないという理由から、Excel自体もEXEファイルに
埋め込む?なんということができるのかなぁなんて、勝手なこと
を考えていた上での質問でした。

実際は、今回のEXEファイルで起動するExcelファイル以外に、
Excelファイルが6つほどあり、起動用のExcelファイルは、他の
Excelファイルを起動するための選択メニュー用のファイルで、
同一シート上にコマンドボタンが6つほどあり、それぞれのボタン
をクリックすると、そのリンクのブックが起動するという仕組みです。

何か良い方法がありましたら、合わせてアドバイスいただけると
助かります。

つちや さん 2003年 07月 30日 14時 12分 47秒

Dear ユミンさん

リンクのログをたどったら、元の投稿者名にどこか見覚えが。。。

> ExcelVBAブックを、「exe」化して実行ファイルにしたい
の部分がよくわからないのですが、結局は同じフォルダにある仮称Book1.xls
をオートメーションで開くDelphiアプリを作成すればいいわけですね。

Delphiアプリの方にフォームがいらないのあれば、
以下のコードをOpenExcel.dprの名で保存して、Delphiで開き、
リソースファイルを生成しますかの警告にはYESを指定して下さい。
Book1.xlsの部分を変更してコンパイルすれば、できあがると思います。
ちなみに、if InitProcで始まる文は、フォームを使わずにオートメーションを
使う場合のおまじないみたいなものです。

//ここから*********************************************
program OpenExcel;

uses
Windows, SysUtils, ComObj, Variants;

{$R *.RES}

var
objExcel: OleVariant;
FileName: String;
begin
if InitProc <> nil then TProcedure(InitProc);

//以下の行のブック名を変更します。
FileName := ExtractFilePath(ParamStr(0)) + 'Book1.xls';

if FileExists(FileName) then
begin
try
objExcel := CreateOleObject('Excel.Application');
objExcel.Visible := True;
objExcel.Workbooks.Open(FileName);
finally
objExcel := Unassigned;
end;
end;

end.
//ここまで*********************************************

ユミン さん 2003年 07月 30日 11時 42分 21秒


ごめんなさい。

uses Comobj;

を記述し忘れていました。
きちんと動作しましたが、既存のExcelファイルに渡すには
どうすればいいのか。。。

かば さん 2003年 07月 30日 11時 05分 30秒

何度も何度も本当に申し訳ないです・・・
さきほど初めて記事検索プログラムを使用することができました(汗
アイコンがなかったので、Wクリックして動くとは思ってなかったもので・・・。

過去ログで"●起動中のIEを操作する方法"という、むたぐちさんの
書き込みを発見できました。これを改造しまして・・・

Set Shell=WScript.CreateObject("Shell.Application")

For Each Window In Shell.Windows
If TypeName(Window.document)="HTMLDocument" Then
Window.Navigate "http://yougo.ascii24.com/gh/"
wscript.sleep 5000
Set document=Window.Document
mystr = window.Document.title
MsgBox (mystr)
Exit For
End If
Next

としてみました!これが応用できそうなのですが、複数のIEが立ち上がっている場合はどのように指定すればよいのかがわからず悩んでおります。
こんな私ですが、ご回答頂ければ幸いです。本当にすいません・・・

あさじゃけん さん 2003年 07月 30日 11時 02分 13秒

>むたぐちさんへ

>> xcacls.exe
> Professionalにはcacls.exeしかありませんでした。
> これはリソースキットか何かについてるんですかね?
そです。
実行時にYを押さなくてもよかったりするので、WSHでRunするにはもってこいです(笑)


ここからDLできますよ。
http://www.microsoft.com/windows2000/techinfo/reskit/tools/existing/xcacls-o.asp

その他のリソースキットについても
http://support.microsoft.com/default.aspx?scid=kb;ja;274305
からDLできます(^^


それから、VB.NETのサイト紹介ありがとうございます(汗)
これは、ひょっとして・・・むたぐちさんは、私にVB.NET勉強しろと言っているのですね(苦笑)

まぁ、もうすぐ有休消化で休みに入るので、時間みてやってみよっかな・・・
でも、あまり気乗りしてなかったり。
だって、VB.NET覚えるなら、VisualC#.NET覚えたほうが、よさそうなんだもん。(爆
まぁ、それは冗談としても、現職プログラマじゃぁないので、必要性があれば・・・ですね(^^;;;


> 日本語で書くプログラム言語といえば、ひまわりとかMINDとかですね。
あぁ、それです!(笑)
さすがむたぐちさん、知識が深いです(汗)
私なんて、検索するにも、なんてキーワードで検索していいのか、分かりませんでしたもん(笑)

>> Windows標準のプログラム言語 WSH(Basicを拡張したもの)
> それはちがーう。
「それはかなりちがーう」(爆)
突込みどころ満載なので、私も言わせてもらいました(笑)

ユミン さん 2003年 07月 30日 10時 51分 25秒

こんにちは。

他のBBSの管理人さんにここを教えていただきました。

2001年 09月 08日 15時 12分 39秒
http://www.roy.hi-ho.ne.jp/mutaguchi/bbs/list46.shtml

上記のリンクの投稿について、質問させてください。

業務で使用する自作のExcelVBAマクロブックがありますが、
操作は、すべてユーザフォーム上で行う仕様になっています。
データシートは、非表示にしています。

このブックの起動時にエクセルウィンドウを一瞬でも表示させ
ないように、ブックのOpenイベントに、UserForm1.Showを、
そして、VBScriptを以下のコードで作成し、通常のアプリの
ような起動を表現させています。

Dim xl 'As Excel.Application
Dim book 'As Workbook
Set FS = CreateObject("Scripting.FileSystemObject")
CurrentPath = FS.GetAbsolutePathName(".")+"\"

f_name="book1.xls" 'ブック名は仮名。

Set xl = CreateObject("Excel.Application")
Set book = xl.Workbooks.Open(CurrentPath+f_name)

質問の本題なのですが、これを、Delphi6 Personalで
ExcelVBAブックを、「exe」化して実行ファイルにしたい
ということなのですが、

VBAは、インタープリタ型の言語であることから、コンパイル
ができないそうなので、きちんとしたVBや、C++などの開発
環境が必要らしく、つい最近Delphi6 Personalをインストール
したばかりのプログラミング・ビギナーです。

>var
>objExcel : variant;
>begin
>objExcel := CreateOleObject('Excel.Application');
>objExcel.Visible := True;
>objExcel.Workbooks.Add;
>end;

上記コードをフォーム上に作成したButton1のコードに貼り付け
て実行したところ、
>objExcel := CreateOleObject('Excel.Application');
の行でエラーになるのですが、原因がわかりません。

もし、よろしければ、ExcelVBAブックをEXEの実行ファイル化して、
ユーザーフォームだけをきれいに起動させて動作させるやり方を
もう少し具体的にご教示願えませんか。

あさじゃけん さん 2003年 07月 30日 10時 40分 14秒

>いろはさんへ

いろはさんの書き込みをお待ちしております・・・と、言ったはよかったのですが、私が会社お休みしたので、一日閲覧日が空いてしまいました(汗)
お急ぎだったようで、申し訳ないです。

でも、とりあえず、いろはさん。落ち着きましょう(笑)

後、いろはさんのおかれた状況はよくわかりましたが、肝心なシステム構成が、やっぱり書ききれてないので、よく分からなかったりします(汗)

いりやさんが個人的にお返事するような話をしているのは、WSHの趣旨とすこし離れてきている事もあるでしょうし、内容が整理されていない事もあるでしょう。

私は、どっちかというと、その環境自体も、いろはさんが理解していないように見受けました。

もし、情報公開できない点が多すぎて、この内容までしか出せないのであれば、メールで個人的にやり取りするしかないでしょう。
(というか、いりやさん申し訳ないです。私はつっこんで個人的に話を聞くほど、責任をもてません。)
いりやさんに連絡とったのであれば、また何か書き込みお願いしますね。

首を突っ込んだ以上、私も答えれる範囲で頑張りますので。(^^;;


> ActiveDirectoryに関わって、悪戦苦闘しております。
ActiveDirectoryは悪戦苦闘します(笑)
私もかなり時間をかけて勉強しました。で、実際に何度もWindows2000Serverをインストールして設定しました。
本も雑誌も何冊も買い、読みさくりましたが、未だに扱えきれている自信は無いです。
短時間で、習得できるような技術ではないですが、扱うことができれば、管理面では非常に強力な物になります。ぜひ頑張って下さいね(^^

> 正式に「ADSIは使ってはいけない」ことが決まって
なぬ(汗)
でも、WSHだけでなく、VB6からも直接ADSI使えますよ(爆)・・・・ってダメですよね。(><
ちなみに、ここにVBでのサンプルがありますよ。
http://www1.harenet.ne.jp/~unaap/

もし差し支えなければ、なぜADSIが使ってはいけないことになったのか、知りたいですね。何か問題があったのでしょうか。

> 与えられたDLLでは、いまだにユーザ一覧すら取得できていません。
どのようなDLLなのか、分からないので、アドバイスしようもないですね・・・
それを作った方に聞くしかないでしょう。

> VB6でWinAPIと、文字列を含む構造体配列のやり取りの仕方
私も昔(6年程前)、同じような事を苦労した覚えがあります・・・が、成功したのかどうか、覚えていません(汗)
どうやったのかも覚えていなかったり・・・
ちょっと過去のプログラム探して見ます。
でも、あまり期待しないで下さい。前の会社の話なので、資料残ってないかもです。


> 以上、まとまらないながら、補足させていただきました。
なんて言われても、困ってしまいます(笑)

質問を出すなら、まとめましょう。
いろはさんしか、まとめることはできないのですよ。

今、本当に「つまづいている」のは、何でしょうか?
漠然としすぎて、具体的に何が聞きたいのか、読み取れません。
質問する内容も、ポイントを絞って質問した方が、解答を得られやすいと思いますよ。
ここに書いた内容では、答えれる人は多分いないです(汗)

それから、質問の内容がどんどん移行してしまい、WSHでもADSIでもなくなったので、他のサイトに質問出されたほうが、的確なアドバイスが頂けるかも知れません。

あぁ、ダメ。説教モード入ってしまった(笑)

かば さん 2003年 07月 30日 09時 05分 03秒

すみません!以前の書き込みの訂正をさせてください(汗

If Reg(element.OuterHTML,"売上データ") Then
End If

という部分がありますが、自分でかいた文字検索のプロシージャです。
うっかり消し忘れました!!申し訳ございません。

Return