Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


1535 / 13644 ツリー ←次へ | 前へ→

【73771】リストボックスにファイル名が重複して表示 akichn 13/2/13(水) 8:58 質問[未読]
【73772】Re:リストボックスにファイル名が重複して... UO3 13/2/13(水) 9:23 発言[未読]
【73773】Re:リストボックスにファイル名が重複して... akichn 13/2/13(水) 9:37 発言[未読]
【73774】Re:リストボックスにファイル名が重複して... akichn 13/2/13(水) 10:48 発言[未読]
【73775】Re:リストボックスにファイル名が重複して... UO3 13/2/13(水) 11:54 発言[未読]
【73777】Re:リストボックスにファイル名が重複して... akichn 13/2/13(水) 12:39 お礼[未読]
【73776】Re:リストボックスにファイル名が重複して... UO3 13/2/13(水) 11:58 発言[未読]
【73778】Re:リストボックスにファイル名が重複して... akichn 13/2/13(水) 13:00 お礼[未読]
【73779】Re:リストボックスにファイル名が重複して... UO3 13/2/13(水) 17:36 発言[未読]

【73771】リストボックスにファイル名が重複して表...
質問  akichn  - 13/2/13(水) 8:58 -

引用なし
パスワード
   UserFormのテキストボックスにフォルダー名を入力すると、リストボックスに指定した形式のファイルが表示されるマクロですが、時々ファイルが重複して表示されます。これを回避する方法はないでしょうか?
******************************************
Private Sub TextBox1_Change()
  Dim i As Long, n As Long

  ListBox1.Clear
With Application.FileSearch
   .NewSearch
   .LookIn = TextBox1.Text
   .Filename = "*.jpg;*.bmp;*.tif;*.gif"
   n = .Execute()
   For i = 1 To .FoundFiles.Count
     ListBox1.AddItem Dir(.FoundFiles(i))
   Next
If ListBox1.ListCount = 0 Then
Else
  ListBox1.ListIndex = 0
End If
End With
End Sub
*******************************************
何方か教えてもらえないでしょうか

【73772】Re:リストボックスにファイル名が重複し...
発言  UO3  - 13/2/13(水) 9:23 -

引用なし
パスワード
   ▼akichn さん:

おはようございます

FileSearchオブジェクトについては詳しくありませんし、
2003までで、打ち切られ、2007以降では動きませんので
ごく普通に Dir関数を使われてはいかがでしょう。

それより、TextBox1_Change を使われているのが気になります。
これは【1文字】入力するたびに発生します。

c:\Test といれるとすると

c で発生、c: で発生 c:\ で発生 c:\T で発生、・・・・・

TextBox1_Change ではなく、別途、コマンドボタンを用意して、そのクリックイベントで
処理されるべきでは?

>

【73773】Re:リストボックスにファイル名が重複し...
発言  akichn  - 13/2/13(水) 9:37 -

引用なし
パスワード
   ▼UO3 さん:
>▼akichn さん:
>
>おはようございます
>
>FileSearchオブジェクトについては詳しくありませんし、
>2003までで、打ち切られ、2007以降では動きませんので
>ごく普通に Dir関数を使われてはいかがでしょう。
>
>それより、TextBox1_Change を使われているのが気になります。
>これは【1文字】入力するたびに発生します。
>
>c:\Test といれるとすると
>
>c で発生、c: で発生 c:\ で発生 c:\T で発生、・・・・・
>
>TextBox1_Change ではなく、別途、コマンドボタンを用意して、そのクリックイベントで
>処理されるべきでは?
>
>>
UO3 さん
早速のご回答ありがとうございます。
TextBox1_Changeのイベントは、井上治さんのフォルダー参照のAPIを利用させて頂いております。なのでイベントの発生は多発することは無いようなっております。
*********************************************
Private Sub CommandButton1_Click()  
  Dim strPATHNAME As String
  ' 「フォルダの参照」ダイアログよりフォルダ名の取得(Shell)
  strPATHNAME = modSHBrowseForFolder.fncBrowseForFolder("フォルダを指定して下さい", True, _
    Me.Caption)
  If strPATHNAME <> "" Then TextBox1.Text = strPATHNAME
End Sub
***************************************************************

【73774】Re:リストボックスにファイル名が重複し...
発言  akichn  - 13/2/13(水) 10:48 -

引用なし
パスワード
   ▼UO3 さん:
UO3の過去の回答を参考に記述してみようと思いましたが、Dir関数を使用した場合のListBox1.AddItemを何処に記述したらいいのかわかりません。
できれば、サンプルマクロを教えていただけませんでしょうか?

