2013-03-18 7 views
29

मेरे पास एक स्प्रेडशीट है कि एक बटन पर क्लिक करने से सबकुछ एक नई कार्यपुस्तिका में कॉपी/पेस्ट करके डुप्लिकेट हो जाएगा और फ़ाइल को ऐसे नाम से सहेज लें जो कुछ परिवर्तनीय मानों पर निर्भर है (कोशिकाओं से लिया गया है स्प्रेडशीट)। मेरा वर्तमान लक्ष्य क्लाइंट नाम (चर में सेल मूल्य) के नाम के आधार पर शीट को अलग-अलग फ़ोल्डरों में सहेजने के लिए प्राप्त करना है, जबकि यह पहले रन पर काम करता है, मुझे बाद में त्रुटि मिलती है।एक्सेल वीबीए जांचें कि निर्देशिका मौजूद है या नहीं

कोड जांचता है यदि निर्देशिका मौजूद है और नहीं तो इसे बनाता है। यह काम करता है, लेकिन उसके बाद यह बनाई गई है, यह एक दूसरी बार चल त्रुटि फेंकता है:

Runtime Error 75 - path/file access error.

मेरे कोड:

Sub Pastefile() 

Dim client As String 
Dim site As String 
Dim screeningdate As Date 
screeningdate = Range("b7").Value 
Dim screeningdate_text As String 
screeningdate_text = Format$(screeningdate, "yyyy\-mm\-dd") 
client = Range("B3").Value 
site = Range("B23").Value 


Dim SrceFile 
Dim DestFile 

