2017-10-02 24 views
-1

Excel 파일을 txt로 변환했습니다. 일부 파일에서는 일부 열을 건너 뜁니다. 데이터베이스에 의해 제어됩니다 :Excel을 제외한 모든 열 가져 오기

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

모든 열을 읽는 코드가 있지만 특정 열을 건너 뛰는 방법을 모르십니까? 그렇다면 코드를 제공해 주시겠습니까? – JensS

+0

아, 예, 잊어 버렸습니다 ... 이제 질문이 업데이트됩니다. – Salek

+0

그냥 명확히하기 위해 : 행 1의 워크 시트에 대한 테이블에 String이있는 문자열을 제외한 모든 열을 읽는 알고리즘으로 ColumnNumbers를 바꾸는 것이 목표입니까? – JensS

답변

1

. 논리를 열은 허용되는 다음 다른 함수에 넣어 즉, 고정 된 열보다 더 유연한 논리를해야 이것은 내가 지금 무엇을하고 노력하고 있습니다

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

VB에서 감사합니다. 감사합니다! 코드가 직접 작동하지 않기 때문에 UFT를 사용 중이며 수정해야합니다. 나중에 내 "판"을 올릴 것입니다. – Salek

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) 

먼저 전자의 열을 인쇄

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

내 경우에는 XCEL 파일은 다음 라인을 제공합니다

추가 사용 :

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