我有一个包含超过 100000 条记录的文件。我想根据单元格值拆分文件。例如,在 AI 列中有 SOLID,我想根据 SOLID 拆分文件并以 SOLID 的名称保存。还需要拆分的每个文件中的标题。
例子
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
答案1
据我理解,您的问题,您有一个工作表,第一列包含分配给数据行的值。您想要隔离分配给每个值的行,并将每个值的行保存到单独的工作表中。考虑到您提到的重新编码次数,我假设您想避免手动执行此操作。
以下 VBA 代码可能适合您的需求。它包括一个将筛选值应用于 Excel 表并将结果保存到各个工作簿的过程,以及一个用于识别需要筛选的唯一值的实用函数。
选项明确 子过滤表和保存() '根据第一个值过滤数据范围 ' 范围的列并保存过滤后的 ' 值来分隔工作表。数据范围 ' 假设从单元格 A1 开始,并且 ' 范围第 1 行的列标题名称。 ‘ ' 工作簿以以下名称保存: ' 指定前缀并以过滤值结尾, 例如,“FILEAcme Corporation”。 '文件已保存,必须指定文件前缀 ' 以下。 Dim wb 作为工作簿 Dim ws 作为工作表,newWs 作为工作表 Dim tableRng 作为范围、filterValuesRng 作为范围、lastcell 作为范围 Dim saveDir 作为字符串,savePathAndName 作为字符串 将 msgResponse 设置为字符串,将 saveNamePrefix 设置为字符串 Dim inputArr() 作为变量,resultArr() 作为变量 Dim resultIndex 为 Long 发生错误时转到 ExitErr 附带申请 .ScreenUpdating = False .启用事件 = False 结尾 '************************************************ '在此设置保存目录和文件前缀 '************************************************ 保存目录 = “e:\” saveNamePrefix = “文件” '************************************************ 设置 ws = ThisWorkbook.Worksheets("Sheet1") 设置 lastcell = Cells.Find(What:="*", After:=[A1], _ 搜索方向:=xlPrevious) 设置 tableRng = Range("$A$1:" & lastcell.Address) 设置 filterValuesRng = Range("$A$2:$A$" & lastcell.Row) 使用 ws 出错时继续下一步 '将数据区域转换为表格 .ListObjects.添加(源类型:=xlSrcRange,源:=tableRng,_ XlListObjectHasHeaders:=xlYes).名称 = “主要” 发生错误时转到 ExitErr 结尾 inputArr = filterValuesRng '将过滤列分配给数组 结果Arr = GetDistinctElements(输入Arr) For resultIndex = LBound(resultArr) To UBound(resultArr) '循环遍历过滤器值 使用 ws 出错时继续下一步 .显示所有数据 发生错误时转到 ExitErr .ListObjects("主要").范围.自动过滤 _ Field:=1, Criteria1:="=" & resultArr(resultIndex) '设置当前过滤值 .ListObjects("Main").Range.Copy '复制已筛选的行 结尾 设置 newWs = Workbooks.Add(xlWBATWorksheet).Worksheets(1) '创建新工作簿并 出错时继续下一步'将筛选出的行粘贴到其中 使用 newWs.Range("A1") .PasteSpecial xlPasteColumnWidths .PasteSpecial xlPasteValuesAndNumberFormats 。选择 应用程序.CutCopyMode = False 结尾 发生错误时转到 ExitErr 设置 wb = ActiveWorkbook '文件保存例程 保存路径和名称 = 保存目录 & 保存名称前缀 & _ resultArr(resultIndex) & ".xlsx" 如果 Dir(savePathAndName) = "" 那么 wb.SaveAs 保存路径和名称 wb.关闭 否则'处理现有文件(如果有) msgResponse = MsgBox("文件" & saveNamePrefix & _ 结果Arr(结果索引) & _ “.xlsx 已存在。”& vbCrLf & _ “替换现有文件?”,_ vbYesNo取消) 如果 msgResponse = vbYes 那么 应用程序.DisplayAlerts = False wb.SaveAs 保存路径和名称 wb.关闭 应用程序.DisplayAlerts = True 别的 应用程序.DisplayAlerts = False wb.关闭 应用程序.DisplayAlerts = False 万一 万一 下一个结果索引 ws.ShowAllData '将数据表转换回范围 ws.ListObjects("Main").Unlist '并删除格式 使用 tableRng .边框(xlEdgeLeft)。线条样式 = xlNone .边框(xlEdgeTop).LineStyle = xlNone .边框(xlEdgeBottom).LineStyle = xlNone .边框(xlEdgeRight).线条样式 = xlNone .边框(xlInsideVertical)。线条样式 = xlNone .边框(xlInsideHorizontal).线条样式 = xlNone .字体.粗体 = False 使用 .Interior .模式 = xlNone .色调和阴影 = 0 .图案色调和阴影 = 0 结尾 结尾 ws.Range("A1").选择 退出子程序 退出错误: 附带申请 .屏幕更新 = True .启用事件 = True .DisplayAlerts = True 结尾 设置 ws = Nothing 设置 newWs = Nothing MsgBox “错误”&Err.Number&“:”&Err.Description,vbOKOnly,“错误” 子目录结束 函数 GetDistinctElements(ByRef inputArr) '从 N×2 数组中返回唯一项的一维数组 '输入包含重复项的数据项数组。 ' 输入数组通常由 ' 将单列工作表范围分配给 ' 变量数组。 Dim dict 作为对象 暗淡如长 设置 dict = CreateObject("Scripting.Dictionary") 对于 i = LBound(inputArr) 到 UBound(inputArr) 字典(输入数组(i,1))= 1 接下来我 获取不同元素 = 字典.Keys() 结束函数