[三流君] −−>
[VBAで楽しく] −−>
[バックナンバー一覧]
−−> No.121 Excel UserForm リストボックスを使ってみた
Excel UserForm リストボックスを使ってみた
メルマガ発行内容
<Excel UserForm リストボックスを使ってみた>
どうも、三流プログラマーのKen3です。
今回は、
Excelのユーザーフォームで、リストボックスを使ってみます。
サンプルファイルは、
http://www.ken3.org/vba/lzh/vba121.lzh
にvba121.xlsが保存されています。
/*
* 1. 今回のキッカケ
*/
掲示板のやりとりから、
-----
>投稿時間:2003/08/03(Sun) 11:26
>タイトル:Re^4: VBAでの自動解凍
>
>現在のコード
>Option Explicit
>Private Declare Function Unlha Lib "UNLHA32.DLL" (ByVal Cal
>lhwnd As Long, ByVal LHACommand As String, ByVal RetBuff As Stri
>ng, ByVal RetBuffSize As Long) As Long
>Private Sub CommandButton1_Click()
>'********* UnLHA32.DLLを使ってLZHファイルを解凍する ***
>******
>Dim Ret As String * 255 'UnLHAからの結果を
>入れるバッファ(長さ255バイト)
>Dim SendStr As String 'コマンド゛文字列
>Dim sourceFile As String '解凍する圧縮ファイル
>Dim targetDir As String '解凍先ディレクトリ
>Dim Result As Long '戻り値
>
>targetDir = "C:\あ\い\"
>
>If targetDir = "" Then Exit Sub '解凍処理中止。
>ChDir "C:\LZHファイル"
>sourceFile = Application.GetOpenFilename("lzhファイル(*
>.lzh),*.lzh")
>
>SendStr = "e " & sourceFile & " " & targetD
>ir '(スペースで区切っていることに注意)
>Result = Unlha(0, SendStr, Ret, 255) 'UnLHA実行!
>If Result = 0 Then MsgBox (Ret) '解凍に
>成功したら、結果報告
>End Sub
>
>なんとか、ここまでたどり着きましたが「LZHファイル」フォルダ
>の中にあるlzhファイルの種類と数が多いので上の
>「Application.GetOpenFilename〜」では全てのlzhファイルがダイア
>ログボックスに表示してしまいます。
>そこで、ファイル名に含まれる文字である程度絞込み、その中からひ
>とつを選べるようにしたいのですが、どうすればいいでしょうか。
-----
*.lzhファイルが多いので、
ファイルに含まれる文字で絞り込みたいのかぁ。
/*
* 2.Application.GetOpenFilenameをテストしてみる。
*/
そんなの簡単、vb*.lzhとワイルドカード指定でしょ?
と安易に思い、下記のテストを行ってみる。
下記、vb*.lzh指定でダメだったサンプルです・・
なにかありそうだけど・・・
Sub aaa()
'ChDir "e:\work"
Dim strFPTN As String 'ファイルパターン?
strFPTN = "lzhファイル(vb*.lzh),vb*.lzh"
Dim strFN As String
strFN = Application.GetOpenFilename(strFPTN)
MsgBox strFN
End Sub |
あれ・・ダメなの?
でも、拡張子の指定は下記のようにするとOKなんだけど。
Sub bbb()
'ChDir "e:\work"
Dim strFPTN As String 'ファイルパターン?
strFPTN = "lzhファイル(*.lzh), *.lzh"
strFPTN = strFPTN & ",テキストファイル, *.txt;*.csv"
Dim strFN As String
strFN = Application.GetOpenFilename(strFPTN)
MsgBox strFN
End Sub |
上記指定で、
*.lzh
と
*.txt *.csv
のワイルドカードが指定可能。
↑ファイルの種類を指定してみた
頭のファイル名の部分は指定できないのかなぁ・・・なんか勘違いありそうだけど。
/*
* 3.Excel UserForm の ListBoxを使ってみた
*/
何で出来ないんだろう・・・う〜ん・・・
Application.GetOpenFilename
のヘルプを見るが、いい方法がない。
あまりやりたくないけど、自作のユーザーフォームを作ってみます。
一覧から選択するので(選択したいので)、
リストボックスを使用してみます。
まずは、白紙のユーザーフォームを追加します。
Alt+F11でVBEの編集画面に行き、
次に、メニューから
挿入 -- ユーザーフォームを選択します。
すると、白紙のフォームを作成することが出来ます。
ツールボックスから
リストボックスコントロールを選択してフォームに貼ります。
フォームの初期化時のイベントで、
カレントディレクトリのvb*.lzhをリストボックスに追加してみます。
Private Sub UserForm_Initialize()
'フォームの初期化イベントでリストボックスにデータをセットする
Dim strWORK As String
Me.ListBox1.Clear '.Clearで内容を全てクリア
strWORK = Dir("vb*.lzh") 'カレントのVB*.lzhを検索する
While strWORK <> ""
'取得したファイル名をリストに追加する、ITEMの追加
Me.ListBox1.AddItem (strWORK)
'次のファイル名を取得する
strWORK = Dir() '引数無しで呼ぶと次のファイル名がセットされる
Wend
End Sub |
ポイントは、
^^^^^^^^^^^^
ListBox1.Clearと.Clearでリスト内の項目をクリア後、
Dir関数を使用して、カレントディレクトリ内のvb*.lzhを取得します。
取得したファイル名を、
.AddItemメソッドを使用して、セットしただけです。
↑リストボックスへセットした結果
リストボックスの中身を用意できたら、
次は、選択されたデータを判断したいですよね。
ボタンが押されたら、選択されたファイル名を表示してみます。
1つボタンのコントロールを追加して、
そのボタンのクリックイベントに書いてみます。
Private Sub btn01_Click()
Dim strDATA As String
strDATA = Me.ListBox1.Text '.Textプロパティの値を代入
MsgBox "選択されたデータは、" & strDATA
End Sub |
まぁ、こんな感じで、選択されたデータを取り出せます。
.Textプロパティなんですね。
んっ、何も選択しないと、、まぁ=""で判断できるのかな。
Private Sub btn01_Click()
Dim strDATA As String
strDATA = Me.ListBox1.Text '.Textプロパティの値を代入
If strDATA = "" Then
MsgBox "データを選択してからボタンを押してね"
Else
MsgBox "選択されたデータは、" & strDATA
End If
End Sub |
/*
* 4.組み合わせて、LZHの解凍を呼ぶ
*/
さてと、組み合わせてみますか。
カレントディレクトリをセットして、
ユーザーフォームを呼ぶ、そんな関数を標準関数に作ります。
Sub ccc()
'ChDrive "E" 'ドライブの変更
'ChDir "e:\work" 'フォルダーの変更
UserForm1.Show 'ユーザーフォームを表示する
End Sub |
まぁ、こんな感じで、
ChDrive "E" 'ドライブの変更
ChDir "e:\work" 'フォルダーの変更
ドライブだったらこれでOKですね。
自分の環境に固定の場所を直してコメントを外してください。
※えっ、途中で変更したいって?まぁ、今回はカンベンしてよ・・・
ユーザーフォームで、ファイルを選択後、
LHAのファイルを解凍します。
userform1のモジュールです。
ボタンが押されたら、解凍するためにDLLを呼んでます。
Private Declare Function Unlha Lib "UNLHA32.DLL" (ByVal Callhwnd As Long, _
ByVal LHACommand As String, ByVal RetBuff As String, _
ByVal RetBuffSize As Long) As Long
Private Sub btn01_Click()
Dim strDATA As String
strDATA = Me.ListBox1.Text '.Textプロパティの値を代入
If strDATA = "" Then
MsgBox "データを選択してからボタンを押してね"
Exit Sub
End If
'********* UnLHA32.DLLを使ってLZHファイルを解凍する *********
Dim Ret As String * 255 'UnLHAからの結果を入れるバッファ(長さ255バイト)
Dim SendStr As String 'コマンド゛文字列
Dim sourceFile As String '解凍する圧縮ファイル
Dim targetDir As String '解凍先ディレクトリ
Dim Result As Long '戻り値
Dim Msg1 As String
'↓解凍先ディレクトリ
'targetDir = "e:\work\test\" '←固定値をセットしてもいいし
targetDir = CurDir() & "\" 'カレントディレクトリをセットする
'↓解凍したい.lzhファイル
sourceFile = CurDir() & "\" & strDATA
'↑選択されたファイル名を+して、フルパスを作成する
'C:\Documents and Settings\ken3\My Documents
'みたいに、スペース付のフォルダの予防で”chr(&h22)を付ける
sourceFile = Chr(&H22) & sourceFile & Chr(&H22)
targetDir = Chr(&H22) & targetDir & Chr(&H22)
'"C:\Documents and Settings\ken3\My Documents"とダブルコーテーション付にする
'ここで、コマンドを作っている
SendStr = "e " & sourceFile & " " & targetDir
'(スペースで区切っていることに注意)
Result = Unlha(0, SendStr, Ret, 255) 'UnLHA実行!
If Result = 0 Then MsgBox (Ret) '解凍に成功したら、結果報告
'作業が終了、フォームを閉じる
Unload Me
End Sub |
とくにポイントは無いんだけど、
ファイル名で(フォルダーで)
My Documents
みたいに、スペースが入っているフォルダーがあります。
これをそのままスペース区切りのコマンドに乗せると、
e C:My Documents\vb00aaa.lzh C:My Documents\
となり、正しく渡らないので、
""を付け(””で囲い)
e "C:My Documents\vb00aaa.lzh" "C:My Documents\"
がパラメータで渡るように細工してます。
あとは、うまくアレンジして、解凍処理を作れると思います。
フォームの初期化のタイミングで、ファイル名をセットする。
ホントは、ここで、フォルダーを変更したいが(変更機能がほしいが)
カレントディレクトリを対象としています。
Private Sub UserForm_Initialize()
'フォームの初期化イベントでリストボックスにデータをセットする
Dim strWORK As String
Me.ListBox1.Clear '.Clearで内容を全てクリア
strWORK = Dir("vb*.lzh") 'カレントのVB*.lzhを検索する
While strWORK <> ""
'取得したファイル名をリストに追加する、ITEMの追加
Me.ListBox1.AddItem (strWORK)
'次のファイル名を取得する
strWORK = Dir() '引数無しで呼ぶと次のファイル名がセットされる
Wend
End Sub |
/*
* 5.終わりの挨拶
*/
今回は、
Excelのユーザーフォームで、
リストボックスを使用してみました。
例題は、ファイル名をセットして、選択だったけど、
いろいろと使ってみてください。
今回のサンプルファイルは、
http://www.ken3.org/vba/lzh/vba121.lzh
にvba121.xlsが保存されています。
テストして、遊んでみてください。
何かの参考となれば幸いです。
Excel/Access大好き、三流プログラマーKen3でした。
フィードバック
VBA系の→[掲示板]←を覗く、質問を書き込む
評価・感想
ページフッター(リンクや広告など)
[三流君(TOP ken3.org へ戻る)]
-- [VBA系TOPへ]
---- [VBA系バックナンバー目次へ移動]
------ [VBAでIEを操作 CreateObject("InternetExplorer.application")]・・・実は当店一番人気、VBAでIEを操作するサンプルです
------ [VBAでOutlookの操作 CreateObject("Outlook.Application")]・・・Outlookを使い、メール関係の処理です
------ [Access から Excel 連携 CreateObject("Excel.Application")]・・・人気のAccessからExcelへデータ書き出しなどです
------ [AccessのUserForm/サブフォームを操作]・・・アクセスでフォームを使ったサンプルです
------ [Accessのレポートを操作]・・・レポートを操作してみました
------ [Access クエリー関係やその他関数]・・・あまりまとまってませんが、スポット的な単体関数の解説です
------ [Excel UserForm(ユーザーフォーム)を操作する]・・・エクセルでユーザーフォームを作成して入力などを行ってます
------ [ExcelからAccessを操作する]・・・ExcelからAccessのマクロを起動してみました、
------ [Excel関係 関数、その他]・・・その他Excel関係です
------ [VBAでテキストファイル(*.txt,*.html,*.csv)の操作]・・・テキストファイルを使ったサンプルです
------ [VBA 標準関数関係とその他解説]・・・その他、グダグタ解説してます
広告
-- [通販系の売れ筋広告へ] ←主に楽天やAmazonのランキングです
blog
-- [三流君の作業日記] ← 日々の作業を少々
-- [通販あしあと] ← 通販ページの足跡を一覧で羅列
情報を探す
情報を探すならGoogleかな?
↓Web全体、サポート情報(support.microsoft.com)や三流君VBA(ken3.org)から検索する
書籍の購入
Webだけじゃさすがに勉強しきれないので、プログラミング関係の書籍も読んでみては??
コンピュータ書籍の発送がハヤイ専門店
コンピュータの本・専門店
|
※種類が豊富で探し易いです。※在庫ありが48時間以内発送が急ぎで資料や書籍がほしい時、とても助かります。
お奨め本の目次を見るだけでも勉強になったり
|
amazon.co.jpでキーワード別チェック
下記、私が設定したキーワードですが、こんな感じで資料や書籍を探ってみては?
[VBA全体を把握する] -- やはり全体をさらっと見たいですよね。
[SQL関連でDB力UP] -- システムはデータベース設計が重要
[ADO接続を探る] -- VBAなのでADO接続を押さえておく
[Windows APIを探る] -- さらにAPIになて知ってれば強力だ!
[.NETを探る] -- と言っても時代は.NETに流れてるし
プログラミング以外でも知りたいことは多くって、
[人間関係] -- で、客先・上司、まわりに気を使い。
[プログラマーの自己啓発] -- プログラムだけじゃなくいろいろと向上したいよ
[コーチング・育成] -- 先輩になったら後輩(部下)の面倒をみてね。
そんなこんなでプログラマーっていろいろと大変なんだってば・・・