【问题标题】:Get all columns from Excel except selected从 Excel 中获取除选中的所有列
【发布时间】:2017-10-02 20:32:01
【问题描述】:

我已将 excel 文件转换为 txt。在某些文件中,某些列被跳过。由数据库控制:

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

Remove_Column 有标题(第一行)。如果应该跳过几列,则用'|'分隔它们

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

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

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

【问题讨论】:

  • 您是否有阅读所有列的代码,但不知道如何跳过某些列?如果是这样,请您提供您的代码。
  • 哦,对了,我忘了……现在问题更新了。
  • 只是为了澄清:目标是用一种算法替换 ColumnNumbers,该算法读取所有列,除了那些在第 1 行的工作表的表格中包含字符串的列,对吧?
  • @JensS,绝对正确。
  • 太棒了;我已经添加了答案。

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


【解决方案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

【讨论】:

  • 它适用于VB,谢谢!我正在使用 UFT,并且必须进行一些修改,因为代码直接在那里不起作用。稍后会发布我的“版本”。
【解决方案2】:

这是我现在拥有并且正在工作的:

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 文件的列给出下一行:

列号: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

【讨论】:

    猜你喜欢
    • 2017-08-12
    • 2017-02-18
    • 2021-03-11
    • 2016-10-14
    • 1970-01-01
    • 2016-11-06
    • 2010-12-07
    • 2011-04-19
    • 1970-01-01
    相关资源
    最近更新 更多