แยกไฟล์ excel ตามค่าของเซลล์


1

ฉันมีไฟล์มากกว่าหนึ่งพัน recodes ฉันต้องการแยกไฟล์ตามค่าของเซลล์ เช่นในคอลัมน์ AI มี SOLID ฉันต้องการแยกไฟล์ตาม SOLID และบันทึกในชื่อ SOLID จำเป็นต้องมีส่วนหัวในแต่ละไฟล์ที่ถูก spitted ด้วย

ตัวอย่าง

SOLID  CLIENTID   NAME    CLIENT_TYPE  STATUS
1324   123455     PU      1            3
1324   12364453   HARI    1            1
1324   4242430    S       1            1
1324   242454     SANJ    1            1
1324   454144     LOVE    1            1
1325   44         ANJ     1            1
1325   4          SUN     1            1
1325   4          ANS     1            1
1325   54546      ROBI    1            1
1289   4646       MUNI    1            1
1289   454546     JAYA    1            1
1289   46464      RAMC    1            1
1289   4545       MAHES   1            1

นี่เป็นคำถามสำหรับ StackExchange คุณจะต้องมีแมโครสำหรับอันนี้แน่นอน
ชุดย่อย

1
@ แปรปรวนจริงฉันไม่เข้าใจคำถาม เขาต้องการทำอะไรอย่างแน่นอน (อันที่จริงไม่มีเครื่องหมายการซักถามเดียวในข้อความ)
PO

คุณต้องการแบ่งตัวอย่างนี้เป็น 3 เวิร์กชีทหรือสาม worbooks หรือไม่ ละ 1324, 1325 และ 1289?
datatoo

ความเข้าใจของฉันเหมือนกับของดาต้าทู
ชุดย่อย

@JoBedard: ฉันยอมรับว่าคำถามนี้ไม่ชัดเจน แต่อย่าแยกเส้นผม - -“ ฉันต้องการ…” หมายถึง“ ฉันจะ…ได้อย่างไร”?“ คำถามมากมาย” ที่นี่ไม่ได้จบด้วยเครื่องหมายคำถาม
สกอตต์

คำตอบ:


1

เมื่อฉันเข้าใจคำถามของคุณคุณมีแผ่นงานที่คอลัมน์แรกมีค่าที่แถวข้อมูลของคุณถูกกำหนด คุณต้องการแยกแถวที่กำหนดให้กับแต่ละค่าเหล่านั้นและบันทึกแถวสำหรับแต่ละค่าลงในแผ่นงานแยกต่างหาก ฉันสมมติว่าคุณต้องการหลีกเลี่ยงการทำสิ่งนี้ด้วยมือโดยกำหนดจำนวนของรหัสที่คุณพูดถึง