If Dir("C:\2013 Recieved Schedules" & "\" & client) = Empty Then 
    MkDir "C:\2013 Recieved Schedules" & "\" & client 
End If 

SrceFile = "C:\2013 Recieved Schedules\schedule template.xlsx" 
DestFile = "C:\2013 Recieved Schedules\" & client & "\" & client & " " & site & " " & screeningdate_text & ".xlsx" 


FileCopy SrceFile, DestFile 

Range("A1:I37").Select 
Selection.Copy 
Workbooks.Open Filename:= _ 
    "C:\2013 Recieved Schedules\" & client & "\" & client & " " & site & " " & screeningdate_text & ".xlsx", UpdateLinks:= _ 
    0 
Range("A1:I37").PasteSpecial Paste:=xlPasteValues 
Range("C6").Select 
Application.CutCopyMode = False 
ActiveWorkbook.Save 
ActiveWindow.Close 

End Sub 

आप इस क्षेत्र में ज्ञान की मेरी कमी का बहाना करना होगा, मैं अभी भी सीख रहा हूँ। मुझे बहुत मजबूत लग रहा है कि इसमें निर्देशिका जांच तर्क के साथ कुछ करना है, जब त्रुटि MkDir पंक्ति को हाइलाइट किया गया है।

+0

रिक्त स्थान के बजाय शून्य-लंबाई स्ट्रिंग (यानी, "") की जांच करने का प्रयास करें, "अगली त्रुटि फिर से शुरू करें" पसंद नहीं है। – chuff

+0

यदि कोई भी नहीं मिला है तो Dir शून्य लंबाई स्ट्रिंग देता है। इसलिए रिक्त उपयोग का उपयोग न करें –

+1

हाय दोस्तों, सलाह के लिए धन्यवाद, मैंने इसे बदल दिया है, "मुझे कभी नहीं पता था कि यह शून्य लंबाई तारों के लिए चेक किया गया है। जबकि मैं इसे भविष्य के सर्वोत्तम अभ्यास के लिए उपयोग करूंगा, इसने इस मुद्दे को हल नहीं किया है। कोई और सुझाव? – user1571463

उत्तर

73

Dir का उपयोग कर एक निर्देशिका के होने की जाँच करने के लिए, आप की तरह कुछ के रूप में दूसरा तर्क के रूप में vbDirectory निर्दिष्ट करने के लिए, की जरूरत है:

If Dir("C:\2013 Recieved Schedules" & "\" & client, vbDirectory) = "" Then 

ध्यान दें कि, vbDirectory साथ, Dir एक गैर खाली वापस आ जाएगी स्ट्रिंग यदि निर्दिष्ट पथ निर्देशिका या फ़ाइल फ़ाइल के रूप में पहले से मौजूद है (बशर्ते फ़ाइल में केवल पढ़ने-योग्य, छिपी हुई या सिस्टम विशेषताओं में से कोई भी नहीं है)। आप यह सुनिश्चित करने के लिए GetAttr का उपयोग कर सकते हैं कि यह एक निर्देशिका है, न कि फ़ाइल।

Public Function FolderExists(strFolderPath As String) As Boolean 
    On Error Resume Next 
    FolderExists = ((GetAttr(strFolderPath) And vbDirectory) = vbDirectory) 
    On Error GoTo 0 
End Function 

यह अंत में और बिना दोनों काम करता है, \ साथ:

+1

हाय ब्रायन, धन्यवाद, आपकी सहायता के लिए एक टन है। मैंने सोचा कि यह गैर-मूल्य की तुलना करने के तर्क के साथ एक मुद्दा था। मैं इसकी सराहना करता हूं :) – user1571463

+1

+1 अच्छी तरह से कवर किया गया। – brettdj

+0

विफलता (= रिटर्न "") जब पथ (बस) नेटवर्क साझा होता है, उदा। "\\ MyServer \ myShare"। – Heinzi

5
If Len(Dir(ThisWorkbook.Path & "\YOUR_DIRECTORY", vbDirectory)) = 0 Then 
    MkDir ThisWorkbook.Path & "\YOUR_DIRECTORY" 
End If 
4

निश्चित है कि एक फ़ोल्डर मौजूद है (और नहीं एक फ़ाइल) मैं इस सुविधा का उपयोग होने के लिए।

+0

क्या आप अपने कोड की तीसरी पंक्ति समझा सकते हैं? इस समारोह का मूल्यांकन कैसे किया जाता है? –

+1

आसान समझने के लिए FolderExists = ((GetAttr (strFolderPath) और vbDirectory) = vbDirectory) के रूप में तीसरी पंक्ति को बेहतर ढंग से लिखें – Jinstrong

10

स्क्रिप्टिंग ऑब्जेक्ट की FolderExists विधि का उपयोग करें।

Public Function dirExists(s_directory As String) As Boolean 

Set OFSO = CreateObject("Scripting.FileSystemObject") 
dirExists = OFSO.FolderExists(s_directory) 

End Function 
+0

स्वच्छ, और सबसे कुशल विधि! इसके लिए कुडोस! –

0

आप "सी: \" जैसे कुछ के साथ WB_parentfolder को प्रतिस्थापित कर सकते हैं। मेरे लिए WB_parentfolder वर्तमान कार्यपुस्तिका के स्थान को पकड़ रहा है। file_des_folder नया फ़ोल्डर है जो मैं चाहता हूं। यह आपके द्वारा आवश्यकतानुसार कई फ़ोल्डरों के माध्यम से जाता है और बनाता है।

 folder1 = Left(file_des_folder, InStr(Len(WB_parentfolder) + 1, file_loc, "\")) 
     Do While folder1 <> file_des_folder 
      folder1 = Left(file_des_folder, InStr(Len(folder1) + 1, file_loc, "\")) 
      If Dir(file_des_folder, vbDirectory) = "" Then  'create folder if there is not one 
       MkDir folder1 
      End If 
     Loop 
0

मैं का उपयोग कर समाप्त हो गया:

Function DirectoryExists(Directory As String) As Boolean 
DirectoryExists = False 
If Not Dir(Directory, vbDirectory) = "" Then 
    If GetAttr(Directory) And vbDirectory = vbDirectory Then 
     DirectoryExists = True 
    End If 
End If 
End Function 

कौन सा @Brian का मिश्रण है और जवाब @ZygD। जहां मुझे लगता है कि @ ब्रायन का जवाब पर्याप्त नहीं है और @ZygD उत्तर

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