2017-10-02 10 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件のファイルがあり、ビジネスを削除するには頼むかもしれないか、バック追加します任意の列。また、新しいファイルは、私は配列としてのシートのために、あなたに関連する列を与える関数呼び出しでSwitchステートメントを交換することをお勧め((

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のワークシートのためのあなたのテーブルの文字列を持っている列を除くすべての列を読み取るアルゴリズムで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

私の場合はエクセルファイルには、次の行を与えます

さらに使用:

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 
関連する問題