【73775】Re:リストボックスにファイル名が重複し...
発言  UO3  - 13/2/13(水) 11:54 -

引用なし
パスワード
   ▼akichn さん:

とりあえず TestBox1 に c:\Test といったフォルダフルパス文字列をいれ、
CommandButton1 で処理するコード案です。
もし、別途、Changeイベント連鎖を回避する手立てをしておられるなら、
TextBox1_Change のままでもよろしいかと思いますが、これについては
具体的に、どのように回避しておられるのか見えないのでコメントできません。

Private Sub CommandButton1_Click()
  Dim myPath As String
  Dim ok As Boolean
  Dim fname As String
  Dim w As Variant
  
  ListBox1.Clear
  myPath = TextBox1.Value
  
  If Len(Dir(myPath, vbDirectory)) > 0 Then
    If (GetAttr(myPath) And vbDirectory) = vbDirectory Then ok = True
  End If
  
  If Not ok Then
    MsgBox "指定フォルダは存在しません"
    Exit Sub
  End If
  
  fname = Dir(myPath & "\*.*")
  
  Do While Len(fname) > 0
    w = Split(fname, ".")
    Select Case LCase(w(UBound(w)))
      Case "jpg", "bmp", "tif", "gif"
      ListBox1.AddItem fname
    End Select
    fname = Dir()
  Loop
  
End Sub

【73776】Re:リストボックスにファイル名が重複し...
発言  UO3  - 13/2/13(水) 11:58 -

引用なし
パスワード
   ▼akichn さん:

あぁ、別途、TextBox1にCommandButton1 でパスをセットしておられたんですね。

であれば、私が提示したCommandButton1 のコードの最初に、フルパスをmyPathに取得するコードを追加し
そのまま、TextBox1に転記せず、処理されてもよろしいのでは?
つまり、TextBox1_Changeイベントルーティンは不要だと思いますが?

【73777】Re:リストボックスにファイル名が重複し...
お礼  akichn  - 13/2/13(水) 12:39 -

引用なし
パスワード
   ▼UO3 さん:
教えていただきましたDir関数マクロに書き替えてみました。
マクロが正常に起動し重複表示がなくなりました。
お忙しいところ丁寧に教えて頂き、本当に有難うございました。

【73778】Re:リストボックスにファイル名が重複し...
お礼  akichn  - 13/2/13(水) 13:00 -

引用なし
パスワード
   ▼UO3 さん:
>▼akichn さん:
>
>あぁ、別途、TextBox1にCommandButton1 でパスをセットしておられたんですね。
>
>であれば、私が提示したCommandButton1 のコードの最初に、フルパスをmyPathに取得するコードを追加し
>そのまま、TextBox1に転記せず、処理されてもよろしいのでは?
>つまり、TextBox1_Changeイベントルーティンは不要だと思いますが?

TextBox1のパスは、後にファイルのフルパスの取得に使用するために必要なものなのです。
追伸 別件なのですが、このユーザーフォームのマクロでImageコントロール6つに写真を表示して、そのなかから選択するんですが、写真の容量が大きい場合に表示時間に2秒程のタイムロスが生じます。この問題の解決方法は何かないでしょうか?
もし、良い案がありましたら教えていただけませんでしょうか。

【73779】Re:リストボックスにファイル名が重複し...
発言  UO3  - 13/2/13(水) 17:36 -

引用なし
パスワード
   ▼akichn さん:

こんばんは
とりあえず重複が無くなったようでなによりです。

フォルダフルパスが後の処理で必要ということはわかりました。
ただ、「TextBox」というものは、操作者が入力しようとすればできるコントロールですね。
今回のテーマでは、操作者による書き換えは許さないんだと思います。
であれば、 TextBox ではなく Label を用意して、その Caption として
表示しておけば、後々の参照もできますので、よろしいかと思うのですが。

さて、Imegeコントロールへの描画時間の問題ですが、私のほうでは、そのように
大きな画像をユーザーフォームで扱うことがないので、お役に立てそうにありません。

もし、今、どうしてもやるひつようがあるなら おそらく ペアになる縮小画像を用意しておいて
ユーザーフォームには、そちらを持ってくると言った逃げをうつと思います。

いずれにしても、エキスパートさんなら、もっといい回答があると思います。
ただ、このトピは、別のテーマとして表題ができあがっていますので、
別のトピ名で新規にアップされた方がよろしいと思いますね。

1535 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free