2017-08-31 97 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