2016-05-04 11 views
9

छोड़ने के बिना वर्कशीट को CSV फ़ाइल के रूप में निर्यात करने के लिए मैक्रो एक वर्कशीट को CSV फ़ाइल के रूप में सहेजने के लिए मैक्रो बनाने के लिए यहां बहुत सारे प्रश्न हैं। सभी उत्तर SaveUs का उपयोग करते हैं, जैसे SuperUser से this one। वे मूल रूप से इस तरह की एक VBA समारोह बनाने के लिए कहते हैं:एक्सेल: मेरी वर्तमान एक्सेल शीट

Sub SaveAsCSV() 
    ActiveWorkbook.SaveAs FileFormat:=clCSV, CreateBackup:=False 
End Sub 

यह एक बढ़िया जवाब है, लेकिन मैं इस रूप में सहेजें के बजाय एक निर्यात करना चाहते हैं। जब SaveAs निष्पादित होता है तो यह मुझे दो परेशानियों का कारण बनता है:

  • मेरी वर्तमान कार्य फ़ाइल एक CSV फ़ाइल बन जाती है। मैं अपनी मूल .xlsm फ़ाइल में काम करना जारी रखना चाहता हूं, लेकिन मौजूदा वर्कशीट की सामग्री को उसी नाम से एक CSV फ़ाइल में निर्यात करना चाहता हूं।
  • एक संवाद प्रकट होता है जो मुझे पुष्टि करता है कि मैं CSV फ़ाइल को फिर से लिखना चाहता हूं।

क्या वर्तमान वर्कशीट को फ़ाइल के रूप में निर्यात करना संभव है, लेकिन मेरी मूल फ़ाइल में काम करना जारी रखना संभव है?

+2

मुझे लगता है कि आप एक कार्यपुस्तिका बनाने के लिए पर अपने पत्रक प्रतिलिपि csv के रूप में बचाने के लिए और बंद कार्यपुस्तिका की आवश्यकता होगी। – gtwebb

+0

@gtwebb: क्या आप मेरी मदद कर सकते हैं? मेरा वीबीए ज्ञान वास्तव में प्राथमिक है। – neves

+0

इस प्रश्न में "सेनसी" द्वारा दूसरे उत्तर का उपयोग करें: http://stackoverflow.com/questions/26178913/saving-excel-worksheet-to-csv-with-file-name-from-a-cell-using-a -macro? rq = 1 –

उत्तर

6

लगभग जो मैं चाहता था @ राल्फ। आपके कोड में कुछ समस्याएं हैं:

  1. यह "शीट 1" नामक हार्डकोडेड शीट निर्यात करता है;
  2. यह हमेशा उसी अस्थायी फ़ाइल में निर्यात करता है, इसे ओवरराइट करता है;
  3. यह लोकेल अलगाव चार को अनदेखा करता है।

इन समस्याओं को हल करने और मेरी सभी आवश्यकताओं को पूरा करने के लिए, मैंने code from here को अनुकूलित किया है। मैंने इसे और अधिक पठनीय बनाने के लिए इसे थोड़ा साफ कर दिया है।

Option Explicit 
Sub ExportAsCSV() 

    Dim MyFileName As String 
    Dim CurrentWB As Workbook, TempWB As Workbook 

    Set CurrentWB = ActiveWorkbook 
    ActiveWorkbook.ActiveSheet.UsedRange.Copy 

    Set TempWB = Application.Workbooks.Add(1) 
    With TempWB.Sheets(1).Range("A1") 
     .PasteSpecial xlPasteValues 
     .PasteSpecial xlPasteFormats 
    End With   

    Dim Change below to "- 4" to become compatible with .xls files 
    MyFileName = CurrentWB.Path & "\" & Left(CurrentWB.Name, Len(CurrentWB.Name) - 5) & ".csv" 

    Application.DisplayAlerts = False 
    TempWB.SaveAs Filename:=MyFileName, FileFormat:=xlCSV, CreateBackup:=False, Local:=True 
    TempWB.Close SaveChanges:=False 
    Application.DisplayAlerts = True 
End Sub 

अभी भी दिखाई पड़ेगा कि उपरोक्त कोड के साथ कुछ छोटी बात कर रहे हैं:

  1. .Close और DisplayAlerts=True एक अंत में खंड में होना चाहिए, लेकिन मैं कैसे VBA में यह करने के लिए पता नहीं है
  2. यह ठीक काम करता है अगर वर्तमान फ़ाइल नाम में 4 अक्षर हैं, जैसे .xlsm। .xls एक्सेल फ़ाइलों में काम नहीं करेगा। 3 वर्णों के फ़ाइल एक्सटेंशन के लिए, आपको MyFileName सेट करते समय - 5- 4 में बदलना होगा।
  3. एक संपार्श्विक प्रभाव के रूप में, आपके क्लिपबोर्ड को वर्तमान शीट सामग्री के साथ प्रतिस्थापित किया जाएगा।

संपादित करें: मेरे लोकेल सीएसवी डिलीमीटर के साथ सहेजने के लिए Local:=True डालें।

+1

