ส่งออกแต่ละชีตเป็นไฟล์ CSV แยกกัน

ฉันจำเป็นต้องเขียนโปรแกรมผ่านสคริปต์ VBA/VBS เพื่อส่งออกแผ่นงานทั้งหมด (รวม 4 รายการและฉันรู้ชื่อ) ไปยังแผ่นงานชื่อไฟล์ csv ในโฟลเดอร์เดียวกัน โดยไม่ต้องโหลด Excel และเรียกใช้แมโครด้วยตนเอง

ตามหลักการแล้ว สคริปต์จะใช้ไฟล์พาธต้นทาง/filename.xls และพาธไฟล์ส่งออกเป็นอาร์กิวเมนต์บรรทัดคำสั่ง

ฉันได้อ่านสคริปต์ Excel VBA จำนวนมากสำหรับการทำเช่นนั้นภายใน Excel และฉันได้เห็นบางส่วนในการโหลดสมุดงาน Excel เพื่อส่งออกแผ่นงานแรก อย่างไรก็ตาม เมื่อฉันพยายามผสมผสานทั้งสองอย่าง ฉันได้รับข้อผิดพลาดนี้:

(1,12) คาดว่าจะสิ้นสุดแถลงการณ์

Dim source As Workbook
Set source = Application.Workbooks.Open(WScript.Arguments.Item(0), ReadOnly:=True)
For Each sheet In source.Sheets
.SaveAs Filename:= WScript.Arguments.Item(1) & Source.Sheets.Name, FileFormat:=xlCSV
Next sheet
wb.Close

person Adam Mills    schedule 08.12.2011    source แหล่งที่มา
comment
ยินดีต้อนรับสู่ StackOverflow! โปรดโพสต์รหัสของคุณเพื่อให้ผู้อื่นสามารถช่วยแก้ไขข้อบกพร่องได้ การแสดงความพยายามเป็นสิ่งที่น่าชื่นชมเสมอ (และคาดหวัง)   -  person Excellll    schedule 08.12.2011
comment
ขออภัย ฉันรู้สึกว่าโค้ดที่ฉันพยายามดำเนินการไม่ถูกต้อง ดังนั้นจึงไม่ต้องการส่ง อย่างที่ฉันบอกว่าฉันมี vba ที่ทำงานคล้ายกันซึ่งได้รับชีตแรก โค้ดนี้เป็นการผสมผสานอย่างง่าย ๆ กับสคริปต์เวิร์กบุ๊กอื่น ๆ   -  person Adam Mills    schedule 13.12.2011


คำตอบ (2)


vbs เพื่อเรียกใช้โค้ดนี้จะมีลักษณะดังนี้ .

  1. ไฟล์ vbs สามารถดำเนินการได้จาก commandline
  2. ชื่อโฟลเดอร์ซ้ำซ้อนราวกับว่ามีไฟล์อยู่ (ออบเจ็กต์ FSO ทดสอบสิ่งนี้) ดังนั้นโฟลเดอร์ที่อยู่ภายในนั้นจะต้องมีอยู่ด้วย
  3. รหัสจะทำให้ Excel แยกแผ่นงานโดยอัตโนมัติ

ประเด็นสำคัญสองประการที่ควรทราบเมื่อเปรียบเทียบกับ VBA ของคุณด้านบน

  • คุณไม่สามารถหรี่วัตถุ vbs เป็นสตริง สมุดงาน ฯลฯ ได้ (ดังนั้นข้อผิดพลาดเริ่มต้นของคุณ) คุณสามารถหรี่แสงได้เท่านั้น
  • คุณไม่สามารถใช้ค่าคงที่ที่มีชื่อเช่น xlCSV ใน vbscript ได้ ดังนั้นการใช้ 6 ด้านล่างเป็นรูปแบบ CSV

    Dim strFilename  
    Dim objFSO  
    Set objFSO = CreateObject("scripting.filesystemobject")  
    strFilename = "C:\temp\test.xlsx"  
    If objFSO.fileexists(strFilename) Then  
      Call Writefile(strFilename)  
    Else  
      wscript.echo "no such file!"  
    End If  
    Set objFSO = Nothing  
    
    Sub Writefile(ByVal strFilename)  
    Dim objExcel  
    Dim objWB  
    Dim objws  
    
    Set objExcel = CreateObject("Excel.Application")  
    Set objWB = objExcel.Workbooks.Open(strFilename)  
    
    For Each objws In objWB.Sheets  
      objws.Copy  
      objExcel.ActiveWorkbook.SaveAs objWB.Path & "\" & objws.Name & ".csv", 6  
      objExcel.ActiveWorkbook.Close False  
    Next 
    
    objWB.Close False  
    objExcel.Quit  
    Set objExcel = Nothing  
    End Sub  
    
