从Excel中获取除选定的所有列

时间:2017-10-02 20:32:02

标签: excel automated-tests ado qtp hp-uft

我有excel文件转换为txt。在某些文件中,会跳过某些列。这是由数据库控制的:

file   | remove_column
=======+===============
file1  | CASE NOTE
-------+---------------
file2  | Description
-------+---------------
file3  | Item | Address

Remove_Column有标题(第1行)。如果应跳过多个列,则会使用' |'

分隔

如果匹配,我必须将转换后的txt文件与原始excel文件进​​行比较。如何读取除DB表中显示的列以外的所有列?

我正在使用UFT 12.5。通过Excel.Application或ADO读取Excel。 日Thnx)

UPD:我使用的代码:

我的列有硬编码:

Select Case OrigFileName 'file names come from database
    Case "Fees mm-yy.xls"
        ColumnNames = Split("1,2,3,4,5,6,7,8,9,10,11,12,13", ",")
    Case "Exp mm-yy.xls"
        ColumnNames = Split("1,2,3,4,5,6,7,8,9,12,13,14,15,16,19,20", ",")
End Select

但是有50个文件,企业可能会要求删除或添加任何列;此外,新文件即将来临......((

Dim fsox : Set fsox = CreateObject("Scripting.FileSystemObject")
Dim TargFileRead : Set TargFileRead = fsox.OpenTextFile(targetFile)
Dim OrgExcel : Set OrgExcel = CreateObject("Excel.Application")
OrgExcel.Workbooks.Open(originalfile)
Set vSheet = OrgExcel.WorkSheets(TabUse) 'excel sheet name, comes from database
print  vSheet.UsedRange.Rows.Count
For rc = 1 To vSheet.UsedRange.Rows.Count
For coc = 0 To UBound(ColumnNames) 'column names hard-coded
    cc = cInt(ColumnNames(coc))
    vtext = vSheet.cells(rc,cc)
    If NOT(vtext=ChrW(9)) Then
        If vstring="" Then
            vstring=vtext
        Else
            vstring = vstring&vbTab&vtext
        End If
    End If
    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= mid(TargFileText,1,len(TargFileText)-1)
            Else
                Exit Do
            End If
        Loop
        TargFileStr = Trim(TargFileText)

        If trim(vstring) = trim(TargFileStr) Then
'           print "match"
            Else
            print "-=Not Match=-"&VBNewLine&"txt:::"&trim(TargFileStr)&VBNewLine&"xls:::"&trim(vstring)
        End If
    End If
Next

2 个答案:

答案 0 :(得分:1)

我建议用函数调用替换Switch语句,该函数调用为表格提供相关的列。然后将允许列的逻辑放入另一个函数中。这应该使逻辑比固定列更灵活。

Function getColumns(OrigFileName as String) As String()
    Dim lastCol As Integer
    Dim ColumnNumbers As String
    lastCol = Sheets(OrigFileName).UsedRange.Columns.Count

    For col = 1 To lastCol
        If isColumnAllowed(OrigFileName, Sheets(OrigFileName).Cells(1, col)) Then
            ColumnNumbers = ColumnNumbers & IIf(Len(ColumnNumbers) = 0, "", ",") & col
        End If
    Next

    getColumns = Split(ColumnNumbers, ",")
End Function

Function isColumnAllowed(ByVal OrigFileName As String, columnName As String) As Boolean
    Select Case OrigFileName
        Case "file1"
            Forbidden = Split("CASE NOTE", "/")
        Case "file2"
            Forbidden = Split("Description", "/")
        Case "file3"
            Forbidden = Split("Item/ Address", "/")
    End Select

    isColumnAllowed = (UBound(Filter(Forbidden, columnName)) = -1)
End Function

答案 1 :(得分:0)

这就是我现在所做的工作:

If LEN(ColumnToRemove)>0 Then
    ColumnToRemoveCol = split(ColumnToRemove, "|") 'set collection of header strings to skip column
    For L = 1 To vSheet.UsedRange.Columns.Count
        For x = 0 to UBound(ColumnToRemoveCol)
        AddCol = 0 'ColumnToRemoveCol can have more than 1 item, that may cause any column to be added more than once; we will use the true/false logic via 0 and 1 to avoid that doubling
            If vSheet.cells(1, l)=ColumnToRemoveCol(x) Then
                AddCol = AddCol + 1
            End If
        Next
        If AddCol =0 Then ColumnNumbers = ColumnNumbers&","&L
    Next
Else
    For L = 1 To vSheet.UsedRange.Columns.Count
        ColumnNumbers = ColumnNumbers&","&L
    Next
End If
If LEFT(ColumnNumbers, 1)="," Then ColumnNumbers=MID(ColumnNumbers, 2)
If RIGHT(ColumnNumbers, 1)="," Then ColumnNumbers=MID(ColumnNumbers, 1, LEN(ColumnNumbers)-1)

在我的情况下打印第一个excel文件的列会显示下一行:

  

ColumnNumbers:1,2,3,4,5,6,7,8,10,11,12,15,16,17

进一步使用:

getColumns = Split(ColumnNumbers, ",")
For rc = 1 To vSheet.UsedRange.Rows.Count
    For coc = 0 To UBound(getColumns)
        cc = cInt(getColumns(coc))
        vtext = vSheet.cells(rc,cc)
.....
    Next
Next