2017-08-31 148 views
0

该应用程序将Excel文件转换为txt。我必须验证每一行匹配。下面是验证的功能,但问题是它有时会从txt文件或excel文件返回空字符串,而这两个文件在这些行/行中都有文本。QTP:函数从excel /文本文件返回空字符串

我得到的文件和文件夹名称,以及什么Excel工作表从数据库

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中统一并具有两排或更多排的高度。因此,跳过这些出类拔萃行和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 /文本文件中的空字符串)

问题2 :它不关闭打开的Excel,它们占用大量内存(最多需要验证的50个文件)

问题:需要修正哪些问题?

回答

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)字符串[RIGHT(vstring, 1)]与chrw(32)更换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(32)在字符串替换ChrW(9) [RIGHT(TargFileText, 1)]其中除了chrw(9)。完成此替换后,您将结果[即chrw(32)space]分配给变量TargFileText。此行之后,你修剪这个变量,由于其TargFileText=""

SOLUTION: 在这两种情况下,你需要从右侧取下标签,就像你的左端侧取出vbTab方式字符串i。即,通过使用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为空,文本文件“指针”保留在与Excel行增加1相同的行。由于此原因,您可能会有不正确的比较。为了避免这种情况,你可以在其他部分使用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 
+0

谢谢,它的工作!我绝对没有考虑使用len(vstring)-1)) 我只在Excel字符串不为空时阅读文本的原因是,如果excel行为空,软件在txt文件中没有空行。一切都很好,thnx) – Salek

+0

很高兴工作:) – Gurman