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