2015-05-20 142 views
0

我有以下幾點:
enter image description here合併來自多個列的數據合併到一列


我使用@BigBobby's answer來實現這一目標:

Sub MoveData() 
Range("H5:H99").ClearContents 
START_ROW = 5 
START_COL = 1 
STEP_COL = 2 
OUTPUT_ROW = 5 
OUTPUT_COL = 8 
Limit_Col = 9 

Row = START_ROW 
Col = START_COL 
Out_Row = OUTPUT_ROW 
While Col < Limit_Col 
    While Cells(Row, Col).Value <> "" 
     Cells(Out_Row, OUTPUT_COL).Value = Cells(Row, Col).Value 
     Out_Row = Out_Row + 1 
     Row = Row + 1 
    Wend 
    Row = START_ROW 
    Col = Col + STEP_COL 
Wend 
End Sub 


但正如你看到的,我期望能獲得這些值出現在列中的空白單元格之後。但是這段代碼無法將那些以黃色突出顯示的單元格拉出
如何修改此代碼來提取一個或多個空白單元格後可能出現的所有數據?

+0

您會收到錯誤消息,因爲第二個While循環向下移動列直到找到空白,一旦它找到一個移動過2列的空格。我建議你只需要添加一行來標識列中包含數據的最後一行。 –

回答

1

調整此代碼:

While Cells(Row, Col).Value <> "" 
    Cells(Out_Row, OUTPUT_COL).Value = Cells(Row, Col).Value 
    Out_Row = Out_Row + 1 
    Row = Row + 1 
Wend 

爲:

Do until row > Cells(65536, Col).End(xlUp).Row 
    Cells(Out_Row, OUTPUT_COL).Value = Cells(Row, Col).Value 
    Out_Row = Out_Row + 1 
    Row = Row + 1 
Loop 

這主要檢查是否該行已經通過了最後一排的數據,如果有,它移動到下一列。

編輯

要不能跨越的空白單元格複製使用:

Do until row > Cells(65536, Col).End(xlUp).Row 
     If Cells(Row, Col).Value <> "" then 
      Cells(Out_Row, OUTPUT_COL).Value = Cells(Row, Col).Value 
      Out_Row = Out_Row + 1 
     End If 
     Row = Row + 1 
    Loop 
+0

這段代碼運行速度比Bigbobby的答案快,但它在結果中也包括那些空白單元格。如何修改代碼不包含這些空白單元格? – cplus

+0

所以它!我已經更新它跳過空白單元格。我還沒有測試過它,但有一個去看看,如果它還沒有可以使它工作。 –

+0

雖然剛看到Bigbobby的回答,但我相信你可以通過修改它來加速! –

2

以前的答案是接近的,但它也將複製所有的空格中。此代碼應該執行您所需的操作:

Sub MoveData() 

START_ROW = 5 
START_COL = 1 
STEP_COL = 2 
OUTPUT_ROW = 5 
OUTPUT_COL = 10 

Row = START_ROW 
Col = START_COL 
Out_Row = OUTPUT_ROW 
While Col < OUTPUT_COL 
    While Row < ActiveSheet.UsedRange.Rows.Count 
     If Cells(Row, Col).Value <> "" Then 
      Cells(Out_Row, OUTPUT_COL).Value = Cells(Row, Col).Value 
      Out_Row = Out_Row + 1 
     End If 
     Row = Row + 1 
    Wend 
    Row = START_ROW 
    Col = Col + STEP_COL 
Wend 
End Sub 
+0

這是工作。但是運行命令需要很長時間。這是爲什麼? – cplus

+0

你有多少數據?它在這裏很快運行,但我沒有測試很多行,而且我的計算機速度非常快。你可以使用一個技巧使宏變得更快,在宏的開始部分包括:Application.ScreenUpdating = False,最後是Application.ScreenUpdating = True。這樣,每次影響單元格的操作後,Excel都不會重新繪製屏幕。 – BigBobby