1. 'TempWB.Close False' होना चाहिए 'TempWB। SaveChanges बंद करें: = गलत', [दस्तावेज़] (https://msdn.microsoft.com/en-us/library/office/ff838613.aspx) 3। '5' 'बाएं (CurrentWB.Name, लेन (CurrentWB.Name) में बदलें - 5)' इसे .xls [docs] के साथ काम करेगा (https://msdn.microsoft.com/en-us/library/ y050k1wb (v = vs.90) .aspx) हो सकता है कि हम फ़ाइल एक्सटेंशन को निकालने के लिए रेगेक्स का उपयोग करें लेकिन फेंकने वाली स्क्रिप्ट – KuN

+0

@KuN के लिए बहुत अधिक काम लगता है: TempWB.close में क्या परिवर्तन करता है? – neves

+0

मुझे लगता है कि यह एक "खोया गया अनुवाद" मुद्दा है, यदि आप प्रदान किए गए दस्तावेज़ लिंक या @ रैप्ल के उत्तर में देखते हैं, तो आप देखेंगे कि 'वर्कबुक' कॉल करने का सही तरीका है। बंद करें – KuN

12

@NathanClement थोड़ा तेज़ था। फिर भी, यहां पूरा कोड है (थोड़ा अधिक विस्तृत):

Option Explicit 

Public Sub ExportWorksheetAndSaveAsCSV() 

Dim wbkExport As Workbook 
Dim shtToExport As Worksheet 

Set shtToExport = ThisWorkbook.Worksheets("Sheet1")  'Sheet to export as CSV 
Set wbkExport = Application.Workbooks.Add 
shtToExport.Copy Before:=wbkExport.Worksheets(wbkExport.Worksheets.Count) 
Application.DisplayAlerts = False      'Possibly overwrite without asking 
wbkExport.SaveAs Filename:="C:\tmp\test.csv", FileFormat:=xlCSV 
Application.DisplayAlerts = True 
wbkExport.Close SaveChanges:=False 

End Sub 
-1

जैसा कि मैंने टिप्पणी की, इस साइट पर कुछ जगहें हैं जो एक वर्कशीट की सामग्री को CSV में लिखती हैं। This one और this one केवल दो को इंगित करने के लिए।

नीचे मेरी संस्करण

  • है यह स्पष्ट रूप से के लिए बाहर लग रहा है "," एक सेल के अंदर
  • यह भी UsedRange उपयोग करता है - क्योंकि आप कार्यपत्रक में सारी सामग्री को प्राप्त करना चाहते हैं
  • एक का उपयोग करता है इस रूप में पाशन के लिए सरणी कार्यपत्रक कोशिकाओं के माध्यम से पाशन
  • मैं एफएसओ दिनचर्या का उपयोग नहीं किया की तुलना में तेजी है, लेकिन इस एक विकल्प
है

कोड ...

Sub makeCSV(theSheet As Worksheet) 
Dim iFile As Long, myPath As String 
Dim myArr() As Variant, outStr As String 
Dim iLoop As Long, jLoop As Long 

myPath = Application.ActiveWorkbook.Path 
iFile = FreeFile 
Open myPath & "\myCSV.csv" For Output Lock Write As #iFile 

myArr = theSheet.UsedRange 
For iLoop = LBound(myArr, 1) To UBound(myArr, 1) 
    outStr = "" 
    For jLoop = LBound(myArr, 2) To UBound(myArr, 2) - 1 
     If InStr(1, myArr(iLoop, jLoop), ",") Then 
      outStr = outStr & """" & myArr(iLoop, jLoop) & """" & "," 
     Else 
      outStr = outStr & myArr(iLoop, jLoop) & "," 
     End If 
    Next jLoop 
    If InStr(1, myArr(iLoop, jLoop), ",") Then 
     outStr = outStr & """" & myArr(iLoop, UBound(myArr, 2)) & """" 
    Else 
     outStr = outStr & myArr(iLoop, UBound(myArr, 2)) 
    End If 
    Print #iFile, outStr 
Next iLoop 

Close iFile 
Erase myArr 

End Sub 
0

@neves पर मेरी टिप्पणी के अनुसार पोस्ट, मैं थोड़ा इस के साथ ही भाग को महत्व देता है तो दिनांक दिनांक के रूप में भर में जाना xlPasteFormats जोड़कर में सुधार - मैं ज्यादातर बैंक के लिए सीएसवी के रूप में बचाने के लिए बयान, इतनी जरूरी तिथियां।

`उप ExportAsCSV()

Dim MyFileName As String 
Dim CurrentWB As Workbook, TempWB As Workbook 

Set CurrentWB = ActiveWorkbook 
ActiveWorkbook.ActiveSheet.UsedRange.Copy 

Set TempWB = Application.Workbooks.Add(1) 
With TempWB.Sheets(1).Range("A1") 
    .PasteSpecial xlPasteValues 
    .PasteSpecial xlPasteFormats 
End With 

'Dim Change below to "- 4" to become compatible with .xls files 
MyFileName = CurrentWB.Path & "\" & Left(CurrentWB.Name, Len(CurrentWB.Name) - 5) & ".csv" 

Application.DisplayAlerts = False 
TempWB.SaveAs Filename:=MyFileName, FileFormat:=xlCSV, CreateBackup:=False, Local:=True 
TempWB.Close SaveChanges:=False 
Application.DisplayAlerts = True 

समाप्ति Sub`

+0

में जोड़ा गया है इसे एड-इन के रूप में पसंद करेंगे, किसी को भी ऐसा करने का समय मिल गया है? –