2011-10-14 15 views
8

के साथ मैदान Application.FileDialog (msoFileDialogSaveAs) का उपयोग करते समय मैं यह करने के लिए एक रास्ता के लिए सब कुछ खत्म हो खोज की।प्रीसेट "बचाने के रूप में प्रकार" MSAccess

मैं संवाद बॉक्स के रूप में एक को बचाने को खोलने के लिए तो उपयोगकर्ता एक फ़ाइल को बचाने के लिए स्थान का चयन कर सकते हैं। लेकिन, मैं "इस प्रकार सहेजें" क्षेत्र के साथ पूर्व निर्धारित करना चाहते हैं "अल्पविराम द्वारा अलग मूल्य फ़ाइल (* .csv)"

समस्या "फ़िल्टर" है methode "msoFileDialogSaveAs" के साथ काम करने के लिए प्रतीत नहीं होता। क्या "Application.FileDialog (msoFileDialogSaveAs)" का उपयोग कर फ़ाइल प्रकार को प्रीसेट करना संभव है?

फिलहाल, यदि मैं फ़ाइल को .csv एक्सटेंशन के साथ सहेजता हूं और फिर इसे एक्सेल में खोलता हूं, तो मुझे "फ़ाइल मिलती है जिसे आप xxx.csv खोलने की कोशिश कर रहे हैं फ़ाइल द्वारा निर्दिष्ट की तुलना में एक अलग प्रारूप में है विस्तार ... "संदेश। फ़ाइल हालांकि सही ढंग से काम करता है।

With Application.FileDialog(msoFileDialogSaveAs) 
     .Title = "xxx" 
     .AllowMultiSelect = False 
     .InitialFileName = "xxx.csv" 
     '.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*" 
     result = .Show 
     If (result <> 0) Then 
      ' create file 
      FileName = Trim(.SelectedItems.Item(1)) 
      fnum = FreeFile 
      Open FileName For Output As fnum 


      ' Write the csv data from form record set 
      For Each fld In rs.Fields 
       str = str & fld.Name & ", " 
      Next 

      ' Write header line 
      str = Left(str, Len(str) - 2) ' remove last semi colon and space 
      Print #fnum, str 
      str = "" 

      ' Write each row of data 
      rs.MoveFirst 
      Do While Not rs.EOF    
      For i = 0 To 40 
       str = str & rs(i) & ", " ' write each field seperated by a semi colon 
      Next i 
      str = Left(str, Len(str) - 2) ' remove last semi colon and space 
      Print #fnum, str 
      str = "" 
      rs.MoveNext 
      Loop 

     ' close file 
     Close #fnum 
     End If 
    End With 

आप से भी ज्यादा!

+0

जैसा कि आप कहते हैं कि 'msoFileDialogSaveAs' को एक्सेस में उचित रूप से समर्थित नहीं है। यदि आपकी कोई फ़ाइल सहेज रही है जिसमें एक .csv एक्सटेंशन और एक्सेल है, तो आपको वह चेतावनी दे रही है, यह उस फ़ाइल में है जो समस्या उत्पन्न कर रहा है, इसका नाम नहीं। –

+0

मैं यह सुनिश्चित करने के लिए अपनी फ़ाइल स्वरूपण को देखूंगा कि यह सीएसवी आवश्यकता का सम्मान करता है। उपयोगकर्ता को इस फ़ाइल को बिना विस्तार के सहेजने से रोकने के लिए अभी भी अच्छा लगेगा। – pec

+0

क्या आप फ़िल्टर विधि का उपयोग नहीं कर सकते? वास्तव में फ़ाइल को सहेजने वाला कोड क्या है? –

उत्तर

2

के रूप में वह FileDialog मदद राज्यों msoFileDialogSaveAs समर्थित नहीं है कहा गया है।

आप जब संवाद अनलोड FileName पर एक सीएसवी विस्तार के लिए मजबूर कर सकते हैं;

FileName = getCSVName(FileName) 
... 
Function getCSVName(fileName As String) As String 
    Dim pos As Long 
    pos = InStrRev(fileName, ".") 
    If (pos > 0) Then 
     fileName = Left$(fileName, pos - 1) 
    End If 
    getCSVName = fileName & ".CSV" 
End Function 

एक्सेल अपनी CSV पसंद नहीं है, तो अगर कोई मान आप नई-पंक्तियों/बचने के लिए बोली की जरूरत है की जाँच "(http://stackoverflow.com/questions/566052/can-you-encode- CR-वामो-इन-में-सीएसवी-फ़ाइलें)

और इस पैटर्न के बजाय,

For i = 0 To 40 
    str = str & rs(i) & ", " ' write each field seperated by a semi colon 
Next i 
str = Left(str, Len(str) - 2) ' remove last semi colon and space 

आप कर सकते हैं;

dim delimiter as string 
... 
For i = 0 To 40 
    str = str & delimiter & rs(i) ' write each field seperated by a semi colon 
    delimiter = "," 
Next 
+0

धन्यवाद, मैंने अभी इस समाधान के बारे में सोचा था और विस्तार को रेगेक्स के साथ बदलने का तरीका ढूंढ रहा था। तो यह बहुत उपयोगी है – pec

+0

एक्सेल के लिए मेरी सीएसवी पसंद नहीं है: समस्या यह थी कि आईडी चुड़ैल के साथ मेरी फाइल शुरू हुई थी, जाहिर है कि एक SYLF फ़ाइल इंगित करती है। – pec

0

