ちなみに 下のスクリプトは
Xボタンを押したときだけでなく、ほかのページへ移動するときもダイアログを表示させます。
To 管理人むたぐち さん
お久しぶりです。最近書き込むことがなかったので書き込みはしていませんでしたが、
でもいつも参考にさせていただいています。
To: miura さん
<SCRIPT TYPE="text/vbscript">
<!--
window.onbeforeunload = GetRef("subClose")
Sub subClose
Window.Event.ReturnValue="ほかのページへ移動しますか?"
End Sub
-->
</SCRIPT>
というスクリプトを書くと、ダイアログが表示されます。ここでキャンセルボタンを押せばウインドウは閉じられません。
OKを押すと閉じてしまいますが。
警告を出すだけでよいのなら、
window.onbeforeunload = GetRef("subClose")
Sub subClose
MsgBox "閉じないでください。"
End Sub
でいけると思います。
To: miura さん
すみません、ここVBSのサイトでしたね。(汗)
日頃、JScriptの方ばかり使ってるので・・・つい。
VBSでなら、OnQuit というイベントが用意されてるみたいです。
VBSの方は、からっきしなのでこれ以上のサポートはできません。(笑)
どなたか、助け舟を・・・
自己レスです。
過去ログを見れば分かる話でしたね。過去ログも見ずに質問して申し訳ありませんでした。
以後気を付けます。
To: miura さん
僕の使ってる方法の一部です。
下の関数を適当な所で呼び出してください。
function IEexist( ie ) {
try {
var a = ie.Busy;
}
catch(e) {
return( false );
}
return( true );
}
引数は、IEオブジェクト。
戻り値は、trueならIEがある。falseなら閉じられた。
IEオブジェクトのメソッドを使う個所は、
片っ端に try 〜 chatch で囲むといいですよん。
とりあえず、速報。
「Rubyを256倍使うための本」(ASCII,arton著)はずばり買いです。
私も久しぶりにお金を出して買ってしまった(^^;
詳細はまたそのうち書きます。
参考URL:
http://www.geocities.co.jp/SiliconValley-PaloAlto/9251/index.html
http://www15.freeweb.ne.jp/computer/ruby256/
こんにちは。むたぐちさんのページにはいつもお世話になっております。
さて、一つ質問があるのですが、WSHを使って、プリンタの設定をすることはできるでしょうか?
当方、LPRポートを利用しているのですが、ホスト名、キュー名、プリンタ名、ドライバの位置、
等を指定して、スクリプト一発で設定できるようなものになればいいなあ、と思っております。
出来るか出来ないかだけでも、おしえていただけないでしょうか。
よろしくお願い致します。
ブラウザーを右上の×で閉じたときに、alertで警告を出したいのですが
スプリクトの書き方がわかりません。
よい方法はありませんか。
久しぶりにそこそこまともな更新をしてみました(^^;
To: O2 さん
> (1) WSH スクリプトを実行中に、外部の操作で中断する方法はありますか。
基本的にはありませんが、*.wshファイルを使えば、タイムアウトの時間を設定することが
できます。詳しくは「WSHを導入するには?」を見てください。
また、WMIを使えば、実行中のプロセスを終了させることができます。
Win9x系でこの手法を使うのはあまりよくないかもしれませんが。
To: ONO さん
> .NETは調べるほどに面白くなってきます。
> でもVBScriptなくなっちゃうんですよねぇ。。。
> ま、プログラムは今以上にお手軽になってくる感じなんで、期待大!
え、なくなるんですか?
Visual Basicと統合されるって聞いたんですけど…。( = なくなるってこと?)
> リンクは御自由にどうぞ(^^)
早速張らせていただきました。
最近いろいろ忙しくて、更新もままならない状況ですが、ご了承ください > All
なんか掲示板で公言しておきながらやり忘れているようなことがあったら、ご指摘ください。
# やるかどうかは別ですが(^^;
> 丸囲みの数字は掲示板等では利用しないほうがいいと思います。
> ということで)にします(^^)
半角カナの凶悪さにはおよびませんが、まあ使用を控えていただくほうが確実ですね。
> 2)スクリプトからExcelを終了させる方法なら、私のサイトの
> 関東勉強会(2000/3/11)の資料の中にDHTMLでのサンプルが
> 置いてあります。
> WSHからも同じ方法が利用できます。
フォローありがとうございます。
これもWMIで強引にプロセスをKILL、とかもできるんですが、やめておいたほうがいいでしょうね。
管理人さんへ:
.NETは調べるほどに面白くなってきます。
でもVBScriptなくなっちゃうんですよねぇ。。。
ま、プログラムは今以上にお手軽になってくる感じなんで、期待大!
リンクは御自由にどうぞ(^^)
O2さんへ:
丸囲みの数字は掲示板等では利用しないほうがいいと思います。
ということで)にします(^^)
1)中断できるようなプログラムにするぐらいしかないと思います。
もしくはタスクマネージャーあたりからむりやり終了するとか。。。(^^;
2)スクリプトからExcelを終了させる方法なら、私のサイトの
関東勉強会(2000/3/11)の資料の中にDHTMLでのサンプルが
置いてあります。
WSHからも同じ方法が利用できます。
はじめまして、
こちらのHPを見させて戴いて、何か面白そうな事ができそうだと感じ
WSH を始めたばかりで恐縮ですが以下の事を教えて戴ければ幸甚です。
@ WSH スクリプトを実行中に、外部の操作で中断する方法はありますか。
A WSH から Excel を起動し、自動的に情報を書き込む様にして
いるのですが、スクリプト終了時に Excel も終了させることは
できるのでしょうか。
宜しくお願いします。
To: 石田正人 さん
> 卒業研究の関係で毎週水曜日にここのHPを参考にさせてもらってます。
> 卒業研究の中間発表で”参考文献”の欄にここのHPを書かせていただきます。今後もよろしくおねがいします。
どんな卒業研究か、私なんかには想像すらできませんが、何かのお役に立っているならこれほど
うれしいことはありません(^^;
中間発表…。私もそろそろ…。
To: hiromi さん
> VBのプログラムで、処理をWaitさせたいのですが
> CPU使用率が100%のため、システムに負担がないような
> Sleepコマンドみたいなものを探して処理をWaitさせたいのですが
> ヘルプの中では見つけられませんでした。
Win32APIは調べましたか?
Sleep関数なんてどうでしょうか。
> 5秒分ぐらい、ループを回してみましたが
> CPU使用率は100%で却下でした。
ループ内でDoEventsを使えばいいような気がします。
ただし、DoEventsにはなにやら弊害もあるようで、注意が必要かもしれません。
ヘルプも参照してください。
ところでなぜVB? (^^;
To: 思い出おじいさん さん
> Inetと.OpenURLでHTMLソースを取得することはできるのですが
> 文字コード違いによる文字化けの対処方法はあるのでしょうか?
VBSでは、ShiftJISとUnicode以外の文字コードは、基本機能としては解釈できません。
そのため、文字コード変換をおこなってくれる、BASP21などのCOMコンポーネントを併用する
必要があります。
# nkf32のCOMコンポーネント版とかないですかね?
もしくは、OpenURLで、バイト配列として読み込み、それをちゃんとした文字列に変換する
コードを書くという方法もあるかもしれません。
この場合、EUC、ShiftJISなどの文字コードの仕様を知っておく必要がありますが。
> また、WSHではインクルードの方法はありますか?
WSH2.0から使えるようになった、WSFファイルの形式ならば可能です。
詳しくは、WSH2.0のヘルプを参照してください。
To: TAk さん
> WSHでひとつのフォルダ上にあるファイル名を検索して見つ
> かったらMsgboxでOK
> 見つからなかったらNGというメッセージを出したいんですが
> やりかたがわかりません。
> WSHではむりでしょうか?
ONOさんの回答にもあるように、可能です。
FileExistsメソッドを使います。
To: ONO さん
> おもしろい話題が多い掲示板ですね。
> これからちょくちょくよらせてもらおうかと思います。よろしく。
こちらこそよろしくです。
ぜひさらに面白い話題を提供してください(^^;
ONOさんのページ、少し拝見しました。
.NETの記事、期待してます。
# リンクを張らせていただきますね。
はじめまして。
管理人さんへ:
おもしろい話題が多い掲示板ですね。
これからちょくちょくよらせてもらおうかと思います。よろしく。
#過去の記事も読んでみよっと。
TAkさんへ:
WSHからFileSystemObjectが利用できます。
このオブジェクトを利用することで、ファイルが存在するかどうかの
確認が可能です。
ヘルプ等に使い方のってるかと思いますので調べてみてください。
WSHでひとつのフォルダ上にあるファイル名を検索して見つ
かったらMsgboxでOK
見つからなかったらNGというメッセージを出したいんですが
やりかたがわかりません。
WSHではむりでしょうか?
To: おじゃる さん
> むたぐちさんのおっしゃるとおり、私もWMIを使用してみました。
> ということで、ご参考までに・・・
どうもありがとうございます。
WMIは強力なので(2000とMeなら最初から使えますし)、みなさんにもぜひ使っていただきたいですね。
IPアドレスだけではなく、いろいろなプロパティがあるのですね。
でも、多くが読取専用だったと思います。
IPアドレスはEnableStaticメソッドで設定できるようですが、ほかも変えられるんでしょうか。
# ちょっと今、手元にヘルプがないもので…(^^;
はじめまして。
WSHの質問です。
Inetと.OpenURLでHTMLソースを取得することはできるのですが
文字コード違いによる文字化けの対処方法はあるのでしょうか?
以下が実際のWSHソースです。
Set inet = WScript.CreateObject("InetCtls.Inet")
inet.URL=vURL
inet.AccessType = vAccessType
If (vAccessType = 2) Then inet.Proxy = vProxy
inet.RequestTimeOut=20
data = inet.OpenURL(inet.URL)
また、WSHではインクルードの方法はありますか?
VBのプログラムで、処理をWaitさせたいのですが
CPU使用率が100%のため、システムに負担がないような
Sleepコマンドみたいなものを探して処理をWaitさせたいのですが
ヘルプの中では見つけられませんでした。
5秒分ぐらい、ループを回してみましたが
CPU使用率は100%で却下でした。
Sleepにあたる関数やキーワードを探してみましたが
マルチメディアコントローラーに使用するものだったりと
処理をWaitしてシステムに負荷をかけないものが
探しきれませんでした。
もし、なにかいい方法をご存じでしたら
教えて下さい。
お願いいたします。
むたぐちさんはじめまして。
卒業研究の関係で毎週水曜日にここのHPを参考にさせてもらってます。
卒業研究の中間発表で”参考文献”の欄にここのHPを書かせていただきます。今後もよろしくおねがいします。
To: Pinball さん
回答ありがとうございます。
> 初めて来ていきなり回答してしまってスミマセン。
いえいえ、どんどん回答していただくと、とてもありがたいです。
とくに私にはわからない質問には(^^;
> WSHは私も始めたばかりなので参考にさせていただきます。
> 今後とも宜しくお願い致します。(^^)
はい。こちらこそ、よろしくお願いします。
To: yuzo さん
> プロセス毎のCPU使用率をブラウザ上で表示させたいと考えています。
> (タスクマネージャのプロセス画面的なもの)
> 過去の記事を見ていると、WMIならできそうな気がするのですが、可能でしょうか?
> 参考になりそうなサンプルコードがあれば教えてください。
可能だと思います。Win32_Processクラスにそういうプロパティがあったはずです。
SDKを参照してください。
また、WSHのメーリングリストで、そのようなサンプルが投稿されていたと思います。
http://www.users.gr.jp/ml/wsh.asp
ちなみに、WMIのことなら、このMLに詳しい人がいます。
私も一つ質問しました。
ついでだからその質問をここにも書いておきますが、LAN上にあるWinMeとWin98間での
WMIによる制御は可能か、ということです。
私がやってみたところ、うまくいかなかったので、もしかするとWin2000が
必須なのかもしれません。
# Win2000Pro同士なら可能だったというフォローがあったので。
# ちなみに、私もチャブーンさんのWin2000 Serverと私のWin2000 Pro間で、VPNを
# 介してのテストは成功させています。
> それから、プロセス毎のCPU使用率をGetするユーティリティも探しています。
> (ファイルにリダイレクトさせて、PerlやASPで加工して表示させることを考えています。)
というか、それをWMIでやらせるという話ではないのですか?
ASPなら、WMIとの親和性も高いですから。
# 要するに、ASPのVBSから、GetObjectを使ってそのままWMIを呼び出せるわけです。
# 実際に私もASP中でWMIを呼び出すサンプルを作ったことがあります。
# http://www.microsoft.com/japan/developer/thisweek/wmi/koj990730.asp にも例がありますね。
はじめまして。おじゃるです。
たいへん為になる書き込みが多く、
いつも参考にさせていただいております。
To:skiさん
> Windows2000上でIPアドレスをMsgboxで表示させようと思ったのですが、なかなかできません。IP取得の方法を教えてください。
むたぐちさんのおっしゃるとおり、私もWMIを使用してみました。
ということで、ご参考までに・・・
++++++++++++++++++++++++++++++
On Error Resume Next
SearchPC = inputbox("検索するPC名を入力してください。","NIC情報検索")
Set objComputer = GetObject("winmgmts:{impersonationLevel=impersonate}!//" & SearchPC)
Set NICs = objComputer.ExecQuery("select * from Win32_NetworkAdapterConfiguration")
Msg = ""
For Each Adapter In NICs
Msg = Msg & "ホスト名:" & vbTab & vbTab & Adapter.DNSHostName & vbCr
Msg = Msg & "ドメイン名:"& vbTab & vbTab & Adapter.DNSDomain & vbCr
Msg = Msg & "ネットワークアダプタ:" & vbTab & Adapter.Description & vbCr
IPAddress = Adapter.IPAddress
IPSubnet = Adapter.DHCPEnable
DefaultIPGateway = Adapter.DefaultIPGateway
If IsArray(IPAddress) Then
For I = LBound(IPAddress) To UBound(IPAddress)
Msg = Msg & "IPアドレス/マスク:" & vbTab & IPAddress(I) & " / " & IPSubnet(I) & vbCr
Msg = Msg & "デフォルトゲートウェイ:" & vbTab & DefaultIPGateway(I) & vbCr
Next
Msg = Msg & "MACアドレス:" & vbTab & Adapter.MACAddress & vbCr
Msg = Msg & "プライマリWINSサーバ:" & vbTab & Adapter.WINSPrimaryServer & vbCr
Msg = Msg & "セカンダリWINSサーバ:" & vbTab & Adapter.WINSSecondaryServer & vbCr
End If
Msg = Msg & vbCr
Next
WScript.Echo Msg
初めまして、yuzoといいます。
よろしくお願いします。
プロセス毎のCPU使用率をブラウザ上で表示させたいと考えています。
(タスクマネージャのプロセス画面的なもの)
過去の記事を見ていると、WMIならできそうな気がするのですが、可能でしょうか?
参考になりそうなサンプルコードがあれば教えてください。
それから、プロセス毎のCPU使用率をGetするユーティリティも探しています。
(ファイルにリダイレクトさせて、PerlやASPで加工して表示させることを考えています。)
これに近いもので、
http://www.sysinternals.gr.jp/pslist.htm
があるのですが、これはCPU時間は取得できるのですが、CPU使用率は取得できません。
あとリソースキットにpmon.exeという、まさにタスクマネージャを表示させる
コマンドがあるのですが、これをファイルに落とす方法がわかりません。
ご教授よろしくお願いします。
はじめまして、Pinballです。
はやさんへ
>オラクルDBにODBC接続してSQLを実行させたいのですが
>その方法がわかりません。
当方はOracle8iでOO4Oを使用して接続したことがありますので、参考にしてください。はやさんはODBCと言うことなので記述が全然違いますが(^^;
---------------------
Set objSession = CreateObject("OracleInProcServer.XOraSession")
Set objDb = objSession.OpenDatabase(DBNAME, UID_PASS, 0)
Set objRst = objDb.CreateDynaset(SQL, 4)
---------------------
DBNAMEにはネットサービス名を、UIS_PASSにはユーザーIDとパスワードをスラッシュでつなげたものを(例えばユーザーGUESTパスワードLOGINだとしたらGUEST/LOGIN)、SQLにはSQL文を入れてください。
これで大丈夫だと思います。
管理人さんへ
初めて来ていきなり回答してしまってスミマセン。
WSHは私も始めたばかりなので参考にさせていただきます。
今後とも宜しくお願い致します。(^^)
To: ski さん
> Windows2000上でIPアドレスをMsgboxで表示させようと思ったのですが、なかなかできません。IP取得の方法を教えてください。
過去記事リスト19の2番目、11の44番目、4の9番目、4の8番目の記事を参考にしてください。
Win2000やWinMeでは、WMIを使う方法がお勧めです。
To: みか さん
> accessでセキュリティ設定に対応するレジストリキーを書きかえる
こともできるんですよね?
> VBSを使わなくてもできるということですよね?
というか、私はAccessのことをよく知らないのでなんともいえないのですが、
レジストリ書き換えの機能があれば、の話です。
ところで、AccessではVBSは動かないんでしょうか?
> セキュリティ設定に対応するレジストリキーがわからないので、
> 教えていただけますか?
私も知らないです。
レジストリエディタで探してみてください。
To: はや さん
> オラクルDBにODBC接続してSQLを実行させたいのですが
申し訳ないですが、ODBCのことはまったくわかりません。
> 4行目で引数が正しくないと言うメッセージが出て落ちてしまいます。
> Workspacesオブジェクトの扱い方がわかりません。
となると、引数が正しくないんでしょう(^^;
正しい引数を指定してください。
# ヘルプとかないんですか?
なお、引数のデータ型や数くらいなら、VBのオブジェクトブラウザ、MSのサイトで
ダウンロードできるCOMオブジェクトビューアなどで調べられます。
初めまして。
WSHをはじめたばかりの初心者です。
オラクルDBにODBC接続してSQLを実行させたいのですが
その方法がわかりません。
下記のようなコードを考えてみました。
4行目で引数が正しくないと言うメッセージが出て落ちてしまいます。
Workspacesオブジェクトの扱い方がわかりません。
CreateWorkspaceメソッドでもいろいろと試してみたのですが・・・
ご教授ください。
01 Dim obj, wks, con
02
03 Set obj = Wscript.CreateObject("DAO.DBengine.35")
04 Set wks = obj.Workspaces("AAA", "BBB", "", 1)
05 Set con = wks.OpenConnection("CCC", , , "ODBC;DATABASE=DDD;UID=EEE;PWD=FFF;DSN=GGG")
06
07 con.Execute "drop table TB001"
08
10 MsgBox "終了!"
TO 管理人むたぐち さん
回答ありがとうございます。
>また、2.の操作は、セキュリティ設定に対応するレジストリキーを直接
>書き換えてやることでも実現するような気がします。
accessでセキュリティ設定に対応するレジストリキーを書きかえる
こともできるんですよね?
VBSを使わなくてもできるということですよね?
セキュリティ設定に対応するレジストリキーがわからないので、
教えていただけますか?
Windows2000上でIPアドレスをMsgboxで表示させようと思ったのですが、なかなかできません。IP取得の方法を教えてください。
To: みか さん
> プログラムを作成していて、
> ACCESS97からEXCEL97を起動する時に、すべて自動化したいのですが、
> マクロを有効にするかしないかのダイアログボックスがどうしてもでてしまいます。
> 危険な事かもしれませんが、accessとexcelの間にスクリプト(vbs)をはさむことによって、自動化できるらしいので、その方法を知っていたら、教えてください。
>
> やりたいこと
> 1.excel97を開く。
> 2.マクロのセキュリティを低くするキー操作をスクリプトにて実行。
> 3.excelを閉じる。
> 4.実行したいexcelを開く。
> 5.セキュリティを戻すキー操作をスクリプトにて実行。
えっと、まず、VBSを動かす環境は、WSHでしょうか、Accessでしょうか、
Excelなのでしょうか。
それによって変わってくると思います。
もし、WSHでやるのなら、
1. WshShell.Run でExcelを起動、もしくは Excel.ApplicationをCreateObjectする。
2. WshShell.SendKeysで、セキュリティ設定のキー操作を再現。
3. SendKeysでAlt+F4を送るか、ExcelオブジェクトのQuitメソッド(あるかどうか
しりませんが)でExcel終了。
4. 1.と同様に。
5. 2.と同様に。
でOKだと思います。
SendKeysは、WSH2.0からの機能であることに注意してください。
また、2.の操作は、セキュリティ設定に対応するレジストリキーを直接
書き換えてやることでも実現するような気がします。
To: aki さん
> VBで数字だけ返す関数Valがありますが、VBSでは使えないのですか。
使えません。
VBSの制限の一つです。
> 他に数字だけ返す方法はありませんか。
IsNumber関数、CInt(CLng, CDbl etc)関数、Mid関数etcを併用すればできると思います。
それか、正規表現を使うのがいいと思います。
Win meには、WMIが標準でインストールされているみたいです。
以上。(笑)
To: 【おじさま】 さん
> 今ここに Win95 や Win98 の環境がないので試せないのですが、きっとおっしゃ
> る通りなのでしょう。Win2000 + FAT32 でもきっと正しく返るのでしょう。
私もとある理由で、現在Win2000環境が手元にないのですが(しかも次にインストール
する際にはNTFSにするつもり)、おそらく大丈夫だと思います。
もし、これが大丈夫じゃないのだとすると、FAT32そのものの制限と考えられるでしょうね。
> なぁーーんだ、WinNT 系で使っている限りはあんな面倒なことやらなくても良か
> ったんですね(って書いても当時は NT 系持っていなかったので仕方がないので
> すが)。
WinNTのsp?以前は、FAT32の読み書きはできなかったでしょうから、FAT32そのものの
制限であるかどうかという決着はつけられませんね。
ぜひ、NT系+FAT32で運用している方に検証していただきたいところです。
To: hon さん
> ただ、まず最初の方法で試してみたのですが、
> 100KBのファイルなので6000msec程かかってしまうのが残念です。
> これからもうひとつの方法も試してみようと思います。
方法としてはどちらも同じなので、速度アップはあまり期待できないでしょう。
FileSystemObjectでは、シーケンシャルアクセスしかできないという制限が問題なわけです。
ファイル読み書きの機能をもった、ほかのコンポーネントを探してみるのも
いいかもしれません。
# それにしても6000msecって、要するに6秒なんですね。
# それくらい待ってもいいんじゃないかという気もちょっとしたり…。
To: SIGNAL9 さん
> リンクページでご紹介いただいているDoodleの作者でございます。
> ご無沙汰しております。
どうもお久しぶりです。
Doodleは、WSHから画像を扱いたい方にお勧めのコンポーネントです。>ALL
> 拙作、久しぶりにバージョンアップ(^^;)いたしました。
> いちおうPNGに対応いたしましたので、御笑覧いただければ
> 幸いです。
時代の流れに乗ってますねえ(^^;
ということは、GIFは廃止ですね。(というか、もともと対象外でしたっけ…)
うちのページもはやくGIF Free(そんな言葉ないですか)にしなければ。
To: やべ さん
> どのように解決したのかご参考になればと思い書き込みました。
どうもです。
> 結局はコンボボックスの OPTION VALUE に、本来必要な値以外に
> 表示に使っている値の両方を持たせました。
> <OPTION VALUE="0001">やべ
> としていたところを
> <OPTION VALUE="0001やべ">やべ
> としたわけです。
> で、必要な部分を「LEFT関数」なり「MID関数」で取り出しました。
> この方法は本来の値(0001の部分)が4桁と決まっていたので可能でしたが
> もし桁数が特定できない場合には「0001;やべ」などとして「;」などの区切り文字
> をいれればそこから前と後ろで見分けることができるわけです。
なるほど、そういう方法がありますね。
# というか、ようやく、されたかったことがわかりました(^^;
この方法をみて思い出したんですが、以前、Scripting.Dictionaryオブジェクトで
多次元の要素を格納する方法として、同様に";"などをスプリッタにする方法が
紹介されていました。
しかし、よく考えるとDictionaryオブジェクトは、各要素にどんな型の値もとれる、
すなわち、配列もOKなので、要素を配列にしてやると簡単に実現できるんですね、これが。
閑話休題。
やべさんのニーズを実現するための、ほかの方法を紹介します。
<select name="cmb">
<option value="A">dataA</option>
<option value="B">dataB</option>
<option value="C">dataC</option>
</select>
document.all.cmb.options(0).text とすると、dataAが取れます。
optionの総数はoptions.lengthでとれます。
また、<option name="hoge" value="A">dataA</option>
としておくと、document.all.cmb.hoge.textでも取れます。
VBで数字だけ返す関数Valがありますが、VBSでは使えないのですか。
他に数字だけ返す方法はありませんか。
よろしくお願いします。
はじめまして。
WSHもVBSもはじめて知ったばかりなので、分からないことだらけで、
いろいろ検索していたら、このページを見つけました。
プログラムを作成していて、
ACCESS97からEXCEL97を起動する時に、すべて自動化したいのですが、
マクロを有効にするかしないかのダイアログボックスがどうしてもでてしまいます。
危険な事かもしれませんが、accessとexcelの間にスクリプト(vbs)をはさむことによって、自動化できるらしいので、その方法を知っていたら、教えてください。
やりたいこと
1.excel97を開く。
2.マクロのセキュリティを低くするキー操作をスクリプトにて実行。
3.excelを閉じる。
4.実行したいexcelを開く。
5.セキュリティを戻すキー操作をスクリプトにて実行。
to みなさま
しばらく前にコンボボックスのことで投稿したやべです。
どのように解決したのかご参考になればと思い書き込みました。
結局はコンボボックスの OPTION VALUE に、本来必要な値以外に
表示に使っている値の両方を持たせました。
<OPTION VALUE="0001">やべ
としていたところを
<OPTION VALUE="0001やべ">やべ
としたわけです。
で、必要な部分を「LEFT関数」なり「MID関数」で取り出しました。
この方法は本来の値(0001の部分)が4桁と決まっていたので可能でしたが
もし桁数が特定できない場合には「0001;やべ」などとして「;」などの区切り文字
をいれればそこから前と後ろで見分けることができるわけです。
という感じです。
といっても私も人様から教えていただいたのですが・・・(笑)
ご存知のかたもたくさんいらっしゃると思いますが、とりあえずご報告まで・・・。
管理人むたぐち さん:
>"""c:\\Program Files\\xxx\\xxx.exe"" " & hikisu
アプリケーションの起動という所にありましたね。
どうもすみません。m(__)m
そして、ありがとうございました。m(__)m
リンクページでご紹介いただいているDoodleの作者でございます。
ご無沙汰しております。
拙作、久しぶりにバージョンアップ(^^;)いたしました。
いちおうPNGに対応いたしましたので、御笑覧いただければ
幸いです。
To: 管理人むたぐち さん
回答ありがとうございます。
おかげさまでやりたいことが処理できるようになりました。
ただ、まず最初の方法で試してみたのですが、
100KBのファイルなので6000msec程かかってしまうのが残念です。
これからもうひとつの方法も試してみようと思います。
管理人むたぐち さん
>Win9xでGetDiskFreeSpaceが2Gまでしか認識しない(NT,2000では大丈夫)という
>動作で間違いないようです。
えっ、そうなんですか。と、実際に Win2000 + NTFS でやってみました。
おっしゃるように GetDiskFreeSpace は正しい値を返しました。またスクリプト
でも Drive オブジェクトの FreeSpace や TotalSize も正しく返ります。
以前は正しく返らなかったのでわざわざここでご紹介した方法を使ったのですが
確かにあれを書いた頃は Win98 だったと思います(FAT32 だったしスクリプト
も今より古い)。
今ここに Win95 や Win98 の環境がないので試せないのですが、きっとおっしゃ
る通りなのでしょう。Win2000 + FAT32 でもきっと正しく返るのでしょう。
なぁーーんだ、WinNT 系で使っている限りはあんな面倒なことやらなくても良か
ったんですね(って書いても当時は NT 系持っていなかったので仕方がないので
すが)。
To: AKiOS さん
> 別個ではなく、続けて読めばそう解釈できますね。(^^;
ええ、たしかにわかりにくい説明です。
Win95(OSR2.0も含む)とWin95OSR2.0を別々に表記してあるところとか…。
> 私のところでは2G以上の容量でも正常な値だったことと、
> # これはWin98のfdiskではなく、別のOSでパーティションを切って
> # フォーマットしたので、たまたま正常な値だったのかもしれません。
それがどうも原因の本質みたいですね。
ちなみに、
http://support.microsoft.com/support/kb/articles/Q231/4/97.ASP
↑こんなページがありました。
Win9xでGetDiskFreeSpaceが2Gまでしか認識しない(NT,2000では大丈夫)という
動作で間違いないようです。
(そうでないと、GetDiskFreeSpaceExの存在意味がわからなくなります(^^;)
> で、ちょっと調べてみましたが、Win95 OSR1ではGetDiskFreeSpace()を
> それ以外ではGetDiskFreeSpaceEx()を使用するみたいです。
> 具体的にはGetDiskFreeSpaceEx()をまずやってみる、GetDiskFreeSpaceEx()が
> なければGetDiskFreeSpace()で計算する、ということのようです。
MSDNライブラリでは、GetVersionEx関数でOSR2.0以降かどうかを判別してから
GetDiskFreeSpaceEx関数を使用することを推奨していました。
To: hon さん
> FileSystemObjectで、テキストファイルの途中に行を追加したいと思っています。
> ReadLine()と正規表現での検索を繰り返していって、一致したらLineで
> 行を追加したい場所の行番号を取得します。
> その後、WriteLine()でその場所に書き込みたいのですがどのようにすればいいんでしょうか?
TextStreamは、一つのテキストファイルに対して同時にreadモードとwriteモードで
開くことはできなかったと思います。
また、writeモードでは、既存のファイルに対しては、すべて上書きするか、
末尾に追加するしか方法がありません。
以上の制限を考えると、
まずreadモードで開き、ReadLineを繰り返し、その都度変数にその行の文字列を
追加していく。
一致する行があれば、ReadLineの返り値 & 改行 & 挿入したい行 を変数に追加する。
次に、readモードで開いたファイルを閉じ、writeモード(上書き)で開きなおす。
最後に、WriteAllで先ほどの変数をそのまま書き込む。
# 1次元配列を使って、各要素にReadLineの返り値を格納し、それをWriteLineで
# 書き込んだ方がスマートかもしれないです。
で、OKだと思います。
私がそう思っているだけで、実はもっと良い方法があるかもしれません。
はじめまして、最近WSHを知ったばかりの初心者ですがよろしくお願いします。
FileSystemObjectで、テキストファイルの途中に行を追加したいと思っています。
ReadLine()と正規表現での検索を繰り返していって、一致したらLineで
行を追加したい場所の行番号を取得します。
その後、WriteLine()でその場所に書き込みたいのですがどのようにすればいいんでしょうか?
To: 管理人むたぐち さん
> > > OSR2でも、GetDiskFreeSpace関数を使っている限りは、2G以上の領域を正常取得できない
> > > と解釈できます。
> >
> > うーん、それは深読みし過ぎではないですか。
>
> というか、それ以外にどう解釈できるんでしょう(^^;
別個ではなく、続けて読めばそう解釈できますね。(^^;
私のところでは2G以上の容量でも正常な値だったことと、
# これはWin98のfdiskではなく、別のOSでパーティションを切って
# フォーマットしたので、たまたま正常な値だったのかもしれません。
説明文で、OSR2以降では「GetDiskFreeSpaceEx()が使用できます」と
なっていて「GetDiskFreeSpaceEx()を使用して下さい」ではなかったので
そういうふうには思いませんでした。
で、ちょっと調べてみましたが、Win95 OSR1ではGetDiskFreeSpace()を
それ以外ではGetDiskFreeSpaceEx()を使用するみたいです。
具体的にはGetDiskFreeSpaceEx()をまずやってみる、GetDiskFreeSpaceEx()が
なければGetDiskFreeSpace()で計算する、ということのようです。
To: moto さん
> Set objWshShell = CreateObject("WScript.Shell")
> ExePath = "c:\\Program Files\\xxx\\xxx.exe " & hikisu <- 1
> ExePath = "c:\\Progra~1\\xxx\\xxx.exe " & hikisu <- 2
> objWshShell.Run ExePath
VBSの場合、\\ではなく\でいいと思うんですが、それはともかく。
"""c:\\Program Files\\xxx\\xxx.exe"" " & hikisu
もしくは
chr(34) & "c:\\Program Files\\xxx\\xxx.exe" & chr(34) & " " & hikisu
でどうでしょうか。
なんでスペースが入っているとだめなのか、とかの事情は、たしか「WSHテクニック集」か
どこかに書いたと思います。
To: AKiOS さん
> > OSR2でも、GetDiskFreeSpace関数を使っている限りは、2G以上の領域を正常取得できない
> > と解釈できます。
>
> うーん、それは深読みし過ぎではないですか。
というか、それ以外にどう解釈できるんでしょう(^^;
> もしそうなら、GetDiskFreeSpaceEx()はどうやってディスク容量や空き容量を
> 計算しているんでしょう?(^^;
それはkernel32.dllを作った人に聞いてみなければ…。
> もしよければ、VBかなんかでGetDiskFreeSpace()をテストしていただけませんか。
> # ちなみに、私のところではDriveオブジェクトのTotalSizeプロパティも
> # BC++からGetDiskFreeSpace()で計算しても同一の結果になります。
テストしてみました。2G以上の空き領域、容量をもつドライブを指定しました。
lpSectorsPerCluster * lpBytesPerSector * lpNumberOfFreeClusters or lpTotalNumberOfClusters
どちらも2,147,155,968を返します。
2,147,483,648(=2G)と近いですが、ちょっと違います。
また、Driveオブジェクトの場合も同じ値を返します。(すいません。2Gではありませんでした)
> SP1は当てていませんが、kernel32.dllのバージョンもSEでないというのも
> 同じですね。
SEでも試してみましたが同じ結果です。
みなさんは、どうでしょうか。
To: やべ さん
> 2つ下に投稿したやべです。
> 下記の内容の質問は無事解決できました。
せっかくなので、どうやって解決されたかを書いていただくと私はうれしいです(^^;
2つ下に投稿したやべです。
下記の内容の質問は無事解決できました。
また機会があれば宜しくお願いします。
To: 管理人むたぐち さん
> OSR2でも、GetDiskFreeSpace関数を使っている限りは、2G以上の領域を正常取得できない
> と解釈できます。
うーん、それは深読みし過ぎではないですか。
もしそうなら、GetDiskFreeSpaceEx()はどうやってディスク容量や空き容量を
計算しているんでしょう?(^^;
もしよければ、VBかなんかでGetDiskFreeSpace()をテストしていただけませんか。
# ちなみに、私のところではDriveオブジェクトのTotalSizeプロパティも
# BC++からGetDiskFreeSpace()で計算しても同一の結果になります。
> kernel32.dllのバージョンに依存しているのかも。
> 私のところは4.10.1998です。
> SP1は当てていますが、SEではありません。
SP1は当てていませんが、kernel32.dllのバージョンもSEでないというのも
同じですね。
> > 確かに2G未満のときはLong型なのですが、2G以上のときはDouble型に
> > なりませんか?
>
> 私のところではなりません。
> 2G以上なら、2Gとされます。データ型は常にLongです。
16進では&h80000000になるということでしょうか?
Long型変数の値が最大値(&h7fffffff)であるとき、1を加えるとちょうど
2Gですが、私のところではLongからDoubleになります。
はじめまして、VB Scriptを始めて1週間の未熟者です。
さっそくですがご質問があります。選択メニュー(コンボ)に、あるマスタから
コードと名称をセットします。
通常は名称を表示していてそれを選択し、裏ではそのコードをもらって処理します。
これ自体はいいんですが、表示している名称自体をある変数の値として受け取りたい
のですが、それは可能でしょうか?
変数名が"strCmb"だとして
strCmb = コンボ名
これではコードしかもらえないですよね?
strCmb = コンボ名.text
みたいなプロパティはないのでしょうか?
ご存知の方、やったことのあるかたがいらっしゃれば宜しくお願いします。
下記のようにEXEを呼び出しているのですが、
上手くEXEを呼び出す事ができません。
1 から 2 に変更すると上手く起動する事ができました。
しかし、見ての通り書き方がおかしいので、なんとかフルパスで
指定したいのですが、どのようにすればいいのでしょうか?
Set objWshShell = CreateObject("WScript.Shell")
ExePath = "c:\\Program Files\\xxx\\xxx.exe " & hikisu <- 1
ExePath = "c:\\Progra~1\\xxx\\xxx.exe " & hikisu <- 2
objWshShell.Run ExePath
To: AKiOS さん
> MSDNライブラリを見たわけではありませんが、その2G云々というのはFAT16の
> ことではないですか?
> # 初期のWin95(OSR2.0未満)はFAT16なので各ドライブの容量(パーティション)
> # が2Gを超えることはないです。
私も最初はそういうことなんだと思っていたのですが…。
まあ、読んでみてください。
----MSDNライブラリのGetDiskFreeSpace関数の説明より引用ここから----
Windows 95:
2GB より大きいボリュームに対してこの関数を使うと、正しくない値を返します。それ以下の場合でも、lpSectorsPerCluster、lpNumberOfFreeClusters、lpTotalNumberOfClusters パラメータに正しくない値が格納されることがあります。
Windows 95 OSR 2 :
Windows 95 OSR 2 (OEM Service Release 2) 以降で、GetDiskFreeSpaceEx 関数が使用できます。この関数は、ボリュームが 2GB より大きいときも、正しい値を返します。
----ここまで----
OSR2でも、GetDiskFreeSpace関数を使っている限りは、2G以上の領域を正常取得できない
と解釈できます。
> いえ、Win2000が必要だし、サイズが大きいのでダウンロードしていません。
あ、そうでしたね。
> Win98でdllのバージョンもむたぐちさんと同じです。
kernel32.dllのバージョンに依存しているのかも。
私のところは4.10.1998です。
SP1は当てていますが、SEではありません。
# これも同じだったら、もう原因はわかりません(^^;
> > 私のところでは、Win98+Window Script5.5(scrrun.dll 5.1.0.5010)で、
> > TotalSizeプロパティはLong型を返します。
>
> 確かに2G未満のときはLong型なのですが、2G以上のときはDouble型に
> なりませんか?
私のところではなりません。
2G以上なら、2Gとされます。データ型は常にLongです。
DriveオブジェクトのTotalSizeプロパティはVariant型なので、
API関数の返り値次第でデータ型が変わってくるんでしょうね。
To: きむち さん
> ファイルによって自動でプリンタを切り替えたかったのですが
> VBAの方で処理できることがわかりました。
> ここでいうファイルとはxlsやdocなどのOFFICEのものです。
やっと意味がわかりました(^^;
こういう細かい部分まで制御できるところがVBAの強いところですね。
でもまあ、WSH経由でOfficeのコンポーネントを操作しても同じことが
できるでしょうね。
To: 管理人むたぐち さん
こんにちは、説明不足で申し訳ないです。
ローカルプリンタ、ネットワークプリンタともに
ファイルによって自動でプリンタを切り替えたかったのですが
VBAの方で処理できることがわかりました。
ここでいうファイルとはxlsやdocなどのOFFICEのものです。
お騒がせしてすみません。
To: 管理人むたぐち さん
> MSDNライブラリを見る限り、GetDiskFreeSpace関数で2G以上の領域を
> 取得できないのはWin95だけであるとも取れるので、もしかするとNT系では
> 問題ないのかもしれません。
MSDNライブラリを見たわけではありませんが、その2G云々というのはFAT16の
ことではないですか?
# 初期のWin95(OSR2.0未満)はFAT16なので各ドライブの容量(パーティション)
# が2Gを超えることはないです。
> …あ、そうか! たしか、.NET SDKに含まれるFileSystemObjectからは、
> この制限はなくなっているのでした。
> 結局ダウンロードされたわけですか(^^;
> 一応、scrrun.dllのバージョンを教えていただけますか?
いえ、Win2000が必要だし、サイズが大きいのでダウンロードしていません。
Win98でdllのバージョンもむたぐちさんと同じです。
> 私のところでは、Win98+Window Script5.5(scrrun.dll 5.1.0.5010)で、
> TotalSizeプロパティはLong型を返します。
確かに2G未満のときはLong型なのですが、2G以上のときはDouble型に
なりませんか?
To: AKiOS さん
> > GetDiskFreeSpace関数では、Long型の変数だから、2Gまでの容量しか扱えないという
> > 認識は正しいでしょうか。
>
> Currency型等に変換してから掛け算すれば 2G 以上でも問題ないと思いますが。
GetDiskFreeSpace関数が2G以上の領域を扱えないのは、引数がDWORD型、つまり
32bitだからかな、と思ったのですが。
で、DWORD型ってunsigned(やっと意味がわかりました。ありがとうございます)ですが、
VBにはDWORD型に相当するデータ型がないので、Long型(32bit、符号付き)で受けます。
ここでCurrency型で値を受けても、元が32bitなので、結局2G以上の領域は
取得できないのでは。
…と私は思ったわけですが、どうも勘違いのようです。
というのも、よく考えれば、AKiOSさんがおっしゃられるように、
32bit*32bit=64bit(違うか?でも、64bitよりは上だろう(^^;)なので、
その値を受けられるデータ型(VBで言えばCurrency型)さえあれば、
2G以上の領域を扱えるはずだからです。
ということは、GetDiskFreeSpace関数が2G以上の領域を扱えないのは、データ型の
問題とは無関係ということになります。
MSDNライブラリを見る限り、GetDiskFreeSpace関数で2G以上の領域を
取得できないのはWin95だけであるとも取れるので、もしかするとNT系では
問題ないのかもしれません。
> あれ? 私の環境では 2G 以上でも問題ないですよ。
> # ちなみに、そのときのTotalSizeプロパティはDouble型でした。
あれ、何でだろう。
Win98ですよね。
…あ、そうか! たしか、.NET SDKに含まれるFileSystemObjectからは、
この制限はなくなっているのでした。
結局ダウンロードされたわけですか(^^;
一応、scrrun.dllのバージョンを教えていただけますか?
私のところでは、Win98+Window Script5.5(scrrun.dll 5.1.0.5010)で、
TotalSizeプロパティはLong型を返します。
To: 管理人むたぐち さん
> > Drive オブジェクトの
> > TotalSize プロパティあたりの容量系のものって
> > 2G以上を正常に取り扱えないのでしょうか。
>
> そのとおりです。
> これはWindow Script5.5でも直っていないのです。
あれ? 私の環境では 2G 以上でも問題ないですよ。
# ちなみに、そのときのTotalSizeプロパティはDouble型でした。
To: 管理人むたぐち さん
> GetDiskFreeSpace関数では、Long型の変数だから、2Gまでの容量しか扱えないという
> 認識は正しいでしょうか。
Currency型等に変換してから掛け算すれば 2G 以上でも問題ないと思いますが。
> # でもこの2個の関数は、取る引数がぜんぜん違う別物ですね。
> # Exのほうは、空き容量がそのまま取得できますが、Exじゃないほうは、
> # 計算(たぶん掛け算だろう)しないとだめみたいですね。
それは単に空き容量を受け取るための型(int64)がまだなかったからでしょうね。
> ところでunsignedって何でしょう?
符号なし、つまり、負数を扱わない 0 以上の整数のことです。
VBSでいうと Byte が唯一の unsigned なデータ型ですね。
だいぶ返事が滞っていますが、ご了承ください。
見捨てないでね(^^;
To: 【おじさま】 さん
> 事前の準備として
>
> Public Type LInteger 'PULARGE_INTEGER
> lngLower As Long '下位データ
> lngUpper As Long '上位データ
> End Type
>
> Public Declare Function GetDiskFreeSpaceEx Lib "Kernel32" Alias "GetDiskFreeSpaceExA" (ByVal lpDirectoryName As String, ByRef lpFreeBytesAvailableToCaller As LInteger, ByRef lpTotalNumberOfBytes As LInteger, ByRef lpTotalNumberOfFreeBytes As LInteger) As Long
>
> こうしておいて、さらに符号付き長整数型である下位バイトが負に
> なった場合の対処として
…以下省略させていただきます。
大変参考になります。
どうもありがとうございました。
ところで、【おじさま】さんのコードを見ていて気づいたのですが、
DynaCallでGetDiskFreeSpaceEx関数が動かなかった理由がわかりました。
Dynacallは、引数に変数のポインタを指定する関数、すなわち、参照渡し(ByRef)の
引数には対応していないのです。
つまり、これは変数の型の問題ではないため、GetDiskFreeSpace関数も同様に
動きません。
一応、DynaCallには、ByRefを指定するオプション i=r があるのですが、これは
Stringでのみ機能する仕様だそうです。(付属ドキュメントより)
To: AKiOS さん
掲示板過去記事検索スクリプトのバージョンアップ、ご苦労様でした。
次回の更新でアップロードしたいと思います。 > ALL
また一段と使いやすくなっていますよ。お楽しみに。
> 多倍長整数型だと思います。
>
> > C++ には Large Integer ってあるんでしょうか?
>
> 処理系依存ですが VC++ や BC++ なら __int64 がありますね。
この辺、私はさっぱりで、ぜんぜん話についていけないのですが、
なにやら興味深い話ですね。
GetDiskFreeSpaceEx関数について、MSDNライブラリで調べていたところ、
ULARGE_INTEGER型とか書いてあって、Longとちゃうんかい!? と思っていました。
GetDiskFreeSpace関数では、Long型の変数だから、2Gまでの容量しか扱えないという
認識は正しいでしょうか。
# でもこの2個の関数は、取る引数がぜんぜん違う別物ですね。
# Exのほうは、空き容量がそのまま取得できますが、Exじゃないほうは、
# 計算(たぶん掛け算だろう)しないとだめみたいですね。
# VBでは、【おじさま】さんが書かれているように、どちらにしても面倒なことを
# しないといけないみたいですが。
ところでunsignedって何でしょう?
プログラミングをやる人にとっては一般常識かもしれませんが、教えていただけると
うれしいです。
To: mira さん
> さすがにそれでは不便と見えて、VB7でサポートされることに
> なったみたいです。(^^;)
いよいよVB7ですか。
Try...Catch構文(エラー処理に関係あるのかな?)がサポートされるとか聞きますが、
また複雑な言語仕様になるのでしょうか。ちと心配。
あと、コンパイルした実行ファイルが、開発環境のOS依存性を持つとか、変なところが
改善されるとよいですね。
で、VB7ってVB.NETなのでしょうか?
To: たか さん
> 1時間毎にホストのログをDLするようなVBSを作成しています。
> VBSの先頭で
>
> ''1時間後に再度実行できようatコマンドを実行
> Set WSHShell = WScript.CreateObject("WScript.Shell")
> NextTime = Now + (1 / 24)
> WSHShell.Run "at " & Hour(NextTime) & ":" & Minute(NextTime) & _
> " """ & WScript.ScriptFullName & """", WshHide, True
>
> こんなのでやってます。
> 気が付くとなぜかかってにとまってるんですけどなぜか分かりませんでしょうか?
> NT4(SP5)+IE5です。
これって、スクリプト自体を再起呼び出ししているわけですよね。
で、RunメソッドでTrueを指定しているので、無限ループに陥っています。
Falseを指定して、ATコマンドの実行を待たずに終了させるという
解決方法もありますが、あまりいい方法とは思えません。
単純に、前もって、一時間おきにこのスクリプトを実行するスケジュールを
設定しておけばいいと思います。
スケジュール設定自体には、別にスクリプトを使わなくてもいいです。
To: まさ さん
> リンクで紹介されているgoriさんのWSHPlusも試してみたのですが、
> うまくいきませんでした。
それはGoriさんに聞いてみるのが一番早いのでは?
と思っていたら、ご本人によるフォローがありましたね(^^;
Goriさん、どうもありがとうございます。
To: Gori さん
> こちらで調べてみたところ、wshplus.wp_ime.prof は正常に動作していないようです。どんな状況からでも3を返すみたいです。
> また、wshplus.wp_ime.seton/off も、開発環境では動くものの、vbsからの使用では正常に動いていないみたいです。うむむむ・・・
なかなか厄介な問題ですね。
どうか、この難題に立ち向かって、まささんのニーズに応えてあげて下さい(^^;
To: きむち さん
> VBSにてプリンターの切り替えは可能でしょうか?
> A、Bというプリンターがあるとして
> AからBに変更するというものです。
切り替えといってもいろいろ意味がありますので、もう少し説明をいただけないでしょうか。
ネットワークプリンタを切り替えるのか、ローカルプリンタを切り替えるのか、
「通常使うプリンタ」を切り替えるのか、何らかのアプリから印刷するときに使う
プリンタを切り替えるのか。
はたまたパラレル切り替え機を操作するという意味か。(それはないか)