รหัส VBA ต่อไปนี้อาจเหมาะสมกับความต้องการของคุณ มันมีขั้นตอนที่ใช้ค่าตัวกรองกับตาราง Excel และบันทึกผลลัพธ์ไปยังสมุดงานแต่ละรายการรวมถึงฟังก์ชั่นยูทิลิตี้ที่ระบุค่าที่ไม่ซ้ำที่จำเป็นต้องถูกกรอง

   ตัวเลือกที่ชัดเจน

   ตัวกรองย่อย TableAndSave ()
        'กรองช่วงข้อมูลเกี่ยวกับค่าต่างๆในช่วงแรก
        'คอลัมน์ของช่วงและบันทึกตัวกรอง
        ค่า 'เพื่อแยกแผ่นงาน ช่วงข้อมูล
        'สันนิษฐานว่าจะเริ่มในเซลล์ A1 และมี
        'ชื่อส่วนหัวของคอลัมน์ในแถวที่ 1 ของช่วง
        '
        'สมุดงานจะถูกบันทึกภายใต้ชื่อที่ขึ้นต้นด้วย
        'คำนำหน้าที่ระบุและลงท้ายด้วยค่าตัวกรอง
        เช่น "FILEAcme Corporation" ไดเรกทอรีที่
        'ไฟล์ถูกบันทึกและต้องระบุคำนำหน้าไฟล์
        'ด้านล่าง

        Dim wb เป็นสมุดงาน
        Dim ws As Worksheet, newWs As Worksheet
        Dim tableRng As Range, filterValuesRng As Range, Lastcell As Range
        Dim saveDir As String, savePathAndName As String
        msgResponse สลัวเป็นสตริง, saveNamePrefix As String
        Dim inputArr () As Variant, resultArr () As Variant
        ติ่มซำIndexตราบเท่าที่

        ในข้อผิดพลาด GoTo ExitErr

        ด้วยแอพพลิเคชั่น
            .ScreenUpdating = False
            .EnableEvents = False
        จบด้วย

        '*********************************************
        'ตั้งค่าบันทึกและบันทึกคำนำหน้าไฟล์ที่นี่
        '*********************************************
        saveDir = "e: \"
        saveNamePrefix = "ไฟล์"
        '*********************************************

        ตั้ง ws = ThisWorkbook.Worksheets ("Sheet1")
        ตั้ง lastcell = Cells.Find (อะไร: = "*", หลัง: = [A1], _
            SearchDirection = xlPrevious)
        ตั้งค่า tableRng = ช่วง ("$ A $ 1:" & lastcell.Address)
        ตั้งค่า filterValuesRng = ช่วง ("$ A $ 2: $ A $" & lastcell.Row)
        ด้วย ws
            เมื่อเกิดข้อผิดพลาดต่อไป 'แปลงช่วงข้อมูลเป็นตาราง
            .ListObjects.Add (SourceType: = xlSrcRange ที่มา: = tableRng, _
            XlListObjectHasHeaders: = xlYes) .Name = "หลัก"
            ในข้อผิดพลาด GoTo ExitErr
        จบด้วย
        inputArr = filterValuesRng 'กำหนดคอลัมน์ตัวกรองให้กับอาร์เรย์
        resultArr = GetDistinctElements (inputArr)
        สำหรับ resultIndex = LBound (resultArr) ถึง UBound (resultArr) 'วนซ้ำผ่านค่าตัวกรอง
            ด้วย ws
                เมื่อเกิดข้อผิดพลาดต่อไป
                .ShowAllData
                ในข้อผิดพลาด GoTo ExitErr
                .ListObjects ("หลัก") Range.AutoFilter _
                    ฟิลด์: = 1, Criteria1: = "=" & resultArr (resultIndex) 'ตั้งค่าตัวกรองปัจจุบัน
                .ListObjects ("Main") Range.Copy 'คัดลอกแถวที่กรอง
            จบด้วย
            ตั้ง newWs = สมุดงานเพิ่ม (xlWBATWorksheet). แผ่นงาน (1) 'สร้างสมุดงานใหม่และ
            เมื่อเกิดข้อผิดพลาดต่อไปให้วางแถวที่กรองแล้วลงไป
            ด้วย newWs.Range ("A1")
                .PasteSpecial xlPasteColumnWidths
                .PasteSpecial xlPasteValuesAndNumberFormats
                .เลือก
                Application.CutCopyMode = False
            จบด้วย
            ในข้อผิดพลาด GoTo ExitErr
            ตั้งค่า wb = ActiveWorkbook 'ไฟล์บันทึกประจำ
            savePathAndName = saveDir & saveNamePrefix & _
                              resultArr (resultIndex) & ".xlsx"
            ถ้า Dir (savePathAndName) = "" จากนั้น
                wb.SaveAs savePathAndName
                wb.Close
            จัดการอื่น ๆ 'กับไฟล์ที่มีอยู่ถ้ามี
                msgResponse = MsgBox ("ไฟล์" & saveNamePrefix & _
                              resultArr (resultIndex) & _
                              ".xlsx มีอยู่แล้ว" & vbCrLf & _
                              "แทนที่ไฟล์ที่มีอยู่หรือไม่", _
                              vbYesNoCancel)
                หาก msgResponse = vbYes
                    Application.DisplayAlerts = False
                    wb.SaveAs savePathAndName
                    wb.Close
                    Application.DisplayAlerts = True
                อื่น
                    Application.DisplayAlerts = False
                    wb.Close
                    Application.DisplayAlerts = False
                สิ้นสุดถ้า
            สิ้นสุดถ้า
        ผลลัพธ์ถัดไปดัชนี
        ws.ShowAllData 'แปลงตารางข้อมูลกลับเป็นช่วง
        ws.ListObjects ("Main"). Unlist 'และลบการจัดรูปแบบ
        ด้วย tableRng
            .Borders (xlEdgeLeft) .LineStyle = xlNone
            .Borders (xlEdgeTop) .LineStyle = xlNone
            .Borders (xlEdgeBottom) .LineStyle = xlNone
            .Borders (xlEdgeRight) .LineStyle = xlNone
            .Borders (xlInsideVertical) .LineStyle = xlNone
            . เส้นขอบ (xlInsideHorizontal) .LineStyle = xlNone
            .Font.Bold = False
            ด้วย. ภายใน
                .Pattern = xlNone
                .TintAndShade = 0
                .PatternTintAndShade = 0
            จบด้วย
        จบด้วย
        ws.Range ( "A1"). เลือก
        ออกจากตำบล

    ExitErr:
        ด้วยแอพพลิเคชั่น
            .ScreenUpdating = True
            .EnableEvents = True
            .DisplayAlerts = True
        จบด้วย
        ตั้ง ws = ไม่มีอะไร
        ตั้ง newWs = ไม่มีอะไร
        MsgBox "Error" & Err.Number & ":" & Err.Description, vbOKOnly, "Error"
    ส่วนท้าย

    ฟังก์ชัน GetDistinctElements (ByRef inputArr)
        'ส่งคืนอาร์เรย์ 1-D ของรายการที่ไม่ซ้ำจาก N-by-2
        'อาร์เรย์ของรายการข้อมูลที่ซ้ำซ้อน
        'โดยปกติแล้วอาเรย์อินพุตจะถูกสร้างขึ้นโดย
        'กำหนดช่วงแผ่นงานคอลัมน์เดียวให้
        'ชุดตัวแปร

        ติ่มซำเป็นวัตถุ
        ติ่มซำฉันตราบใด
        Set dict = CreateObject ("Scripting.Dictionary")
        สำหรับ i = LBound (inputArr) ถึง UBound (inputArr)
            dict (inputArr (i, 1)) = 1
        ต่อไปฉัน
        GetDistinctElements = dict.Keys ()

    ฟังก์ชั่นสิ้นสุด

มันทำงานได้อย่างสมบูรณ์แบบขอบคุณมาก .....
sushil

@sushil หากสิ่งนี้ตรงกับความต้องการของคุณคุณอาจทำเครื่องหมายว่านี่เป็นโซลูชันที่เหมาะกับคุณ
datatoo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.