http://msdn.microsoft.com/en-us/library/office/aa219834(v=office.11).aspx

डिफ़ॉल्ट सूची से वांछित एक्सटेंशन का चयन करने के लिए फ़िल्टरइंडेक्स का उपयोग करें (संवाद लॉन्च करें और अपनी एक्सटेंशन में सूची को गिनें), या msdn से जुड़े पृष्ठ में प्रलेखित सहेज फ़िल्टर संग्रह को संशोधित करें। फिल्टर, FileDialog उदाहरण के भीतर नहीं बदला जा सकता केवल पहले उस के लिए एक filedialogfilters साथ Application.FileDialog (msoFileDialogSaveAs) .Filters के माध्यम से आपत्ति है। फिर वे उदाहरण के भीतर उपलब्ध हैं।

+0

यह प्रतीत नहीं होता है, जैसा कि दस्तावेज़ में बताया गया है, फ़िल्टर प्रत्येक नए संवाद के लिए रीसेट कर दिए जाते हैं। कृपया विस्तार करें। – dashnick

4

माइक के रूप में लिखा था और लिंक से उन्होंने प्रस्ताव किया; फिल्टर आप डिफ़ॉल्ट रूप से चाहते हैं चुनने के लिए, आप:

Sub Main() 
    Debug.Print userFileSaveDialog("unicode", "*.txt") 
End Sub 

Function userFileSaveDialog(iFilter As String, iExtension As String) 

    With Application.FileDialog(msoFileDialogSaveAs) 
     Dim aFilterIndex As Long: aFilterIndex = 0& 

     For aFilterIndex = 1& To .Filters.Count 
      If (InStr(LCase(.Filters(aFilterIndex).Description), LCase(iFilter)) > 0) _ 
       And (LCase(.Filters(aFilterIndex).Extensions) = LCase(iExtension)) Then 

       .FilterIndex = aFilterIndex 
       Exit For 

      End If 
     Next aFilterIndex 

     If CBool(.Show) Then 
      userFileSaveDialog = .SelectedItems(.SelectedItems.Count) 
     Else 
      End 
     End If 
    End With 

End Function 
+0

इस इटरेशन का उपयोग करने वाला एकमात्र फ़िल्टर विस्तार मैं "*। *" है। इन परिभाषित कहां हैं? और फिर भी, यदि कोई गुम हो गया है, तो मैं कस्टम विस्तार जोड़ने के लिए इन्हें कहां अपडेट कर सकता हूं? क्या यह एक सिस्टम सेटिंग है? – Pete

+1

@Pete; जब आप एक्सेल के साथ 'सेव करें ...' करते हैं तो वे डिफ़ॉल्ट एक्सटेंशन परिभाषित होते हैं। एक्सेल 2010 में 27 अलग-अलग एक्सटेंशन हैं ("यूनिकोड", "* .txt")। यदि आप उपयोगकर्ता को कस्टम एक्सटेंशन का प्रस्ताव देना चाहते हैं तो आप ** [वह] (http://stackoverflow.com/questions/20272000/save-with-msofiledialogfilepicker) ** –

+1

यह बेहतर जवाब है, IMHO: I 2003 या 2016 में मैक्रो चलने के बावजूद यह सुनिश्चित करने के लिए डिफ़ॉल्ट फ़ाइल प्रकार एक्सेल 97-2003 (* .xls) है (हमारा कार्यालय _finally_ अपडेट कर रहा है लेकिन यह क्रमिक रूपांतरण है और कुछ अन्य आंतरिक उपकरण केवल .xls की अपेक्षा करते हैं।) – Tukaro

6

सामान्य लेकिन उम्मीद है कि एक बेहतर समाधान के रूप में देर ...

Public Function GetSaveFilename() As String 

    Dim Dialog As FileDialog: Set Dialog = Application.FileDialog(msoFileDialogSaveAs) 
    With Dialog 
     .InitialFileName = CurrentProject.Path & "\*.ext" 
     .FilterIndex = 2 
     .Title = "Save As" 
     If .Show <> 0 Then 
      GetSaveFilename = .SelectedItems(1) 
     End If 
    End With 
End Function 

यह कैसे काम करता?

जैसा कि यह अच्छी तरह से पता है कि आप सीधे msoFileDialogSaveAs पर फ़िल्टर सेट कर सकते हैं। हालांकि यदि आप InitialFileName को "* .ext" पर सेट करते हैं तो यह उस एक्सटेंशन को मजबूर करेगा। फ़िल्टर अभी भी "सभी फ़ाइलें" कहेंगे, हालांकि यह आपके द्वारा प्रदान किए गए एक्सटेंशन तक फाइलें नहीं दिखाएगा।

परिणाम

msoFileDialogSaveAs Result

यदि आप "* .ext" मिटा सकते हैं और बस, "परीक्षण" उदाहरण के लिए, जिसके परिणामस्वरूप फ़ाइल नाम होगा "test.ext" लिखने इसलिए यह वास्तव में उस एक्सटेंशन बलों ।

यह सही नहीं है लेकिन यह कोड बहुत कम अनुभवी लोगों के लिए एपीआई कॉल का उपयोग किए बिना वांछित परिणाम प्राप्त करता है और वांछित परिणाम प्राप्त करता है।

चेतावनियां

एक समय में एक ही जैसे विस्तार के लिए यह केवल काम करता है "* .csv"। यदि आपको एकाधिक एक्सटेंशन फ़िल्टर करना होगा उदा। छवियों के बाद आपको एपीआई कॉल का उपयोग करना होगा।

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