2017-10-02 50 views
-1

J'ai des fichiers Excel convertis en txt. Dans certains fichiers, certaines colonnes sont ignorées. Cela est contrôlé par la base de données:Récupère toutes les colonnes d'Excel sauf celles sélectionnées

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

Remove_Column a l'en-tête (1ère ligne). Si plusieurs colonnes doivent être ignorées, elles sont délimitées par '|'

Je dois comparer le fichier txt converti avec le fichier Excel original s'il correspond. Comment puis-je lire toutes les colonnes sauf celles affichées dans la table DB?

J'utilise UFT 12.5. Lire Excel via Excel.Application ou ADO. Thnx)

UPD: Code I utiliser:

J'ai colonnes codées en dur:

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 

Mais il y a 50 fichiers, et l'entreprise peut demander de retirer ou de rajouter des colonnes En outre, de nouveaux fichiers sont à venir ... (((

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

Avez-vous du code pour lire toutes les colonnes, mais vous ne savez pas comment ignorer certaines colonnes? Si oui, pouvez-vous s'il vous plaît fournir votre code. – JensS

+0

oh, oui, j'ai oublié ... Maintenant, la question est mise à jour. – Salek

+0

Juste pour clarifier: l'objectif est de remplacer les ColumnNumbers par un algorithme lisant toutes les colonnes à l'exception de celles qui ont la chaîne dans votre table pour la feuille de calcul dans la ligne 1, n'est-ce pas? – JensS

Répondre

1

Je suggère de remplacer l'instruction switch avec un appel de fonction qui vous donne les colonnes pertinentes pour la feuille comme un tableau. La logique qui colonne est autorisée est alors mis dans une autre fonction qui devrait rendre la logique plus souple que les colonnes fixes

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 
+0

Cela fonctionne bien pour VB, merci! J'utilise UFT, et je dois apporter quelques modifications, car le code ne fonctionne pas directement ici. Plus tard, poster mon "édition". – Salek

0

C'est ce que j'ai maintenant et travaille:..

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) 

Impression des colonnes pour le premier e fichier Xcel dans mon cas donne la ligne suivante:

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

Autres utilisations:

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