I have a workbook that has about 30 sheets. Each sheet has it's own macro. Then, a sheet called "Main Page has macros. One of them Merges all sheets, creating a new sheet combined. I need another macro that when clicked, opens a NEW workbook, copies data from Sheet "Combined" and saves it as it's own Workbook, and also, name it "Tracking Import File (todays date) .CSV" (delimited) I can get it to do all of that except the Format of the CSV file is not the same as when I manually do it. Currently i have this macro doing this for another sheet as well, but that sheet gets saved as a normal workbook extension, which is working just fine. This is the code I have right now:
Set wb = Workbooks.Add
ThisWorkbook.Sheets("Back Order Follow up Report").Copy Before:=wb.Sheets(1)
wb.SAVEAS "S:\Production Department\Backorder Follow up reports\Back Order Follow up Report." & Format(Date, "MM.DD.YY") & ".xlsx"
*Set wb = Workbooks.Add
ThisWorkbook.Sheets("Combined").Copy Before:=wb.Sheets(1)
wb.SAVEAS "S:\Production Department\Tracking import\Tracking Import FileTEST." & Format(Date, "MM.DD.YY") & ".csv"*
End Sub
There is a second, optional parameter on the wb.SaveAs method that tells Excel what format to save the file in. Merely putting ".csv" at the end of a file doesn't make it a CSV, that's only a name. To save as a CSV use:
wb.SAVEAS "S:\Production Department\Tracking import\Tracking Import FileTEST." & Format(Date, "MM.DD.YY") & ".csv", xlCSV
Related
I appreciate there are lots of entries like save individual excel sheets as csv
and Export each sheet to a separate csv file - But I want to save a single worksheet in a workbook.
My code in my xlsm file has a params and data sheet. I create a worksheet copy of the data with pasted values and then want to save it as csv. Currently my whole workbook changes name and becomes a csv.
How do I "save as csv" a single sheet in an Excel workbook?
Is there a Worksheet.SaveAs or do I have to move my data sheet to another workbook and save it that way?
CODE SAMPLE
' [Sample so some DIMs and parameters passed in left out]
Dim s1 as Worksheet
Dim s2 as Worksheet
Set s1 = ThisWorkbook.Sheets(strSourceSheet)
' copy across
s1.Range(s1.Cells(1, 1), s1.Cells(lastrow, lastcol)).Copy
' Create new empty worksheet for holding values
Set s2 = Worksheets.Add
s2.Range("A1").PasteSpecial Paste:=xlPasteValuesAndNumberFormats
' save sheet
s2.Activate
strFullname = strPath & strFilename
' >>> BIT THAT NEEDS FIXIN'
s2.SaveAs Filename:=strFullname, _
FileFormat:=xlCSV, CreateBackup:=True
' Can I do Worksheets.SaveAs?
Using Windows 10 and Office 365
This code works fine for me.
Sub test()
Application.DisplayAlerts = False
ThisWorkbook.Sheets(strSourceSheet).Copy
ActiveWorkbook.SaveAs Filename:=strFullname, FileFormat:=xlCSV, CreateBackup:=True
ActiveWorkbook.Close
Application.DisplayAlerts = True
End Sub
It's making a copy of the entire strSourceSheet sheet, which opens a new workbook, which we can then save as a .csv file, then it closes the newly saved .csv file, not messing up file name on your original file.
This is fairly generic
Sub WriteCSVs()
Dim mySheet As Worksheet
Dim myPath As String
'Application.DisplayAlerts = False
For Each mySheet In ActiveWorkbook.Worksheets
myPath = "\\myserver\myfolder\"
ActiveWorkbook.Sheets(mySheet.Index).Copy
ActiveWorkbook.SaveAs Filename:=myPath & mySheet.Name, FileFormat:=xlCSV, CreateBackup:=True
ActiveWorkbook.Close
Next mySheet
'Application.DisplayAlerts = True
End Sub
You just need to save the workbook as a CSV file.
Excel will pop up a dialog warning that you are saving to a single sheet, but you can suppress the warning with Application.DisplayAlerts = False.
Don't forget to put it back to true though.
Coming to this question several years later, I have found a method that works much better for myself. This is because the worksheet(s) I'm trying to save are large and full of calculations, and they take an inconvenient amount of time to copy to a new sheet.
In order to speed up the process, it saves the current worksheet and then simply reopens it, closing the unwanted .csv window:
Sub SaveThisSheetInParticular()
Dim path As String
path = ThisWorkbook.FullName
Application.DisplayAlerts = False
Worksheets("<Sheet Name>").SaveAs Filename:=ThisWorkbook.path & "\<File Name>", FileFormat:=xlCSV
Application.Workbooks.Open (path)
Application.DisplayAlerts = True
Workbooks("<File Name>.csv").Close
End Sub
Here the Sheet and csv filename are hardcoded, since nobody but the macro creator (me) should be messing with them. However, it could just as easily be changed to store and use the Active Sheet name in order to export the current sheet whenever the macro is called.
Note that you can do this with multiple sheets, you simply have to use the last filename in the close statement:
Worksheets("<Sheet 1>").SaveAs Filename:=ThisWorkbook.path & "\<File 1>", FileFormat:=xlCSV
Worksheets("<Sheet 2>").SaveAs Filename:=ThisWorkbook.path & "\<File 2>", FileFormat:=xlCSV
[...]
Workbooks("<File 2>.csv").Close
I have some code that will copy a sheet and then create a new workbook and then paste it and adjust the sheet name and workbook name before saving it to the Desktop.
All the called subs do is transpose ranges of data from the entry sheet to the export sheet which is the one that is copied (named "Rows") to be pasted into the new workbook.
Code is used as a button and so far no declaration has been required.
Sub UploadSheet()
Call TransposeHS
Call TransposeOrigin
Call TransposeValues
Application.ScreenUpdating = False
Path = CreateObject("WScript.Shell").specialfolders("Desktop")
Worksheets("Rows").Cells.Copy
Workbooks.Add (xlWBATWorksheet)
ActiveWorkbook.ActiveSheet.Paste
ActiveWorkbook.ActiveSheet.Name = "Rows"
ActiveWorkbook.SaveAs Filename:=Path & "\" & "Upload" & ".xlsx"
ActiveWorkbook.Close SaveChanges:=True
Application.ScreenUpdating = True
MsgBox "Exported to Desktop"
End Sub
How do I adjust the code to copy over 2 sheets instead of just the one into a new workbook?
Creating a new workbook with Workbooks.Add and then pasting is overcomplicated.
Call Copy on the worksheet(s) without specifying any parameters; a new workbook is created with the copied sheet(s), and is the ActiveWorkbook.
Worksheets(Array("Rows", "SecondSheet")).Copy
ActiveWorkbook.SaveAs Filename:=Path & "\" & "Upload" & ".xlsx"
I'm trying to export two sheet in two different csv file using the code presented below:
import_bt.SaveAs Filename:="D:\Temp\import_bt.csv", FileFormat:=xlCSV, CreateBackup:=False, Local:=False
import_brd.SaveAs Filename:="D:\Temp\import_brd.csv", FileFormat:=xlCSV, CreateBackup:=False, Local:=True
The code works fine but I've an issue, it saves also my entire file as the last .csv file named import_brd.
In order to be able to copy sheets, without changing the active document name, you cannot proceed as you tried. It will always save the sheet, but the workbook will be Saved As your last allocated (csv) name.
Try this code, please:
Sub testSaveSheetAsCSV()
Dim import_bt As Worksheet, import_brd As Worksheet, wb As Workbook
'I used dummy sheets name only for testing reason. Please, use your real ones:
Set import_bt = Sheets("Test") 'use here your necessary sheet
Set import_brd = Sheets("Teste") 'use here your necessary sheet
Set wb = Workbooks.aDD
import_bt.Copy Before:=wb.Worksheets(1)
wb.SaveAs fileName:=ThisWorkbook.path & "\import_bt.csv", FileFormat:=xlCSV, CreateBackup:=False, Local:=False
import_brd.Copy Before:=wb.Worksheets(1) 'it will save its first sheet
wb.SaveAs fileName:=ThisWorkbook.path & "\import_brd.csv", FileFormat:=xlCSV, CreateBackup:=False, Local:=True
wb.Close False
End Sub
It adds a new workbook, copy the sheet necessary to be transformed in CSV, before the existing first one of the newly created workbook and save it (AS CSV) after that. It repeats the steps for the second sheet and closes the temporary workbook.
If you need to avoid the warning regarding overwriting of the existing file(s) (if the case), the code can be adapted to avoid it. Only in case you want playing with the code, or updating the existing csv files with the last necessary ones.
I have a macro enabled workbook in my local folder. This workbook consists of 7 worksheet in total. Last sheet named as "AnsSheet".
I want to save the last sheet (AnsSheet only) in the same folder location with modified name.
Here is the code I am using which is not giving desired result.
Could you please guide?
Sheets("AnsSheet").Select
Set wb = Workbooks.Add
ThisWorkbook.Sheets("AnsSheet").Copy Before:=wb.Sheets(1)
ActiveSheet.SaveAs Filename:=ActiveWorkbook.Path & "\WF_Macro_" & Format(Date, "DD-MMM-YYYY") & ".xls"
Your Filename will be incomplete as ActiveWorkbook.Path will be blank. The ActiveWorkbook will be your newly created Workbook, and as you haven't saved it yet the Path will be empty. Use ThisWorkbook instead to get the path of the current Workbook.
I'm not sure if the ActiveSheet.SaveAs method will work but I haven't looked into it. Personally I would use the Workbook.SaveAs method to save the new Workbook. Also, instead of adding ".xls" to the end of the filename, you should specify the filetype using the FileFormat parameter MSDN FileFormat Enum
I've updated your code below with comments to help see what is going on:
Dim wb As Excel.Workbook
'\\ Create a new Workbook with only one Worksheet
Set wb = Workbooks.Add(xlWBATWorksheet)
'\\ Copy Sheet to start of new Workbook
ThisWorkbook.Sheets("AnsSheet").Copy Before:=wb.Sheets(1)
'\\ Turn off alerts and delete the unused sheet, turn alerts back on
Application.DisplayAlerts = False
wb.Sheets(2).Delete
Application.DisplayAlerts = True
'\\ Save new Workbook as a standard Workbook
wb.SaveAs Filename:=ThisWorkbook.Path & "\WF_Macro_" & Format(Date, "DD-MMM-YYYY"), _
FileFormat:=xlWorkbookNormal
Edit: I updated my code based on the comments, but get the same symptoms.
Edit 2: I updated the code, again, and I know that it works on a directory of .xlsx files. If I convert all of the .xlsm files to .xlsx files to drop the macros/code, then the code works great. Likely this problem is too localized.
Earlier today I learned how to loop over a folder of .xlsx files and export every sheet to a tab-delimited .txt file. My bigger goal is to loop over a folder of .xlsm files (whose macros aren't all on my machine) and write the data worksheets to .txt files.
Here's the modified code.
Sub exportsSheetsToTextForAll()
Application.AutomationSecurity = msoAutomationSecurityForceDisable
excelFiles = Dir(ThisWorkbook.Path & "\" & "Payout data*.xlsm")
fromPath = ThisWorkbook.Path
Do While Len(excelFiles) > 0
Debug.Print Files
Set oWb = Workbooks.Open(Filename:=fromPath & "\" & excelFiles)
Application.Run "exportSheetsToText", oWb
oWb.Close SaveChanges:=False
excelFiles = Dir
Loop
End Sub
Sub exportSheetsToText(iWb As Workbook)
For Each ws In iWb.Worksheets
ws.Copy
Set wb = ActiveWorkbook
textFile = Left(iWb.FullName, InStr(iWb.FullName, ".") - 1) & "-" & ws.Name & ".txt"
wb.SaveAs Filename:=textFile, FileFormat:=xlText
wb.Close SaveChanges:=False
Next ws
End Sub
I modified the answer to my first question due to the structure of the .xlsm files. Each .xlsm file has a data query worksheet ("REQUEST_TABLE") with cells for query entries and buttons for macros. Running the query generates new sheets ("Sheet1", "Sheet2", etc) with the data I want to export.
When I run the exportAllSheetsToText() macro it opens the first worksheet, but it starts with the data query worksheet ("REQUEST_TABLE"), saves it to a tab-delimited text file, and stops rather than proceeding through all of the worksheets. I thought that the macro would carry on through all of the sheets as is does with my original macro for looping over all workbooks and worksheets in a directory.
What changes when I run my macro on an .xlsm file? Do I need to strip these worksheets to their own .xlsx files first? Thanks!