-
三流君の [コンビニ系HPへ] [VBA系HPへ] [ASP系HPへ] [愚痴系HPへ]

<VB5 Setup.exe を探し一覧表示する>

戻 る サンプル→0224.LZH 8KB をダウンロードして、見てください。
VB5 SearchSetup.exe が入っています


下記のような依頼メールを出向先の同僚からいただきました。
---------------
現在CD-ROMに焼いて各支店に配っているAccessで作ったシステムが
あるのですが、毎月セットアップをしなくてはならないため、CD-ROM
挿入後自動でセットアッププログラムを起動させたいのですが、

以下のようなディレクトリ構成でそれぞれにセットアッププログラム
があり、それらを選択するプログラムを必要です。

■Pattern A
 CD-ROM
  +SLS
    +事業部名
      +Tokyo
      +Osaka
      +Nagoya
        : 
■Pattern B
 CD-ROM
  +SLS24
    +事業部名
      +Tokyo
      +Osaka
      +Nagoya
        : 
 ※事業部名はそれぞれのCD-ROMによって異なる。

サブディレクトリを読み取って、ユーザーにセットアップを選択させる
プログラムの開発をお願いします。
本来であれば、私が作成すればいいのでしょうが、こちらにVBやVCと
いった環境がないものですから.....
---------------

各ディレクトリに入っている
Setup.exeの起動プログラムねぇ、、、
エクスプローラで起動する丁寧なマニュアルを配布先に渡したほうが
いいような気がするけど、、、(また、始まったよ、やりたくない病?)

起動ドライブのSetup.exeファイルを探す

起動する

エラーだけどSetup.exeが起動したのでほっとする


'-----
'VB5でフォームを1つ作りモジュール、、、に書いてみた、、
'リストボックスにSetup.exeの場所を表示して、
'選択後起動するサンプルです。
Private strDRV As String
Private strDirList(10000) As String
Private nDirCnt As Integer

Private Sub cmdEND_Click()
    Unload Me
    End
End Sub

Private Sub cmdRunSetup_Click()
    '念のため、実行確認
    If vbNo = MsgBox(Me.SetupList & "を実行します", vbYesNo) Then
        Exit Sub
    End If
    
    'Shell関数で起動
    Shell Me.SetupList, vbNormalFocus
    
    '自分自身を終了させる
    Unload Me
    End
    
End Sub

Private Sub Form_Activate()

    Dim n        As Integer
    Dim strFNAME As String

    If nDirCnt = 1 Then
        'ディレクトリの一覧を取得する(手抜き)
        Call searchDir(strDRV)
        'Setup.exe があるか、あらためて探す
        '(同時に探したほうが速いのにねぇ、、、)
        For n = 1 To nDirCnt
            strFNAME = strDirList(n) & "setup.exe"
            Me.Caption = strFNAME & "検索中"
            DoEvents
            If Dir(strFNAME) <> "" Then
                Me.SetupList.AddItem strFNAME
            End If
        Next n
        Me.Caption = "検索終了、、、"
    End If

End Sub

Private Sub Form_Load()
    
    '検索ドライブを自分のパスから判断
    strDRV = Left(App.Path, 1) & ":\"
    Me.labTitle.Caption = strDRV & "ドライブのSetup.exe 一覧"
    
    'カウンタの初期化
    nDirCnt = 1

End Sub

Private Sub searchDir(strSearchPath As String)

    Dim strWORK As String
    Dim strCHK  As String
    
    Dim nSTART  As Integer
    Dim nEND    As Integer
    
    Dim n       As Integer
    
    nSTART = nDirCnt   '格納開始位置を保存する
    
    'まず、受け取ったディレクトリから下のディレクトリを
    '変数に格納する
    
    If Right(strSearchPath, 1) <> "\" Then
        strSearchPath = strSearchPath & "\"
    End If
    
    strWORK = Dir(strSearchPath, vbDirectory)    ' 最初のフォルダ名を返します。
    Do While strWORK <> ""   ' ループを開始します。
        ' 現在のフォルダと親フォルダは無視します。
        If strWORK <> "." And strWORK <> ".." And strWORK <> "pagefile.sys" Then
            'チェックするファイル名を作成
            strCHK = strSearchPath & strWORK
            ' ビット単位の比較を行い、フォルダかどうかを調べます。
            If (GetAttr(strCHK) And vbDirectory) = vbDirectory Then
                ' フォルダであれば、それを変数にセットします。
                'ReDim strDirList(nDirCnt + 1) As String '配列の要素の数を増やします
                strDirList(nDirCnt) = strCHK
                Me.Caption = strCHK & "検索中"
                DoEvents
                nDirCnt = nDirCnt + 1
            End If
        End If
        strWORK = Dir                    ' 次のフォルダ名を返します。
        DoEvents
    Loop
    
    nEND = nDirCnt  '終了位置を保存する
    
    If nSTART = nEND Then  '1つも見つからなかった?
        '何もしない
    Else
        '今回新規にサーチしたディレクトリ数分その下を調べる
        For n = nSTART To nEND - 1
            Call searchDir(strDirList(n))
        Next n
    End If

