VBA在批量处理txt等文本文件的数据是其数据处理的一大重要应用,实际在处理txt文档往往需要提取多个测试料的多个目标数值,而且还要将提取的数值进一步处理,如求取平均值,最小值等,能够直观地看到一组数据的规律;将超出规格的数据进行标识,可以直观看到某些数据异常区域。
下述的实例就是需要提取txt文档中一颗料多个目标值,并利用一维数组的方式写入到单元格中,进而求取每一组值的平均值和最小值,然后循环提取进行每一个测试料的数据,最后将每一颗料的多组数据进行汇总成群数据,得到一个简洁的数据表,能偶较为直观知道所有数据群里面的每组平均值,最小值,组间比值以及超出规格的数量及比例,即一个txt文档的所有数据汇总成一行数据,简洁高效,可读性强。
以下是具体的实现方法。
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'这部分代码是读取txt文档多个目标数据并用数组写入单元格
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub Data_SFR()Dim Bookfile As String, shOCHFA10 As Object, sh_Start As Object '定义变量名称Application.ScreenUpdating = False '禁止屏幕刷新Application.Calculation = xlCalculationManual '计算模式为手动Bookfile = ThisWorkbook.NameSet shOCHFA10 = Workbooks(Bookfile).Sheets("OCHFA10") '定义worksheetSet sh_Start = Workbooks(Bookfile).Sheets("Start") '定义worksheetshOCHFA10.ActivateOr_i_30mm = 0Do While shOCHFA10.Cells(Or_i_30mm + 4, 3) <> "" '循环判断第3列的空白行是否为空,非空行数为Or_i_30mmOr_i_30mm = Or_i_30mm + 1LoopDim fso As Object, sFile As Object, blnExist As Boolean '定义对象变量 Dim FileName As String, LineText As Variant, i As Integer, iCol As IntegerConst ForReading = 1 '指定常量Set fso = CreateObject("Scripting.FileSystemObject") '创建FileSystemObject对象ChDrive "D"ChDir "D:\OCHFA10\OCHFA10 SLT Data"Openfilename = Application.GetOpenFilename("raw files (*.txt), *.txt") '打开类型为txt的文件,即筛选打开文件类型sh_Start.Cells(5, 3) = Openfilename '写入读取的文件名称 sh_Start.Cells(9, 3) = Now() '写入当前的开文件时间blnExist = fso.FileExists(Openfilename) '判断文件是否存在,如果不存在,则退出过程If Not blnExist Then MsgBox "文件不存在!": Exit SubSet sFile = fso.OpenTextFile(Openfilename, ForReading) '创建并打开名为sFile的TextStream对象Text = Split(Openfilename, "\") '拆分字符串lot_i = UBound(Text)sh_Start.Cells(7, 3) = Text(UBound(Text) - 2)A_start_30mm = Or_i_30mm + 4 '标题行占用4行,变量要加上4kj_30mm = 1i = 0j = 0Light_i = 0Do While Not sFile.AtEndOfStream '如果不是文本文件的尾端,则读取数据LineText = sFile.ReadLine '逐行读取字符串SFR_Text = Split(LineText, " ") '逐行拆分字符串SFR_No = UBound(SFR_Text) '获取读取的字符串最后序号的拆分字符串End_Text = Split(LineText, ".") '逐行拆分字符串END_No = UBound(SFR_Text)If END_No > 0 ThenLineText_Array = Right(SFR_Text(1), 17) 'right函数截取SFR_Text(1)字符串ElseEnd IfLineText_Start = Right(Left(LineText, 31), 9) 'right函数和left函数组合截取LineText特定字符串,与目标字符串对比Chart_30mm = Right(LineText, 19) 'right函数截取LineText特定字符串,与目标字符串对比MTFValue_Check = Right(LineText_TVL, 9) 'right函数截取LineText特定字符串,与目标字符串对比If SFR_No > 2 ThenSFR_Coor = SFR_Text(SFR_No - 2)O_C = SFR_Text(SFR_No - 2)
' LightMode = SFR_Text(SFR_No - 3)OTP_Text = SFR_Text(SFR_No - 1) '以各种条件拆分整行字符串,取特定字符串LineText_TVL = SFR_Text(SFR_No - 1)LineText_Light = SFR_Text(SFR_No - 3)ElseEnd IfIf LineText_TVL = "(210)" Then '定向标识,当读取内容行的字节无法区别,则采用跨行识别Light_i = 1End IfIf LineText_TVL = "(70)" Then '定向标识Light_j = 1End IfDim Arr_30mm(0 To 52)Dim Arr_Light(1 To 4)If Light_j = 1 And OTP_Text = "OTPCode" Then ''定向标识的应用shOCHFA10.Cells(A_start_30mm, 5) = SFR_Text(SFR_No)ElseEnd IfIf O_C = sh_Start.Cells(1, 3) Then Arr_30mm(0) = SFR_Text(SFR_No) '将目标字符串所在行的截取字符串写入一维数组第一个值ElseEnd IfFor LightMode_i = 0 To 3If Light_i = 1 And LineText_Light = sh_Start.Cells(2, LightMode_i + 2) Then '定向标识应用&判断提取字符串与目标字符串是否相同Arr_Light(1 + LightMode_i) = SFR_Text(SFR_No) '将目标字符串所在行的指定字符串写入一维动态数组ElseEnd IfNext LightMode_iFor TVL_i = 1 To 52If LineText_TVL = sh_Start.Cells(1, TVL_i + 3) Then '判断截取字符串是否与目标字符串相同Arr_30mm(TVL_i) = SFR_Text(SFR_No) ''将目标字符串所在行的指定字符串写入一维动态数组ElseEnd IfNext TVL_i' If SFR_Coor = "Enable" And SFR_No > 7 Then
'
' Arr_Coor(Coor_i) = SFR_Text(SFR_No - 6) & "/" & SFR_Text(SFR_No - 5) & "/" & SFR_Text(SFR_No - 4) & "/" & SFR_Text(SFR_No - 3)
' Coor_i = Coor_i + 1
'
' Else
'
' End IfIf LineText_Array = "SFRMxNWithThd_Raw" Then 'i_Spec = i_Spec + 1If i_Spec Mod 4 = 2 Then '判断"SFRMxNWithThd_Raw"字符串出现的2N的奇偶行,若为2N奇数行shOCHFA10.Cells(A_start_30mm, 3) = sh_Start.Cells(7, 3)shOCHFA10.Cells(A_start_30mm, 4) = kj_30mm
' shOCHTA10.Cells(A_start_30mm, 6) = SFR_Text(SFR_No)
' shOCHTA10.Cells(A_start_30mm, 2) = Right(Left(LineText, 20), 19)Range(shOCHFA10.Cells(A_start_30mm, 11), shOCHFA10.Cells(A_start_30mm, 63)) = Arr_30mm '数组的值写入单元格Range(shOCHFA10.Cells(A_start_30mm, 7), shOCHFA10.Cells(A_start_30mm, 10)) = Arr_Light '数组的值写入单元格ElseIf i_Spec Mod 4 = 0 Then '判断"SFRMxNWithThd_Raw"字符串出现的2N的奇偶行,若为2N偶数行Range(shOCHFA10.Cells(A_start_30mm, 85), shOCHFA10.Cells(A_start_30mm, 137)) = Arr_30mmLight_i = 0Light_j = 0kj_30mm = kj_30mm + 1A_start_30mm = A_start_30mm + 1Erase Arr_30mm() '清除一维数组的数据,若将动态一维数组改为二维动态数组Arr_30mm(A_start_30mm,TVL_i),这一行代码可以去掉Erase Arr_Light() ''清除一维数组的数据,若将动态一维数组改为二维动态数组Arr_Light(,A_start_30mm,1 + LightMode_i),这一行代码可以去掉ElseEnd IfEnd If' If LineText_Start = "Final Bin" Then'' shOCHTA10.Cells(A_start_30mm, 3) = sh_Start.Cells(7, 3)
'' shOCHTA10.Cells(A_start_30mm, 4) = kj_30mm
' shOCHFA10.Cells(A_start_30mm - 1, 6) = SFR_Text(SFR_No)
'
' shOCHFA10.Cells(A_start_30mm - 1, 2) = Right(Left(LineText, 20), 19)
''
' Else
''
' End IfIf SFR_No > 9 ThenIf Right(End_Text(0), 21) = "End of SLT II testing" Then '判断局部字符串的终点shOCHFA10.Cells(A_start_30mm - 1, 6) = SFR_Text(9) '行数A_start_30mm - 1是因为上述循环+1行shOCHFA10.Cells(A_start_30mm - 1, 2) = Right(Left(LineText, 20), 19)ElseEnd IfEnd IfLoopsFile.Close '关闭名为sFile的TextStream对象Set fso = Nothing '对象变量关闭后,需要将对象变量设置为空Set sFile = Nothing '对象变量关闭后,需要将对象变量设置为空Call Min_Avg '调用Min_Avg子程序shOCHFA10.Cells(A_start_30mm, 1).SelectApplication.Calculation = xlCalculationAutomatic '计算模式为自动,与开始设为手动成对存在,加快代码运行速度 Application.ScreenUpdating = True '禁止屏幕刷新,与开始禁止刷屏成对存在,加快代码运行速度End Sub'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'这部分代码是求取多组数据的平均值和最小值
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub Min_Avg()Bookfile = ThisWorkbook.NameSet shOCHFA10 = Workbooks(Bookfile).Sheets("OCHFA10")Set sh_Start = Workbooks(Bookfile).Sheets("Start")shOCHFA10.Activatei = 0Run_done = 0Run_No = 0Do While shOCHFA10.Cells(i + 4, 3) <> ""i = i + 1LoopDo While shOCHFA10.Cells(Run_done + 4, 64) <> ""Run_done = Run_done + 1LoopRun_No = i - Run_done '确定已经读取到目标数据但是未求平均值和最小值的行数Sum_x = 0Sum_y = 0Min_x = 1Min_y = 1Field_i = 0Field_j = 0For j = 0 To Run_No - 1For p = 0 To 6For q = 0 To 51If shOCHFA10.Cells(1, q + 12) = shOCHFA10.Cells(1, p + 64) Then '判断是都是目标字符串Field_i = Field_i + 1Sum_x = Sum_x + shOCHFA10.Cells(Run_done + j + 4, q + 12) '求和If shOCHFA10.Cells(Run_done + j + 4, q + 12) < Min_x Then '迭代的方式求最小值Min_x = shOCHFA10.Cells(Run_done + j + 4, q + 12)ElseEnd IfEnd IfIf shOCHFA10.Cells(1, q + 86) = shOCHFA10.Cells(1, p + 138) Then '判断是都是目标字符串Field_j = Field_j + 1Sum_y = Sum_y + shOCHFA10.Cells(Run_done + j + 4, q + 86) '求和If shOCHFA10.Cells(Run_done + j + 4, q + 86) < Min_y Then '迭代的方式求最小值Min_y = shOCHFA10.Cells(Run_done + j + 4, q + 86)ElseEnd IfEnd IfNext qIf Field_i <> 0 ThenshOCHFA10.Cells(Run_done + j + 4, p + 64) = Min_x '最小值写入单元格shOCHFA10.Cells(Run_done + j + 4, p + 64 + 7) = Sum_x / Field_i '求第一组数据的每项平均值End IfIf Field_j <> 0 ThenshOCHFA10.Cells(Run_done + j + 4, p + 138) = Min_y '最小值写入单元格shOCHFA10.Cells(Run_done + j + 4, p + 138 + 7) = Sum_y / Field_j '求第二组数据的每项平均值ElseEnd IfSum_x = 0 '重置变量Sum_y = 0Field_i = 0Field_j = 0Min_x = 1Min_y = 1If shOCHFA10.Cells(Run_done + j + 4, 71 + p) <> 0 ThenshOCHFA10.Cells(Run_done + j + 4, 71 + p + 7) = shOCHFA10.Cells(Run_done + j + 4, 64 + p) / shOCHFA10.Cells(Run_done + j + 4, 71 + p) '求同类两组值的比值ElseshOCHFA10.Cells(Run_done + j + 4, 71 + p + 7) = ""End IfIf shOCHFA10.Cells(Run_done + j + 4, 145 + p) <> 0 ThenshOCHFA10.Cells(Run_done + j + 4, 145 + p + 7) = shOCHFA10.Cells(Run_done + j + 4, 138 + p) / shOCHFA10.Cells(Run_done + j + 4, 145 + p) '求同类两组值的比值ElseshOCHFA10.Cells(Run_done + j + 4, 145 + p + 7) = ""End IfNext p
' If shOCHTA10.Cells(Run_done + j + 4, 49) <> 0 Then
' shOCHTA10.Cells(Run_done + j + 4, 53) = shOCHTA10.Cells(Run_done + j + 4, 45) / shOCHTA10.Cells(Run_done + j + 4, 49)
' Else
' shOCHTA10.Cells(Run_done + j + 4, 53) = ""
'
' End If
'
' If shOCHTA10.Cells(Run_done + j + 4, 50) <> 0 Then
' shOCHTA10.Cells(Run_done + j + 4, 54) = shOCHTA10.Cells(Run_done + j + 4, 46) / shOCHTA10.Cells(Run_done + j + 4, 50)
' Else
' shOCHTA10.Cells(Run_done + j + 4, 54) = ""
' End If
'' If shOCHTA10.Cells(Run_done + j + 4, 109) <> 0 Then
' shOCHTA10.Cells(Run_done + j + 4, 113) = shOCHTA10.Cells(Run_done + j + 4, 108) / shOCHTA10.Cells(Run_done + j + 4, 109)
' Else
' shOCHTA10.Cells(Run_done + j + 4, 113) = ""
' End If
'
' If shOCHTA10.Cells(Run_done + j + 4, 105) <> 0 Then
' shOCHTA10.Cells(Run_done + j + 4, 114) = shOCHTA10.Cells(Run_done + j + 4, 109) / shOCHTA10.Cells(Run_done + j + 4, 105)
' shOCHTA10.Cells(Run_done + j + 4, 115) = shOCHTA10.Cells(Run_done + j + 4, 106) / shOCHTA10.Cells(Run_done + j + 4, 105)
' Else
' shOCHTA10.Cells(Run_done + j + 4, 114) = ""
' shOCHTA10.Cells(Run_done + j + 4, 115) = ""
'
' End If
'
' If shOCHTA10.Cells(Run_done + j + 4, 106) <> 0 Then
' shOCHTA10.Cells(Run_done + j + 4, 116) = shOCHTA10.Cells(Run_done + j + 4, 109) / shOCHTA10.Cells(Run_done + j + 4, 106)
' Else
' shOCHTA10.Cells(Run_done + j + 4, 116) = ""
' End IfNext j'-------------------------------------------------------------------- To get 0.58F Min SFR and Avg SFR --------------------------------------------------------------------' Field58_Min = 1
' Field58_Med = 1
'
' For m = 0 To Run_No - 1
' For n = 0 To 2
'
' If shOCHTA10.Cells(Run_done + m + 4, n + 46) < Field58_Min Then
' Field58_Min = shOCHTA10.Cells(Run_done + m + 4, n + 46)
' Else
' End If
'
' If shOCHTA10.Cells(Run_done + m + 4, n + 101) < Field58_Med Then
' Field58_Med = shOCHTA10.Cells(Run_done + m + 4, n + 101)
' Else
' End If
'
' Next n
'
' shOCHTA10.Cells(Run_done + m + 4, 45) = Field58_Min
' shOCHTA10.Cells(Run_done + m + 4, 52) = (shOCHTA10.Cells(Run_done + m + 4, 53) * 8 + shOCHTA10.Cells(Run_done + m + 4, 54) * 4 + shOCHTA10.Cells(Run_done + m + 4, 55) * 8) / 20 '?????
' shOCHTA10.Cells(Run_done + m + 4, 100) = Field58_Med
' shOCHTA10.Cells(Run_done + m + 4, 107) = (shOCHTA10.Cells(Run_done + m + 4, 108) * 8 + shOCHTA10.Cells(Run_done + m + 4, 109) * 4 + shOCHTA10.Cells(Run_done + m + 4, 110) * 8) / 20 '?????
'
' Field58_Min = 1
' Field58_Med = 1
'
' Next m'-------------------------------------------------------------------- To Change Color for Fail items --------------------------------------------------------------------For m = 0 To Run_No - 1For n = 0 To 65If shOCHFA10.Cells(Run_done + m + 4, n + 12) < shOCHFA10.Cells(3, n + 12) Then '判断获取的目标值是否小于规格,小于规则则标红,字体加粗,斜体shOCHFA10.Cells(Run_done + m + 4, n + 12).Font.ColorIndex = 3shOCHFA10.Cells(Run_done + m + 4, n + 12).Font.Bold = TrueshOCHFA10.Cells(Run_done + m + 4, n + 12).Font.Italic = TrueEnd IfIf shOCHFA10.Cells(Run_done + m + 4, n + 86) < shOCHFA10.Cells(3, n + 86) ThenshOCHFA10.Cells(Run_done + m + 4, n + 86).Font.ColorIndex = 3shOCHFA10.Cells(Run_done + m + 4, n + 86).Font.Bold = TrueshOCHFA10.Cells(Run_done + m + 4, n + 86).Font.Italic = TrueEnd IfNext nNext m'-------------------------------------------------------------------- To delete repeated rows and empty rows --------------------------------------------------------------------For m = 0 To Run_No - 1' If shOCHFA10.Cells(Run_done + m + 4, 5) <> "" And shOCHFA10.Cells(Run_done + m + 4, 12) = "" ThenIf shOCHFA10.Cells(Run_done + m + 4, 6) <> 0 And Application.CountIf(shOCHFA10.Columns("E"), shOCHFA10.Cells(Run_done + m + 4, 5)) > 1 or shOCHFA10.Cells(Run_done + m + 4, 6) <> 0 And shOCHFA10.Cells(Run_done + m + 4, 12) = "" ThenRows(Run_done + m + 4).Deletem = m - 1ElseEnd IfNext m
' End Sub
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'这部分代码是汇总数据,按照同一群数据进行求和,分类,取平均值,算两群数据比值
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Sub MTSummary()Bookfile = ThisWorkbook.NameSet shData = Workbooks(Bookfile).Sheets("MT Summary")Dim arrDim dataArrstartRow = shData.Range("Y100000").End(xlUp).Row + 1endRow = shData.Range("D100000").End(xlUp).RowSet shOpenSummary = ThisWorkbook.Sheets("OCHFA10")On Error Resume NextshOpenSummary.ShowAllDatadataLastRow = shOpenSummary.Range("C1000000").End(xlUp).RowdataArr = shOpenSummary.Range("C5:FB" & dataLastRow)For i = startRow To endRowlotID = shData.Cells(i, 4).ValueCenterShift = 0RatioDiagTL = 0RatioDiagTR = 0RatioDiagBL = 0RatioDiagBR = 0OD5mm01FMin = 0OD5mm028FMin = 0OD5mm036FMin = 0OD5mm041FMin = 0OD5mm048FMin = 0OD5mm061FMin = 0OD5mm072FMin = 0OD5mm01FAvg = 0OD5mm028FAvg = 0OD5mm036FAvg = 0OD5mm041FAvg = 0OD5mm048FAvg = 0OD5mm061FAvg = 0OD5mm072FAvg = 0OD5mm01FRatio = 0OD5mm028FRatio = 0OD5mm036FRatio = 0OD5mm041FRatio = 0OD5mm048FRatio = 0OD5mm061FRatio = 0OD5mm072FRatio = 0OD50mm01FMin = 0OD50mm028FMin = 0OD50mm036FMin = 0OD50mm041FMin = 0OD50mm048FMin = 0OD50mm061FMin = 0OD50mm072FMin = 0OD50mm01FAvg = 0OD50mm028FAvg = 0OD50mm036FAvg = 0OD50mm041FAvg = 0OD50mm048FAvg = 0OD50mm061FAvg = 0OD50mm072FAvg = 0OD50mm01FRatio = 0OD50mm028FRatio = 0OD50mm036FRatio = 0OD50mm041FRatio = 0OD50mm048FRatio = 0OD50mm061FRatio = 0OD50mm072FRatio = 0Bin_0 = 0Bin_325 = 0Bin_202_203 = 0Bin_385 = 0Bin_315 = 0Bin_365 = 0Bin_other = 0unitCount = 0For j = 1 To dataLastRow - 4If dataArr(j, 1) = lotID And dataArr(j, 10) <> "" Then'lastDate = dataArr(j, 1)RatioDiagTL = RatioDiagTL + dataArr(j, 5)RatioDiagTR = RatioDiagTR + dataArr(j, 6)RatioDiagBL = RatioDiagBL + dataArr(j, 7)RatioDiagBR = RatioDiagBR + dataArr(j, 8)CenterShift = CenterShift + dataArr(j, 9)OD5mm01FMin = OD5mm01FMin + dataArr(j, 136)OD5mm028FMin = OD5mm028FMin + dataArr(j, 137)OD5mm036FMin = OD5mm036FMin + dataArr(j, 138)OD5mm041FMin = OD5mm041FMin + dataArr(j, 139)OD5mm048FMin = OD5mm048FMin + dataArr(j, 140)OD5mm061FMin = OD5mm061FMin + dataArr(j, 141)OD5mm072FMin = OD5mm072FMin + dataArr(j, 142)OD5mm01FAvg = OD5mm01FAvg + dataArr(j, 143)OD5mm028FAvg = OD5mm028FAvg + dataArr(j, 144)OD5mm036FAvg = OD5mm036FAvg + dataArr(j, 145)OD5mm041FAvg = OD5mm041FAvg + dataArr(j, 146)OD5mm048FAvg = OD5mm048FAvg + dataArr(j, 147)OD5mm061FAvg = OD5mm061FAvg + dataArr(j, 148)OD5mm072FAvg = OD5mm072FAvg + dataArr(j, 149)OD5mm01FRatio = OD5mm01FRatio + dataArr(j, 150)OD5mm028FRatio = OD5mm028FRatio + dataArr(j, 151)OD5mm036FRatio = OD5mm036FRatio + dataArr(j, 152)OD5mm041FRatio = OD5mm041FRatio + dataArr(j, 153)OD5mm048FRatio = OD5mm048FRatio + dataArr(j, 154)OD5mm061FRatio = OD5mm061FRatio + dataArr(j, 155)OD5mm072FRatio = OD5mm072FRatio + dataArr(j, 156)OD50mm01FMin = OD50mm01FMin + dataArr(j, 62)OD50mm028FMin = OD50mm028FMin + dataArr(j, 63)OD50mm036FMin = OD50mm036FMin + dataArr(j, 64)OD50mm041FMin = OD50mm041FMin + dataArr(j, 65)OD50mm048FMin = OD50mm048FMin + dataArr(j, 66)OD50mm061FMin = OD50mm061FMin + dataArr(j, 67)OD50mm072FMin = OD50mm072FMin + dataArr(j, 68)OD50mm01FAvg = OD50mm01FAvg + dataArr(j, 69)OD50mm028FAvg = OD50mm028FAvg + dataArr(j, 70)OD50mm036FAvg = OD50mm036FAvg + dataArr(j, 71)OD50mm041FAvg = OD50mm041FAvg + dataArr(j, 72)OD50mm048FAvg = OD50mm048FAvg + dataArr(j, 73)OD50mm061FAvg = OD50mm061FAvg + dataArr(j, 74)OD50mm072FAvg = OD50mm072FAvg + dataArr(j, 75)OD50mm01FRatio = OD50mm01FRatio + dataArr(j, 76)OD50mm028FRatio = OD50mm028FRatio + dataArr(j, 77)OD50mm036FRatio = OD50mm036FRatio + dataArr(j, 78)OD50mm041FRatio = OD50mm041FRatio + dataArr(j, 79)OD50mm048FRatio = OD50mm048FRatio + dataArr(j, 80)OD50mm061FRatio = OD50mm061FRatio + dataArr(j, 81)OD50mm072FRatio = OD50mm072FRatio + dataArr(j, 82)unitCount = unitCount + 1If dataArr(j, 4) = 0 ThenBin_0 = Bin_0 + 1ElseIf dataArr(j, 4) = 325 ThenBin_325 = Bin_325 + 1ElseIf dataArr(j, 4) = 202 Or dataArr(j, 4) = 203 ThenBin_202_203 = Bin_202_203 + 1ElseIf dataArr(j, 4) = 385 ThenBin_385 = Bin_385 + 1ElseIf dataArr(j, 4) = 315 ThenBin_315 = Bin_315 + 1ElseIf dataArr(j, 4) = 365 ThenBin_365 = Bin_365 + 1ElseBin_other = Bin_other + 1End IfEnd IfNextshData.Cells(i, "V").Value = CenterShift / unitCountshData.Cells(i, "W").Value = RatioDiagTL / unitCountshData.Cells(i, "X").Value = RatioDiagTR / unitCountshData.Cells(i, "Y").Value = RatioDiagBL / unitCountshData.Cells(i, "Z").Value = RatioDiagBR / unitCountshData.Cells(i, "AA").Value = OD5mm01FMin / unitCountshData.Cells(i, "AB").Value = OD5mm028FMin / unitCountshData.Cells(i, "AC").Value = OD5mm036FMin / unitCountshData.Cells(i, "AD").Value = OD5mm041FMin / unitCountshData.Cells(i, "AE").Value = OD5mm048FMin / unitCountshData.Cells(i, "AF").Value = OD5mm061FMin / unitCountshData.Cells(i, "AG").Value = OD5mm072FMin / unitCountshData.Cells(i, "AH").Value = OD5mm01FAvg / unitCountshData.Cells(i, "AI").Value = OD5mm028FAvg / unitCountshData.Cells(i, "AJ").Value = OD5mm036FAvg / unitCountshData.Cells(i, "AK").Value = OD5mm041FAvg / unitCountshData.Cells(i, "AL").Value = OD5mm048FAvg / unitCountshData.Cells(i, "AM").Value = OD5mm061FAvg / unitCountshData.Cells(i, "AN").Value = OD5mm072FAvg / unitCountshData.Cells(i, "AO").Value = OD5mm01FRatio / unitCountshData.Cells(i, "AP").Value = OD5mm028FRatio / unitCountshData.Cells(i, "AQ").Value = OD5mm036FRatio / unitCountshData.Cells(i, "AR").Value = OD5mm041FRatio / unitCountshData.Cells(i, "AS").Value = OD5mm048FRatio / unitCountshData.Cells(i, "AT").Value = OD5mm061FRatio / unitCountshData.Cells(i, "AU").Value = OD5mm072FRatio / unitCountshData.Cells(i, "AV").Value = OD50mm01FMin / unitCountshData.Cells(i, "AW").Value = OD50mm028FMin / unitCountshData.Cells(i, "AX").Value = OD50mm036FMin / unitCountshData.Cells(i, "AY").Value = OD50mm041FMin / unitCountshData.Cells(i, "AZ").Value = OD50mm048FMin / unitCountshData.Cells(i, "BA").Value = OD50mm061FMin / unitCountshData.Cells(i, "BB").Value = OD50mm072FMin / unitCountshData.Cells(i, "BC").Value = OD50mm01FAvg / unitCountshData.Cells(i, "BD").Value = OD50mm028FAvg / unitCountshData.Cells(i, "BE").Value = OD50mm036FAvg / unitCountshData.Cells(i, "BF").Value = OD50mm041FAvg / unitCountshData.Cells(i, "BG").Value = OD50mm048FAvg / unitCountshData.Cells(i, "BH").Value = OD50mm061FAvg / unitCountshData.Cells(i, "BI").Value = OD50mm072FAvg / unitCountshData.Cells(i, "BJ").Value = OD50mm01FRatio / unitCountshData.Cells(i, "BK").Value = OD50mm028FRatio / unitCountshData.Cells(i, "BL").Value = OD50mm036FRatio / unitCountshData.Cells(i, "BM").Value = OD50mm041FRatio / unitCountshData.Cells(i, "BN").Value = OD50mm048FRatio / unitCountshData.Cells(i, "BO").Value = OD50mm061FRatio / unitCountshData.Cells(i, "BP").Value = OD50mm072FRatio / unitCountshData.Cells(i, "A").Value = "ATE"shData.Cells(i, "B").Value = "OCHFA10"shData.Cells(i, "C").Value = Format(Now, "yyyy/mm/dd")shData.Cells(i, "E").Value = unitCountshData.Cells(i, "O").Value = Bin_0shData.Cells(i, "P").Value = Bin_325shData.Cells(i, "Q").Value = Bin_202_203shData.Cells(i, "R").Value = Bin_385shData.Cells(i, "S").Value = Bin_315shData.Cells(i, "T").Value = Bin_365shData.Cells(i, "U").Value = Bin_other' If shData.Cells(i, "AG").Value < shData.Cells(3, "AG").Value Then
' shData.Range("AG" & i).Font.Color = vbRed
' shData.Range("AG" & i).Font.Bold = True
' Else:
' shData.Range("AG" & i).Font.Color = vbBlack
' shData.Range("AG" & i).Font.Bold = False
' End If
' If shData.Cells(i, "O").Value < 0.24 Then
' shData.Range("O" & i).Font.Color = vbRed
' shData.Range("O" & i).Font.Bold = True
' Else:
' shData.Range("O" & i).Font.Color = vbBlack
' shData.Range("O" & i).Font.Bold = False
' End If
' If shData.Cells(i, "AC").Value < shData.Cells(3, "AC").Value Then
' shData.Range("AC" & i).Font.Color = vbRed
' shData.Range("AC" & i).Font.Bold = True
' Else:
' shData.Range("AC" & i).Font.Color = vbBlack
' shData.Range("AC" & i).Font.Bold = False
' End If
'NextFor k_i = 1 To 7If shData.Cells(i - 1, 5) <> "" ThenshData.Cells(i - 1, 5 + k_i) = shData.Cells(i - 1, 14 + k_i) / shData.Cells(i - 1, 5)End IfNextWorkbooks(summaryFile).Close SaveChanges:=FalseEnd Sub
以上代码中,可以总结几个重点技巧:
1.vba读取txt文档并逐行读取字符串,利用split等方法提取特定的字符串;
2.定向标识,当读取内容行的字符串有多行无法区别,则采用跨行找可识别的行,并作为识别标识,如上代码中的例子;
If LineText_TVL = "(210)" Then '定向标识,当读取内容行的字节无法区别,则采用跨行识别Light_i = 1End IfIf LineText_TVL = "(70)" Then '定向标识Light_j = 1End If
3.采用一维数组(二维数组)读取目标字符串,再将目标字符串一次性写入单元格,快速高效,可以提高代码运行速度;
4.处理数据时多组织的平均值和最小值,尤其是最小值的取法。