• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Excelで検索、その後)

Excelで外部ファイルを検索するダイアログの呼び出し方法と検索結果表示の可能性

ARCの回答

  • ベストアンサー
  • ARC
  • ベストアンサー率46% (643/1383)
回答No.1

ファイル検索画面の使い方は知りませんが、とりあえずはファイルの検索機能があれば良いんですよね? 以下、フォルダの再帰検索を行うコードの例です。 参考にするなり、改造して使うなりしてください。 適当に作ったものなので、バグが残ってるかもしれません。 '使い方 Public Sub SrchSYSFile()   Dim Found() As String   Dim i As Long   ReDim Found(0)   Call QueryFile("C:\Windows\", "*.SYS", Found())   For i = 1 To UBound(Found())     Debug.Print Found(i)   Next i End Sub 'コード例 Public Function QueryFile(StartPath As String, SearchFileName As String, ByRef Found() As String) 'フォルダの再帰検索を行い、Foundに格納する 'Found(0)は空文字列になるが、これは仕様   Dim FldName As String   Dim Files As Collection   Dim FileName As String   Dim FoundCt As Long   Dim i As Long   Dim Folders() As String   Dim FolderCt As Long      On Error Resume Next    '現在のフォルダに対象ファイルが含まれているかを調べ、あれば、一覧に追加   FileName = ""   FileName = Dir(StartPath & SearchFileName, vbNormal + vbHidden + vbSystem)   FoundCt = UBound(Found)   Do Until FileName = ""     FoundCt = FoundCt + 1     ReDim Preserve Found(FoundCt)     Found(FoundCt) = StartPath & FileName     FileName = ""     FileName = Dir()   Loop    '現在のフォルダに含まれるフォルダの一覧を取得   FolderCt = -1   ReDim Folders(0)   FldName = ""   FldName = Dir(StartPath & "*.*", vbDirectory)   Do Until FldName = ""     If FldName <> "." And FldName <> ".." Then       If (GetAttr(StartPath & FldName) And vbDirectory) = vbDirectory Then         FolderCt = FolderCt + 1         ReDim Preserve Folders(FolderCt)         Folders(FolderCt) = StartPath & FldName & "\"       End If     End If     FldName = ""     FldName = Dir()   Loop    '取得したフォルダに対して、再帰検索を行う   For i = 0 To FolderCt     Call QueryFile(Folders(i), SearchFileName, Found())   Next i End Function

webdiver
質問者

お礼

 ありがとうございまいた。お礼が遅れてごめんなさい。 「再帰」はちょっとだけかじった事があるのですが、その辺の記憶を呼び起こしつつ、頂いたソースを解釈してゆきたいと思います。

