2013-03-28 51 views
0

我有一個相當大的數據集,需要從Excel導出爲另一個應用程序的CSV文件。它不能有重複的列標題,但是目前有很多這種情況發生。我需要將這些標題及其各自的數據合併爲單列並刪除重複項。如何在公共列標題存在時合併來自多行的數據?

我試圖把數據是這樣的:

MAKE | MAKE | MAKE | MODEL | MODEL | TRIM | 
------------------------------------------- 
FORD |  |  |  |  |  | 
-------------------------------------------  
    | FIAT |  |  |  |  | 
------------------------------------------- 
    |  | MINI |  |  |  | 
------------------------------------------- 
    |  |  | PILOT |  |  | 
------------------------------------------- 
    |  |  |  | SC400 |  | 
------------------------------------------- 
    |  |  |  |  | EX | 
------------------------------------------- 

,並把它變成這樣:

MAKE | MODEL | TRIM | 
--------------------- 
FORD |  |  | 
---------------------  
FIAT |  |  | 
--------------------- 
MINI |  |  | 
--------------------- 
    | PILOT |  | 
--------------------- 
    | SC400 |  | 
--------------------- 
    |  | EX | 
--------------------- 

預先感謝在完成這個任何幫助。

+0

你知道,如果有小於255行,我轉了數據,然後查詢它(使用ADO和Excel ODBC驅動程序),鞏固了記錄,再次調換之前:) –

+0

如何你有多行數據 - 多於或少於255? –

+0

此電子表格中超過2000行。您是否在Excel 2010中使用 –

回答

2

您需要在較小的位分離開的問題:

  1. 閱讀獨特的遊戲,和他們(保存在一個字典對象作爲其值,你可能想堅持他們將被保存在列in)

  2. 您遍歷每個獲取值並讀取列標題的單元格。

  3. 你把它寫在價值上當前你迭代通過列一個新的工作表,但對於列位置您查找當前列標題在字典裏並獲取其位置。

編輯:代碼測試和調試。效果很好。

注意:此方法假定每行每個重複列只有1個值。 如果您有多個值爲1的重複列,那麼程序將始終保存最後一個值(因爲它將覆蓋以前的值)。如果你想要一個處理每列多個值的方法,那麼你需要爲新表格中的每一列保留一個行號,並在每次在該列中寫入數據時將其增加1。

Sub WriteValues() 

    'Aassuming your column titles are in row 1 
    Dim mainSheet As Worksheet 
    Set mainSheet = ActiveSheet 

    Dim maxCols As Integer 
    Dim maxRows As Double 
    maxRows = 0 
    maxCols = Cells(1, Columns.Count).End(xlToLeft).Column 

    Dim colPositions As Dictionary 
    Set colPositions = New Dictionary 

    'Iterate throgh row 1 to get all uniue values 
    Dim iCol As Integer 
    For iCol = 1 To maxCols 
     On Error Resume Next 
      colPositions.Add Cells(1, iCol).Value, colPositions.Count + 1 
     On Error GoTo 0 
     'Also record maxRows 
     If Cells(rows.Count, iCol).rows.End(xlUp).row > maxRows Then 
      maxRows = Cells(rows.Count, iCol).rows.End(xlUp).row 
     End If 
    Next i 

    Dim newSheet As Worksheet 
    Set newSheet = Sheets.Add 

    Dim col As Integer 
    Dim row As Double 


    'Write column titles in new sheet 
    Dim v As Variant 
    iCol = 1 
    For Each v In colPositions 
     Cells(1, iCol).Value = v 
     iCol = iCol + 1 
    Next v 

    'Main data iterator 
      For row = 2 To maxRows 
     For col = 1 To maxCols 

     Dim cellValue As String 
     Dim valueColumn As String 

     With mainSheet 
      cellValue = .Cells(row, col).Value 
      valueColumn = .Cells(1, col).Value 
     End With 
     If cellValue <> "" Then 
      newSheet.Cells(row, colPositions(valueColumn)).Value = cellValue 
     End If 
     Next col 
    Next row 
End Sub 
+0

波特,我對VBA開發人員不是很有經驗。這應該在Excel 2010中工作嗎?我得到一個錯誤,提示「用戶定義的類型未定義」,其中「Dim colPositions As Dictionary」 –

+2

哦..您需要添加對Miscrosoft Scripting Runtime的引用以使用Dictionary對象。轉到工具 - >參考找到Miscrosoft腳本運行時,然後單擊它。 –

+0

「VBA腳本運行時間」不在「可用引用」列表中。 –

相關問題