2014-10-10 110 views
3

試圖製作一個宏,該宏將在電子表格中每第1000行插入一行,並將列的先前1000行連接插入到第1000行中的單個單元格中柱。Excel VBA宏 - 在循環中連接

我使用此代碼插入一行每1000個行:

Sub Insert1000() 
    Dim rng As Range 

    Set rng = Range("A2") 
    While rng.Value <> "" 
     rng.Offset(1000).EntireRow.Insert 

     'code insert csv of 1000 previous rows into a single cell 

     Set rng = rng.Offset(1001) 
    Wend 
End Sub 

道歉,如果我的描述不清楚。這是我希望得到的結果的剪輯。

Clip

任何幫助,將不勝感激。

+0

你想要的*級聯*是一個公式或只是級聯值?你希望它在*列H *? – L42 2014-10-10 22:17:50

回答

3

編輯:上標明添加缺少的.EntireRow line

Sub InsertCSV() 
    Const BLOCK_SIZE As Long = 1000 
    Dim rng As Range, num 

    Set rng = Range("A2").Resize(BLOCK_SIZE) 
    num = Application.CountA(rng) 

    Do While num > 0 
     rng.Cells(BLOCK_SIZE + 1).EntireRow.Insert 
     With rng.Cells(BLOCK_SIZE + 1).EntireRow '<<edited 
     .Cells(1, "H").Value = Join(Application.Transpose(rng.Value), ",") 
     .Cells(1, "I").Value = Join(Application.Transpose(rng.Offset(0, 1).Value), ",") 
     End With 
     Set rng = rng.Offset(BLOCK_SIZE + 1) 
     num = Application.CountA(rng) 
    Loop 

End Sub 
+0

這個解決方案完全適合我的應用程序,在我目前的技能水平上是可以理解的。謝謝。 – NaudingAuff 2014-10-10 23:45:19

1

我會建議使用Mod運算符:

Dim x 

For Each x In ActiveSheet.Range("A1:A" & ActiveSheet.UsedRange.Rows.Count) 
    If x.Row Mod 1000 = 0 Then 
     x.EntireRow.Insert 
    End If 
Next x 

閱讀有關Mod運算符的位置: http://msdn.microsoft.com/en-us/library/se0w9esz.aspx

或更徹底:

Dim x, y, outputText As String 

For Each x In ActiveSheet.Range("A1:A" & ActiveSheet.UsedRange.Rows.Count) 
    outputText = outputText & x.Value 
    If x.Row Mod 1000 = 0 Then 
     x.EntireRow.Insert 
     x.Value = outputText 
     outputText = "" 
    End If 
Next x 
+0

'ActiveSheet.UsedRange.Count'返回'UsedRange'中的單元總數,而不僅僅是行數。當'UsedRange'中的單元格數大於1048576時,'ActiveSheet.Range(「A1:A」&ActiveSheet.UsedRange.Count)'將導致錯誤。在這種情況下,你想使用'ActiveSheet.UsedRange.Rows.Count'。 – 2014-10-10 23:08:20

+0

我會閱讀更多關於Mod操作符的信息。我正在學習,您的代碼與資源結合起來將具有很大的價值。感謝您在我的VBA教育中的指導。 – NaudingAuff 2014-10-10 23:47:23

0

下面的代碼應該給予必要的輸出你正在尋找:

子pInsert1000()

Dim lngLoop    As Long 
Dim lngTotal   As Long 
Dim lngCounter   As Long 
Dim rngRange   As Range 
Dim strConcatACol  As String 
Dim strConcatBCol  As String 

Set rngRange = Cells.Find("*", Cells(1, 1), xlFormulas, xlWhole, xlByRows, xlPrevious) 
If Not rngRange Is Nothing Then 
    lngTotal = rngRange.Row 
Else 
    lngTotal = 0 
End If 

lngCounter = 0 
lngLoop = 1 
While lngLoop < lngTotal 

    lngCounter = lngCounter + 1 
    If lngCounter = 1 Then 
     strConcatACol = Cells(lngLoop, 1) 
     strConcatBCol = Cells(lngLoop, 2) 
    Else 
     strConcatACol = strConcatACol & ", " & Cells(lngLoop, 1) 
     strConcatBCol = strConcatBCol & ", " & Cells(lngLoop, 2) 
    End If 
    If lngCounter = 1000 Then 
     Rows(lngLoop + 1).EntireRow.Insert 
     Cells(lngLoop + 1, 8) = strConcatACol 
     Cells(lngLoop + 1, 9) = strConcatBCol 
     lngLoop = lngLoop + 1 
     lngTotal = lngTotal + 1 
     lngCounter = 0 
    End If 
    lngLoop = lngLoop + 1 
Wend 

Set rngRange = Nothing 

末次