เมื่อฉันเข้าใจคำถามของคุณคุณมีแผ่นงานที่คอลัมน์แรกมีค่าที่แถวข้อมูลของคุณถูกกำหนด คุณต้องการแยกแถวที่กำหนดให้กับแต่ละค่าเหล่านั้นและบันทึกแถวสำหรับแต่ละค่าลงในแผ่นงานแยกต่างหาก ฉันสมมติว่าคุณต้องการหลีกเลี่ยงการทำสิ่งนี้ด้วยมือโดยกำหนดจำนวนของรหัสที่คุณพูดถึง
รหัส 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 ()
ฟังก์ชั่นสิ้นสุด