QTP:函数从excel / text文件返回空字符串

时间:2017-08-31 20:16:31

标签: vbscript automated-tests qtp

应用程序将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个文件)

问题:需要修复哪些内容?

1 个答案:

答案 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