การเขียน Excel Macro ให้ Export ข้อมูลออกเป็น CSV ทีละ 1000 แถว
พอดีวันนี้เห็นคำถามที่น่าสนใจครับ เลยขอมาเขียนเป็น Blog คำถามก็คือ


https://pantip.com/topic/30062420
วันก่อนผมมาถามก็ได้รับคำตอบที่ดีจากน้า ๆ ที่เป็นสมาชิกพอเอาไปใช้เข้าจริง ๆ แล้ว ถ้าตัวหนังสือ มันยาวเกิน 1 บรรทัดใน word ก็นับเป็น 1 บรรทัด
ก็กลายเป็นว่าข้อมูลออกมาไม่หมด (ทีแรกก็ทำได้ครับ เพราะว่าข้อมูล ในแต่ละแถวไม่เยอะ แต่ผม โชคดีได้ ข้อมูลที่ยาว ๆ มาก็เลยทำไม่ได้ที่จะให้ export ออกมาทีละบรรทัดไม่ได้เพราะว่าข้อมูลยาวเกิน)

ผมก็เห็นว่าวิธีนี้ง่ายและดีที่สุดคือ ให้ export ออกจาก macro ของ MS

นี่เป็นรายละเอียดและคำถามเก่านะครับ

พอดีกว่าผมมีไฟล์ csv อยู่ 1 ไฟล์ แล้วในนั้นมีข้อมูลอยู่ประมาณ หมื่นกว่าบรรทัด
ต้องการแบ่งข้อมูลในนั้น ออกมาทีละ 1000 แถว โดยที่แต่ละ 1000 แถวนั้นจะบันทึกเป็นชื่อไฟล์ ให้มันเรียงลำดับเช่น
output01.csv สำหรับ 1000 แถวแรก
output02.csv สำหรับ 1000 แถวต่อไป
จนถึง output10.csv

นี้กระทู้เก่า นะครับ https://pantip.com/topic/30029285

อันนี้เป็นการแก้ปัญหาโดยใช้ macro ใน word โดยคุณศุภชัย

copy ไฟล์ csv นั้น สำรองไว้ก่อนครับ

เปิด Word
สั่ง View แบบ Normal นะครับ จะได้ดูได้สบายตา
แล้วเปิดไฟล์ .csv นั้น ใน Word

เรียกคำสั่ง Macro
สร้าง Macro ใหม่ ด้วยคำสั่งชุดนี้ครับ
 
Sub MyMacro()
    For n = 1 To 10
    Selection.MoveDown Unit:=wdLine, Count:=1000, Extend:=wdExtend
    Selection.Cut
    Documents.Add DocumentType:=wdNewBlankDocument
    Selection.PasteAndFormat (wdPasteDefault)
        FName = "output" & n & ".csv"
    ActiveDocument.SaveAs FileName:=FName, FileFormat:=wdFormatText, _
        LockComments:=False, Password:="", AddToRecentFiles:=True, WritePassword _
        :="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts:=False, _
        SaveNativePictureFormat:=False, SaveFormsData:=False, SaveAsAOCELetter:= _
        False, Encoding:=874, InsertLineBreaks:=False, AllowSubstitutions:=False, _
         LineEnding:=wdCRLF, AddBiDiMarks:=False
    ActiveDocument.Close
    Next n
End Sub
 

กลับไปที่หน้าจอเอกสาร แล้วสั่ง Run Macro ที่สร้างไว้ข้างต้น

ใน Word ก่อนทำ เมื่อเปิดไฟล์แล้ว ให้กด CTRL+A
เลือกขนาดอักษรให้เป็น 5 point แล้วก็กำหนด Page Setup
เลือกระดาษแนวนอน เลือกขนาดกระดาษให้กว้างสัก 55 cm
ครับ เชื่อว่า เพียงพอ ที่จะทำให้ไม่เกิดการขึ้นบรรทัดใหม่ครับ

code ด้านล่างคือ Code ที่เป็น Excel VBA ครับ

Sub DivideFile()

        Dim record As String
        Dim countloop, maxcount As Integer
        Dim x As String

        maxcount = 3
        countloop = 0

        Open "c:testxxx.csv" For Input As #1
        Open "c:testxxx" + Str(Int(countloop / maxcount)) + ".csv" For Output As #2

        Do Until EOF(1)
            Line Input #1, record
            Print #2, record
            countloop = countloop + 1

            If (countloop Mod maxcount = 0) Then
                Close #2
                Open "c:testxxx" + Str(Int(countloop / maxcount)) + ".csv" For Output As #2
            End If
        Loop
        Close #1
        Close #2

End Sub



ขออธิบาย code ดังนี้
1 จำนวน record สูงสุดต่อ file ในกรณีนี้เปลี่ยนจากเลข 3 เป็น 1000
2  folder และ ชื่อ file csv ทีเป็น input
3 output file csv ที่เป็น sequence ไปเรื่อยๆ
4 function Line input เพื่อให้อ่านข้อมูลมาทั้งบรรทัด
** รับเขียนโปรแกรมบน excel หรือ python ติดต่อ line id : pornchai999
บทความเก่า



Create Date : 20 มกราคม 2556
Last Update : 8 มีนาคม 2565 8:36:20 น.
Counter : 7100 Pageviews.

0 comments
ชื่อ : * blog นี้ comment ได้เฉพาะสมาชิก
Comment :
 *ส่วน comment ไม่สามารถใช้ javascript และ style sheet
 

thaiger_u
Location :
  

[ดู Profile ทั้งหมด]
 ฝากข้อความหลังไมค์
 Rss Feed
 Smember
 ผู้ติดตามบล็อก : 3 คน [?]



Dancinga
@ฟรี
โปรแกรมปฏิทิน 2564 - Free android app


@ รับสอน เขียนโปรแกรม Python ระดับมัธยมปลาย
มกราคม 2556

 
 
1
2
3
4
5
6
7
8
9
10
11
13
14
15
17
18
19
21
22
23
24
26
27
28
29
31
 
 
All Blog