2010-06-10 15 views
13

वीबीए में, मैं एक विशिष्ट निर्देशिका में एक विशिष्ट एक्सटेंशन के साथ सभी फ़ाइलों की एक सूची कैसे प्राप्त करूं?निर्देशिका में ESY एक्सटेंशन के साथ सभी फ़ाइलों की सूची कैसे प्राप्त करें?

मैं, Application.FileSearch ऐसा करने में असमर्थ हूँ क्योंकि मैं Excel 2007

उत्तर

12

आपकी टिप्पणी के जवाब में "तो मुझे इसे चलाने के लिए कितनी बार पता है?", यह उदाहरण तब तक चलता है जब तक यह उन सभी फ़ाइलों को सूचीबद्ध नहीं करता है जिनके नाम strPattern से मेल खाते हैं। strFolder निरंतर बदलें।

Public Sub ListESY() 
Const strFolder As String = "C:\SomeFolder\" 
Const strPattern As String = "*.ESY" 
Dim strFile As String 
strFile = Dir(strFolder & strPattern, vbNormal) 
Do While Len(strFile) > 0 
    Debug.Print strFile '<- view this in Immediate window; Ctrl+g will take you there 
    strFile = Dir 
Loop 
End Sub 
+0

उन उत्सुक लोगों के लिए जो 'डीबग.प्रिंट' करता है, इसे देखें: http://stackoverflow.com/questions/2916287/where-does-vba-debug-print-log-to – ecoe

3

डिर उपयोग कर रहा हूँ ("C:। \ YourPath \ * ESY", vbNormal) ESY विस्तार के साथ पहली फ़ाइल देता है। प्रत्येक बाद की कॉल Dir() को अगली बार लौटाती है।

+0

महान है, तो कितनी बार मुझे पता करना इसे चलाने के लिए? –

+1

WHILE या DO लूप में परिणाम की लंबाई का परीक्षण करें। जब लंबाई 0 है तो आप कर चुके हैं। – mohnston

2

वैकल्पिक विकल्प: वस्तुओं की FileSystemObject परिवार के लिए "माइक्रोसॉफ्ट स्क्रिप्टिंग रनटाइम" पुस्तकालय (उपकरण में यह जाँच ... संदर्भ) का उपयोग करें। कुछ निम्न की तरह, शायद:

Public Function ESYFileCount(dir_path as String) as Long 

Dim fil As File 

    With New FileSystemObject 
     With .GetFolder(dir_path) 
      For Each fil In .Files 
       If LCase(Right(fil.Name, 4)) = ".esy" Then 
        ESYFileCount = ESYFileCount + 1 
       End If 
      Next 
     End With   
    End With 

End Function 
+1

यह कोड बेहतर होगा (और कमाएं मेरे द्वारा +1) अगर यह एफएसओ के संदर्भ की आवश्यकता के बजाय देर से बाध्यकारी उपयोग किया जाता है। –

+0

@ डेविड-डब्ल्यू-फेंटन - मुझे समझ में नहीं आता कि क्यों देर से बाध्यकारी बेहतर होगा, स्पष्ट करने की देखभाल करें? –

+2

देर बाध्यकारी इस तथ्य के कारण बेहतर है कि एफएसओ के स्वचालन को डोमेन नीतियों द्वारा अवरुद्ध किया जा सकता है। लेट बाध्यकारी हमेशा किसी भी घटक के लिए बेहतर * है जो संदर्भों के डिफ़ॉल्ट एक्सेस सेट (बहुत कम अपवादों के साथ) का हिस्सा नहीं है। प्रदर्शन हिट को इसके संदर्भ में कैशिंग करके आसानी से बचाया जाता है, और इसका उपयोग करते समय इसे हर बार फिर से शुरू करने के बजाय इसका उपयोग किया जाता है। –

1

निम्न कोड FileSystemObject का उपयोग करने से लगभग 19 गुना तेज चलता है। मेरी मशीन पर, तीन अलग-अलग डैक्टरीज़ में 4000 फाइलों को ढूंढने से फाइलसिस्टम ऑब्जेक्ट का उपयोग करके 1.57 सेकेंड लगे, लेकिन इस कोड का उपयोग करके केवल 0.08 सेकेंड।

Public Function CountFilesWithGivenExtension(_ 
      i_strFolderWithTerminalBackslant As String, _ 
      i_strExtensionIncludingPeriod As String _ 
     ) As Long 

     If Len(Dir$(i_strFolderWithTerminalBackslant & "*" _ 
      & i_strExtensionIncludingPeriod)) > 0 Then 

      CountFilesWithGivenExtension = 1 

      While Len(Dir$) > 0 

      CountFilesWithGivenExtension = _ 
        CountFilesWithGivenExtension + 1 

      DoEvents 

      Wend 
     Else 
      CountFilesWithGivenExtension = 0 
     End If 

    End Function 

नमूना उपयोग:

Debug.Print CountFilesWithGivenExtension("C:\", ".ex*") 

("DoEvents" आवश्यक नहीं है, लेकिन आप रोकें उपयोग करने के लिए/तोड़ अगर जरूरत अनुमति देता है।)

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^