应用程序将Excel文件转换为txt。我必须验证每一行匹配。下面是验证该函数的函数,但问题是它有时会从txt文件或excel文件返回空字符串,而两个文件都有这些行/行中的文本。
我从数据库中获取文件和文件夹名称,以及要使用的Excel工作表(如TabUse)
Function excelcomparison (ByRef ObjFolder, ByRef OrgFolder, ByRef originalfile, ByRef targetFile, ByRef TabUse)
print originalfile&":::"&TabUse&" -=VS=- "&targetFile
Dim fsox : Set fsox = CreateObject("Scripting.FileSystemObject")
Dim TargFileRead : Set TargFileRead = fsox.OpenTextFile(targetFile)
Dim OrgExcel : Set OrgExcel = CreateObject("Excel.Application")
'Application.DisplayAlerts = False
OrgExcel.Workbooks.Open(originalfile)
Set vSheet = OrgExcel.ActiveWorkbook.WorkSheets(TabUse)
For rc = 1 To vSheet.UsedRange.Rows.Count
For cc = 1 To vSheet.UsedRange.Columns.Count
vtext = (vSheet.cells(rc,cc))
If vstring="" Then
vstring=vtext
Else
vstring = vstring&vbTab&vtext
End If
Next
"修剪"任何前导和尾随标签:
Do
If Left(vstring , 1)=ChrW(9) Then
vstring = MID(vstring, 2)
Else
Exit Do
End If
Loop
Do
If RIGHT(vstring, 1)=ChrW(9) Then
vstring= REPLACE(RIGHT(vstring, 1),ChrW(9), ChrW(32))
vstring=Trim(vstring)
Else
Exit Do
End If
Loop
vstring = Trim(vstring)
某些单元格在Excel中合并,并且具有两行或更多行的高度。所以,跳过那些excel行和txt行:
If len(vstring)>0 Then
TargFileText = TargFileRead.ReadLine
Do
If Left(TargFileText, 1)=ChrW(9) Then
TargFileText = MID(TargFileText, 2)
Else
Exit Do
End If
Loop
Do
If RIGHT(TargFileText, 1)=ChrW(9) Then
TargFileText = REPLACE(RIGHT(TargFileText, 1),ChrW(9), ChrW(32))
TargFileText=Trim(TargFileText)
Else
Exit Do
End If
Loop
TargFileStr = Trim(TargFileText)
If trim(vstring) = trim(TargFileStr) Then
' print "match"
Else
print "Not Match"
print "+"&trim(TargFileStr)
print "*"&trim(vstring)
End If
Else
print "Lenth=0"
End If
vstring = ""
vtext = ""
TargFileStr=""
Next
OrgExcel.ActiveWorkbook.Close
TargFileRead.Close
fsox = Nothing
TargFileRead = Nothing
vSheet = Nothing
OrgExcel = Nothing
End Function
问题1:它不会随机读取某些文本或excel文件(从excel / text文件返回空字符串)
问题2:它没有关闭打开的Excel并且占用大量内存(最多可以验证50个文件)
问题:需要修复哪些内容?
答案 0 :(得分:2)
我认为当您尝试从excel和文本文件中的字符串右端删除vbtab时会出现问题。
对于Excel,您使用过:
If RIGHT(vstring, 1)=ChrW(9) Then
vstring= REPLACE(RIGHT(vstring, 1),ChrW(9), ChrW(32)) 'This may be the source of your problem
vstring=Trim(vstring)
Else
Exit Do
End If
<强>解释强>
您正在将ChrW(9)
替换为字符串[chrw(32)
]中的RIGHT(vstring, 1)
,其中只包含chrw(9)
。完成此替换后,您将结果[chrw(32)
或space
]分配给变量vstring
。在此行之后,您可以根据vstring=""
对于您使用的文本文件:
If RIGHT(TargFileText, 1)=ChrW(9) Then
TargFileText = REPLACE(RIGHT(TargFileText, 1),ChrW(9), ChrW(32)) 'This may be the source of the problem
TargFileText=Trim(TargFileText)
Else
Exit Do
End If
<强>解释强>
您正在将ChrW(9)
替换为字符串[chrw(32)
]中的RIGHT(TargFileText, 1)
,其中只包含chrw(9)
。完成此替换后,您将结果[chrw(32)
或space
]分配给变量TargFileText
。在此行之后,您可以根据TargFileText=""
<强>解:强> 在这两种情况下,您需要从右侧移除选项卡,就像从字符串左端移除vbTab一样,即使用 MID 功能:
If RIGHT(vstring, 1)=ChrW(9) Then
vstring= mid(vstring,1,len(vstring)-1) 'If there is a tab in the right side of the string, just capture till second last character of the string thus excluding the vbTab.
Else
Exit Do
End If
同样,对于文本文件:
TargFileText= mid(TargFileText,1,len(TargFileText)-1)
此外,仅当vstring不为空时才会读取文本文件。因此,如果vstring为空,则文本文件&#34;指针&#34;保持在与excel行递增1相同的行。因此,您可能会进行不正确的比较。为避免这种情况,您可以在else部分中使用 Skipline 方法,如下所示:
If len(vstring)>0 Then
'----your code----
'...
'...
else
TargFileRead.Skipline 'so that it skips the line corresponding to the case when vstring is ""
'--remaining code---
End If
要关闭Excel,请使用Excel应用程序的退出方法。
OrgExcel.Quit