QTP:函数 returns 来自 excel/text 文件的空字符串
QTP: Function returns empty string from excel/text file
应用程序将 Excel 个文件转换为 txt。我必须验证每一行是否匹配。下面是验证该功能的函数,但问题是有时 returns 来自 txt 文件或 excel 文件的空字符串,而两个文件在 rows/lines.
中都有文本
我从数据库
获取文件和文件夹名称,以及excelsheet要使用的内容(作为 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
"Trim" 任何前导和尾随制表符:
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 文件(returns 来自 excel/text 文件的空字符串)
问题2:打开后无法关闭Excel并且占用大量内存(最多可验证50个文件)
问题:需要解决什么问题?
我认为当您尝试从 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(32)
替换字符串 [RIGHT(vstring, 1)
] 中的 ChrW(9)
,其中仅包含 chrw(9)
。完成此替换后,您正在将结果 [chrw(32)
或 space
] 分配给变量 vstring
。在这一行之后,你 trim 这个变量由于 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(32)
替换字符串 [RIGHT(TargFileText, 1)
] 中的 ChrW(9)
,其中仅包含 chrw(9)
。完成此替换后,您正在将结果 [chrw(32)
或 space
] 分配给变量 TargFileText
。在这一行之后,你 trim 这个变量由于 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 为空,文本文件 "pointer" 将保留在 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 应用程序的 Quit 方法。
OrgExcel.Quit
应用程序将 Excel 个文件转换为 txt。我必须验证每一行是否匹配。下面是验证该功能的函数,但问题是有时 returns 来自 txt 文件或 excel 文件的空字符串,而两个文件在 rows/lines.
中都有文本我从数据库
获取文件和文件夹名称,以及excelsheet要使用的内容(作为 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
"Trim" 任何前导和尾随制表符:
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 文件(returns 来自 excel/text 文件的空字符串)
问题2:打开后无法关闭Excel并且占用大量内存(最多可验证50个文件)
问题:需要解决什么问题?
我认为当您尝试从 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(32)
替换字符串 [RIGHT(vstring, 1)
] 中的 ChrW(9)
,其中仅包含 chrw(9)
。完成此替换后,您正在将结果 [chrw(32)
或 space
] 分配给变量 vstring
。在这一行之后,你 trim 这个变量由于 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(32)
替换字符串 [RIGHT(TargFileText, 1)
] 中的 ChrW(9)
,其中仅包含 chrw(9)
。完成此替换后,您正在将结果 [chrw(32)
或 space
] 分配给变量 TargFileText
。在这一行之后,你 trim 这个变量由于 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 为空,文本文件 "pointer" 将保留在 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 应用程序的 Quit 方法。
OrgExcel.Quit