End Sub
'-----
なってないなぁ、、、
芸術的な流れはこれだぞって指摘、待ってます。
ささいなことでも、気がついたことあったら送ってください。

/*
 * 4.またまた増える今後の課題?
*/
簡単な解説とダメ処理のまとめを書きます。

Form_Load()のイベントで、起動したドライブを取り出します。
'検索ドライブを自分のパスから判断
strDRV = Left(App.Path, 1) & ":\"
ポイントはApp.PathでVBで作成したExeの場所がわかると思う。
*自分へ文句  \\SRV1\CD\XXXX.EXE で、サーバーのCDから起動したら、
 どうなんだよ、、、

次に、Form_Activate()のイベントで、
ディレクトリをサーチし、Setup.exeを探し、
リストボックスへセットします。
Me.SetupList.AddItem strFNAME
..AddItemヘルプでみて下さい。

ディレクトリのサーチは、dir関数を使用し、
strWORK = Dir(strSearchPath, vbDirectory) 
で回しました。

あとは、目新しい処理しないで普通にやっていると思います。。

三流なんだねその1
 なんで固定の10000なの?
 Private strDirList(10000) As String
 一万件越えたらどうするつもりなんだよ、、メモリもムダにするし。
  'ReDim strDirList(nDirCnt + 1) As String '配列の要素の数を増やします
 はじめは、上記のように、
 ReDim を使用して、増やしながらやろうと書きましたが、
 再帰処理で再度関数を呼ぶとエラーになったので、
 手抜きでstrDirList(10000) As Stringにしました。
 (おいおい、頼むよ、、しっかりしてよ、、、)

三流なんだねその2
一流読者さんへ素朴な質問、
"c:\pagefile.sys"を
If (GetAttr(strCHK) And vbDirectory) = vbDirectory Then
で比較した時、実行時エラーで落ちたのですが、
なぜでしょうか?

/*
 * 5.終わりの挨拶
*/

今回のグチりながらのボロボロなプログラム作成、、どうでしたか?
なめてないで、流れをはじめに考えてから作らないと、
こんな汚いプログラム(動けばいいや的処理)になってしまいます。

えっ、三流のKen3らしい、、、
なんて声聞こえたところで、今日も逃げるように。。。


質問や要望、クレームを送る(三流君に連絡する 連絡方法)

質問や要望など連絡方法でお互い確認が取りやすく、便利なのが掲示板なのですが、私の対応のまずさから不定期で荒れてしまい、掲示板は現在封鎖中です。(反省しなきゃ)
感想や質問・要望・苦情など 三流君へメッセージを送る。
時間的余裕のある要望・質問・苦情の場合は、下記のフォームからメッセージを送ることができます。
あなたのお名前(ニックネーム):さん
返信は?: 不用(HP更新を待つ) , E-mail→ アドレス:に返事をもらいたい

(感想や質問・要望・苦情はHPで記事に載せることがあります。)

急ぎで連絡がほしい、そんな時は:[三流君連絡先]に連絡してください。

番外編 愚痴系で書いてた今日の一品 (短いサブ関数など)

2000/05/13 SQL Count関数を使ってみる
2000/05/11 Access97 標準関数Midなどが使えない
2000/05/09 SendObjectのエンコード
2000/05/08 クエリーで〜以外とは
2000/04/27 Imagingコントロールを使ってみた
2000/04/25 Excel97 VBA イベントなど
2000/04/24 Access97で複数のプリンタを切替えて使用
2000/04/20 書式付きエクスポート DoCmd.OutputToで、できます
2000/04/19 Access97でExcel形式へExport時に書式設定を行いたい
2000/04/13 Access97でOutlook97/98とリンクする方法
2000/04/13 VBA Nameステートメント
2000/04/04 Accessでキー取得
2000/04/04 AccessでFile参照ダイアログ?
2000/04/03 縦書用数値変換改良
2000/04/01 Access Err テーブルを消したい
2000/03/31 縦書き数値、どうしてますか?
2000/03/29 VBA 手抜きで、処理後、explorerを開く
2000/03/28 Access --> Word へデータ
2000/03/24 名前一覧Excelの機能で、同じことできました
2000/03/23 Excel97 VBA セルに付けた名前一覧を作成する
2000/03/21 Excel セルに名前付け
2000/02/25 iniFileを読む GetPrivateProfileString
2000/02/15 Excel VBA Rangeオブジェクトとサンプル
2000/02/14 Access97 SizeMode/OLEサイズ で画像調整
2000/02/10 Access97 Pictureプロパティとサンプル
2000/02/09 Access97 集計クエリーで重複値をハジク
2000/02/07 Access97 サブフォームへ値をセット
2000/02/04 Access97 コントロールソース、チョットした使用法
2000/02/01 Access97 フォームフッター
2000/01/18 Access97 now()関数で有効期限処理、、、

←パソコンの技術系の書籍を探しているなら コンピュータ関連の出版社33社(アスキー、インプレス等)が共同運営するコンピュータの本・専門店 種類が豊富で探し易い※在庫ありが48時間以内発送


[三流君(TOP)]へ戻る。