VBA宏改造:实现按日期与类型双维度拆分,修复记录全量写入问题
原有逻辑核心问题梳理
- 判断时序错误:日期匹配判断
If TDate = SelectedDate Then放在了给TDate赋值的代码之前,初始TDate为空值,该条件永远不成立,核心循环实际未按预期执行 - 循环逻辑错位:外层循环遍历行取日期值,内层循环却重新遍历全表取类型值,没有对同一行的日期、类型组合做匹配校验,导致每遍历一行都会把全表的所有类型值生成一遍对应文件,自然出现所有记录混写、重复生成文件的问题
- 写入逻辑缺失:每次打开文件用
For Output模式但没有传入实际要写入的记录内容,仅空开空关文件,无法正确留存匹配的行数据 - 循环范围偏差:
sRange取包含表头的全量数据区域,起始行设置未对齐数据实际的行数边界,容易遍历到空行产生无效文件
修正后的实现代码
以下代码完全保留用户已验证可用的文件名生成、目录创建逻辑,仅补充分组匹配、内容写入的核心逻辑:
Sub SplitDataByDateAndType() Dim sRange As Range Dim i As Long Dim SelectedDate As String Dim uniqueDict As Object Dim dictKey As String Dim fileName As String Dim fileNum As Integer Dim lineContent As String ' 初始化:获取UserForm传入的选中日期值 SelectedDate = Range("AA2").Value ' 获取有效数据区域(自动覆盖从A2开始的所有连续数据) Set sRange = Range("A2").CurrentRegion ' 初始化字典,用于存储当前选中日期下所有不重复的类型值,避免重复生成文件 Set uniqueDict = CreateObject("Scripting.Dictionary") ' 第一步:筛选所有匹配选中日期的记录,收集唯一的类型组合 For i = 2 To sRange.Rows.Count ' 跳过空行,避免无效值干扰 If sRange.Cells(i, 1).Value <> "" Then ' 严格匹配用户选中的日期 If CStr(sRange.Cells(i, 1).Value) = CStr(SelectedDate) Then dictKey = CStr(sRange.Cells(i, 2).Value) ' 类型值未收录则加入字典,保证每个类型只生成一次文件 If Not uniqueDict.Exists(dictKey) Then uniqueDict.Add dictKey, "" End If End If End If Next i ' 第二步:对每个唯一的日期+类型组合,筛选对应记录写入文件 For Each dictKey In uniqueDict.Keys ' 保留用户原有已跑通的多级目录判断、创建逻辑,此处直接拼接最终文件名 fileName = MyFolderFull & "\FILE_" & SelectedDate & "_" & dictKey & ".txt" ' 获取可用文件号,避免文件占用报错 fileNum = FreeFile() Open fileName For Output As #fileNum ' 遍历全量数据行,匹配符合当前日期+类型组合的记录写入 For i = 2 To sRange.Rows.Count If sRange.Cells(i, 1).Value <> "" Then ' 严格双条件匹配 If CStr(sRange.Cells(i, 1).Value) = CStr(SelectedDate) _ And CStr(sRange.Cells(i, 2).Value) = dictKey Then ' 拼接当前行的5个字段为一行文本,按需调整分隔符(当前用Tab分隔) lineContent = Join(Array( _ sRange.Cells(i, 1).Value, _ sRange.Cells(i, 2).Value, _ sRange.Cells(i, 3).Value, _ sRange.Cells(i, 4).Value, _ sRange.Cells(i, 5).Value), vbTab) Print #fileNum, lineContent End If End If Next i Close #fileNum Next i ' 释放资源 uniqueDict.RemoveAll Set uniqueDict = Nothing MsgBox "Files created!" End Sub
实现效果验证
基于你提供的示例数据,当UserForm传入的选中日期为20210401时:
- 系统会自动识别出两个不重复的类型值1、2,仅生成2个目标文件,不会出现重复生成、冗余文件
FILE_20210401_1.txt内会自动写入2条同时匹配日期、类型为1的记录FILE_20210401_2.txt内会自动写入1条同时匹配日期、类型为2的记录,完全符合预期输出要求
内容的提问来源于stack exchange,提问作者Postino
相关产品推荐
相关产品推荐