person brettdj    schedule 25.12.2011
comment
นั่นคือสิ่งที่ฉันต้องการ ขอบคุณมาก เป็นคำอธิบายที่ดีมาก และขอบคุณที่แจ้งให้เราทราบว่าฉันผิดพลาดตรงไหน ฉันได้เรียนรู้บางอย่างที่นี่ - person Adam Mills; 12.01.2012
comment
ขอขอบคุณหากสามารถเปลี่ยนแปลงเพื่ออ่านชื่อไฟล์ใดๆ แทนที่จะฮาร์ดโค้ดชื่อไฟล์ได้ - person RAP; 12.05.2021

เพื่อช่วยคุณเริ่มต้น:

รับสมุดงาน Excel ที่มีแผ่นงานสาธิตเช่น

-------------------------------
SELECT * FROM Demo
-------------------------------
|F1|F2 |F3        |F4        |
| 1|1.1|12/10/2011|text elm 1|
| 2|2.2|12/11/2011|text elm 2|
| 3|4.4|12/12/2011|text elm 3|
-------------------------------

และ ADODB.Connection ด้วย ConnectionString เช่น:

Provider=MSDASQL.1;Extended Properties="DBQ=<FullPathToYourXls>;Driver={Microsoft
 Excel Driver (*.xls)};

สิ่งที่คุณต้องมี .Execute คือคำสั่ง SELECT INTO เช่น

SELECT * INTO [Demo.csv] IN '<PathToYourCsvFolder>' 'Text;' FROM Demo

ที่จะได้รับ:

type ..\data\ExcelCsv2\Demo.csv
"F1";"F2";"F3";"F4"
1;1,10;10.12.2011 00:00:00;"text elm 1"
2;2,20;11.12.2011 00:00:00;"text elm 2"
3;4,40;12.12.2011 00:00:00;"text elm 3"

(ภาษาเยอรมัน)

คำสั่ง SELECT INTO จะสร้างส่วนที่เหมาะสม

[Demo.csv]
ColNameHeader=True
CharacterSet=1252
Format=Delimited(;)
Col1=F1 Integer
Col2=F2 Float
Col3=F3 Date
Col4=F4 Char Width 50

ในไฟล์ schema.ini โดยอัตโนมัติ

person Ekkehard.Horner    schedule 10.12.2011
comment
ขอบคุณมาก Ekkehard แต่ฉันไม่ได้ใช้ภาษาธรรมดาที่สุดที่ฉันสามารถทำได้จากสภาพแวดล้อมของฉันคือการเรียกสคริปต์ vbs ในขณะที่ส่งพารามิเตอร์ที่จำเป็น อย่างไรก็ตาม หากสามารถเรียกใช้สตริงการเชื่อมต่อใน VBA ฉันอาจจะสามารถสลับไฟล์ xls ซึ่งฉันสามารถรักษาการเชื่อมต่อได้ - person Adam Mills; 13.12.2011
comment
นอกจากนี้ ฉันไม่เห็นว่าตัวอย่างของคุณทำงานอย่างไรกับหลายแผ่นงานในสมุดงาน ฉันขาดอะไรไปหรือเปล่า - person Adam Mills; 13.12.2011