関連するQ&A

  • アクセスでテキストを開く

    アクセスでパスを指定して、特定のテキストファイルを開く方法を教えていただけますか? いかのモジュールを見つけたのですが、どこに、動かないか… フルパスを入れればよいか分かりません。 どうぞ宜しくお願いします。 *********************************************************************************************** Private Declare Function ShellExecute Lib "SHELL32.DLL" Alias "ShellExecuteA" (ByVal hwnd As Long, _ ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, _ ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long Private Sub コマンド0_Click() Dim strFilePath As String Dim lngRet As Long Const SW_SHOWNORMAL = 1 strFilePath = Me.txt_Path 'WinAPIを使って関連付けられたアプリケーションを起動 lngRet = ShellExecute(Application.hWndAccessApp, "OPEN", _ strFilePath, vbNullString, CurDir(), SW_SHOWNORMAL) If lngRet <= 32 Then '返り値が 32 以下の場合はエラー MsgBox "ファイルを開けません!", vbOKOnly + vbExclamation End If End Sub ***********************************************************************************************

  • メール

    VBから変数Aを本文に自動的に貼り付ける方法を教えてください。 なお下は以前開発したものです。応用して使えるでしょうか? Public Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _ (ByVal hwnd As Long, ByVal ipopperation As String, ByVal lpfile As String, _ ByVal lpparameters As String, ByVal lpdirectory As String, ByVal nshowcmd As Long) As Long --------- Private Sub ??_Click() Dim LngReturn As Long Dim StrCommand As String StrCommand = Trim$(Text_mail_pc) If LCase(Left(StrCommand, 7)) <> "mailto:" Then StrCommand = "mailto:" & StrCommand End If LngReturn = ShellExecute(Me.hwnd, "open", StrCommand, vbNullChar, vbNullChar, Sw_Shownormal) End Sub ---------- ※↓のVBの質問とは全く関係ありません。

  • ExcelでDeviceCapabilitie

    ExcelでAPIを使用して、用紙番号を取得したいと考えています。 Excel2007(OS Win7)上では取得できるのですがExcel2000(OS WinXP)上ではエラー。 GetPrinterNameAndPortで、『 on 』と『 の 』がバージョンによって変えてもダメでした。アドバイスよろしくお願い致します。 Private Declare Function DeviceCapabilities Lib "winspool.drv" Alias "DeviceCapabilitiesA" (ByVal pDevice As String, ByVal pPort As String, ByVal fwCapability As Long, pOutput As Any, pDevMode As Any) As Long Private Declare Sub MoveMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long) Private Const DC_PAPERNAMES = 16 Private Const DC_PAPERS = 2 Private Const DC_BINNAMES = 12 Private Const DC_BINS = 6 Private Const DEFAULT_VALUES = 0 Sub Numbertest() Dim strDeviceName As String Dim strDevicePort As String Dim lngPaperCount As Long Dim bytPaper() As Byte Dim strPaperName As String * 64 Dim lngCounter As Long Dim aintNubytPaper() As Integer Dim lngRet As Long GetPrinterNameAndPort strDeviceName, strDevicePort lngPaperCount = DeviceCapabilities(strDeviceName, strDevicePort, DC_PAPERNAMES, ByVal vbNullString, ByVal vbNullString) ReDim bytPaper(64 - 1, lngPaperCount - 1) ReDim aintNubytPaper(1 To lngPaperCount) DeviceCapabilities strDeviceName, strDevicePort, DC_PAPERNAMES, bytPaper(0, 0), ByVal vbNullString lngRet = DeviceCapabilities(strDeviceName, strDevicePort, DC_PAPERS, aintNubytPaper(1), ByVal vbNullString) For lngCounter = 0 To lngPaperCount - 1 MoveMemory ByVal strPaperName, bytPaper(0, lngCounter), 64 MsgBox aintNubytPaper(lngCounter + 1) & " & " & Left(strPaperName, InStr(strPaperName, vbNullChar) - 1) Next lngCounter End Sub Private Sub GetPrinterNameAndPort(printerName As String, printerPort As String) Dim sString As String Const searchText As String = " on " ←使い分け ' Const searchText As String = " の " sString = ActivePrinter printerName = Left(sString, InStr(1, sString, searchText) - 1) printerPort = Right(sString, Len(sString) - Len(printerName) - Len(searchText)) End Sub

  • VBからExcelのテキストを指定して開きたい

     VBのアプリケーションから文書名を指定してエクセルを起動したいのですが 出来なくて困っています。ちなみにコードは下記のとおりです。どこに問題があ るのか教えていただけないでしょうか。 Private Sub Command1_Click() Dim lngReturnCode As Long Dim strFileName As String strFileName = "AllTitles.csv"   lngReturnCode = ShellExecute(Me.hwnd, _ "open c:\***\***.xls", _ strFileName, _ vbNullString, _ App.Path, _ SW_SHOWNORMAL) End Sub

  • VBでShell○なのにShellExecute×

    http://support.microsoft.com/kb/170918/ja 等を参考に、コンソールアプリからHTMLファイルを呼び出すだけのEXEをVB(Visual Basic 2008 Express Edition)で作ったところ、 Shell関数ではHTMLがIEで起動されるのに対し、ShellExecute関数ではダメでした。 HTMLへのファイルパスが正しいことはMsgBoxで確認しました。 また、ほぼ同じソースをbasにしてExcelから起動すると、ShellExecuteでも起動しました。 以下がソース(抜粋)になりますが、原因が分かる方がおられましたら、ヒントだけでも、ご教示いただけると幸いです。 よろしくお願いいたします。 - - - - - - - - - - - - - - - - - - - - - - Option Explicit On Module Module1 Private Declare Function ShellExecute Lib "shell32.dll" Alias _ "ShellExecuteA" (ByVal hwnd As Long, ByVal lpszOp As _ String, ByVal lpszFile As String, ByVal lpszParams As String, _ ByVal lpszDir As String, ByVal FsShowCmd As Long) As Long Private Declare Function GetDesktopWindow Lib "user32" () As Long 'エラーコード宣言略 Function StartDoc(ByVal DocName As String) As Long Dim Scr_hDC As Long Scr_hDC = GetDesktopWindow() 'こちらだと成功 StartDoc = Shell("explorer.exe" & " " & DocName, vbNormalFocus) StartDoc = ShellExecute(Scr_hDC, "Open", DocName, _ "", "C:\", SW_SHOWNORMAL) End Function Sub Main() Dim r As Long, msg As String r = StartDoc(CurDir() & "\target.html") 'エラーハンドリング省略 End Sub End Module

  • AccessVBA ShellExecuteAについて質問です。

    AccessVBA ShellExecuteAについて質問です。 下記コードでボタンをクリックすると、画像を入れ替える処理を与えています。 Private Sub View1_Click() With Me Dim ePASS As String sPASS = 画像のフルパス lRet = ShellExecute(0, "open", sPASS, vbNull, vbNull, SW_NORMAL) End With End Sub 'APIの定義 Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" ( _ ByVal hwnd As Long, _ ByVal lpOperation As String, _ ByVal lpFile As String, _ ByVal lpParameters As String, _ ByVal lpDirectory As String, _ ByVal nShowCmd As Long) As Long 上記コードが自分のマシンでは起動するのですが、他のマシンでは起動しません。 Accessは両マシン共に、2000です。 ビューワはWindowsPicture and Fax ビューワです。 原因究明のアドバイスよろしくお願いします。 出来ればソースもあるとありがたいです。

  • VBAでURLをブラウザで起動させたい

    現在、エクセルのVBAのフォーム上のコマンドボタンから、URLをブラウザで起動させたいと思っているのですが、うまくいきません。 インターネット上で以下のプログラムが紹介されていたので試したのですが hwnd の所でエラーとなってしまいます。 Option Explicit Private Declare Function ShellExecute Lib _ "shell32.dll" Alias "ShellExecuteA" _ (ByVal hwnd As Long, _ ByVal lpOperation As String, _ ByVal lpFile As String, _ ByVal lpParameters As String, _ ByVal lpDirectory As String, _ ByVal nShowCmd As Long) As Long Private Sub cmdGO_Click() ShellExecute Me.hwnd, "Open", "http://www.goo.ne.jp/", _ vbNullString, App.Path, 1 End Sub また、エクセルのハイパーリンクを使って、あるセル上に事前に設定しておき、コマンドボタンをクリックした時にそのセルのハイパーリンクを起動させることにしました。しかしブラウザは起動するのですが、ブラウザを閉じるとエクセルの画面が最小化されています。(最大化しようとして右クリックしてもなにも出てきません)同じエクセルファイルをダブルクリックするとやっとエクセルが画面表示されます。 ブラウザを閉じた時に画面上にエクセル画面を表示させたいのですがどのようにすれば良いのでしょう。分かる方が見えましたら宜しくお願いします。 このプログラムは以下のように作成しました Private Sub CommandButton3_Click()   Worksheets("データ").Select Range("J18").Select Selection.Hyperlinks(1).Follow NewWindow:=False, AddHistory:=True Application.WindowState = xlNormal End Sub ソフトは EXCEL2000です

  • windows7のエクスプローラをVBAで操作-1

    アドバイスをお願いします。 Excel-VBAで起動しているエクスプローラに対してハンドルを取得してクリックしたり、テキストボックスに文字をセットするプログラムを作って動かしています。 WindowsXPのときはできていたのですが、Windows7になったら正しく動作しなくなりました。 下のコードはエクスプローラの現在のフォルダパスが表示されるところに(添付ファイル参照)文字を入れるものです。 最後のSendMessageAnyで1が返ってしまいます。何が考えられますでしょうか。どう対策したらいいでしょうか。 なおハンドルの値はSDKのInspect Objectsで確認していますので、正しく取得できていると思っています。 よろしくお願いします。 Declare Function FindWindow Lib "user32" Alias "FindWindowA" _ (ByVal lpClassName As Any, ByVal lpWindowName As Any) As Long Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" ( _ ByVal hwndParent As Long, _ ByVal hwndChildAfter As Long, _ ByVal lpClassName As String, _ ByVal lpWindowName As String) As Long Declare Function SendMessageAny Lib "user32.dll" _ Alias "SendMessageA" _ (ByVal hwnd As Long, _ ByVal MSG As Long, _ ByVal wParam As Long, _ ByVal lParam As Any) As Long Const WM_SETTEXT = &HC Private hwnd As Long Private FOLDER As String Sub Put_folder_name1() hwnd = FindWindow("CabinetWClass", vbNullString) hwnd = FindWindowEx(hwnd, 0, "WorkerW", vbNullString) hwnd = FindWindowEx(hwnd, 0, "ReBarWindow32", vbNullString) hwnd = FindWindowEx(hwnd, 0, "Address Band Root", vbNullString) hwnd = FindWindowEx(hwnd, 0, "msctls_progress32", vbNullString) hwnd = FindWindowEx(hwnd, 0, "ComboBoxEx32", vbNullString) hwnd = FindWindowEx(hwnd, 0, "ComboBox", vbNullString) hwnd = FindWindowEx(hwnd, 0, "Edit", vbNullString) FOLDER = "\\xx.xx.xx.xx\test" RC = SendMessageAny(hwnd, WM_SETTEXT, 0, ByVal FOLDER) end sub

  • APIを使う時は参照設定は不要?

    例えば Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _ (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Sub test() Dim Handle As Long Handle = FindWindow("IEFrame", vbNullString) Debug.Print Handle End Sub と言うコードでウィンドウハンドルを取得する場合、 参照設定のどこにもチェックを入れませんが、なぜ参照設定しなくても使えるのでしょうか? Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _ (ByVal lpClassName As String, ByVal lpWindowName As String) As Long が参照設定の代わりになるのですか?

  • EXCELVBA フォルダ検索API

    エクセルからVBAでフォルダを選択させるコマンドを、APIを使ってフォルダ検索ダイアログボックスを出すまでは見よう見真似でできるのですが、このとき「あたらしいフォルダ」のボタンは必要ないので出したくないのですが、どこかに定数を指定すればよろしいかご存知でしたら教えてください。 (使用OS: Windows2000,Excel:2003) ちなみにコピペした宣言部分は以下のものです。 *************** Declare Function SHGetPathFromIDList Lib "shell32.dll" Alias "SHGetPathFromIDListA" _ (ByVal pidl As Long, ByVal pszPath As String) As Long Declare Function SHBrowseForFolder Lib "shell32.dll" Alias "SHBrowseForFolderA" _ (lpBrowseInfo As BROWSEINFO) As Long Declare Sub CoTaskMemFree Lib "ole32.dll" (ByVal pv As Long) Declare Function SendMessage Lib "user32" Alias "SendMessageA" _ (ByVal hwnd As Long, ByVal wMsg As Long, _ ByVal wParam As Long, lParam As Any) As Long Public Const WM_USER = &H400 Public Const BFFM_SETSELECTIONA = (WM_USER + 102) Public Const BFFM_INITIALIZED = 1 ********************