Excel VBA:将表格复制为单列

Excel VBA:将表格复制为单列,excel,vba,Excel,Vba,我有一张excel表格,看起来像这样 data1 data2 data3 ... data10 ... ... ... ... ... dataX dataY dataZ ... dataN 我需要将数据展平为一列,如下所示: data1 data2 data3 ... data10 dataX dataY dataZ ... dataN 我尝试创建一个宏,从选择开始自动执行复制+粘贴过程。这是我的密码: Sub copyIn1Col() ' ' copyIn1Col Ma

我有一张excel表格,看起来像这样

data1 data2 data3 ... data10
 ...   ...   ...  ...  ...
dataX dataY dataZ ... dataN
我需要将数据展平为一列,如下所示:

data1
data2
data3
 ...
data10
dataX
dataY
dataZ
 ...
dataN
我尝试创建一个宏,从选择开始自动执行复制+粘贴过程。这是我的密码:

Sub copyIn1Col()
'
' copyIn1Col Macro
'
' Keyboard Shortcut: Ctrl+r
'
    Selection.copy
    Range("B31").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Range("D3:D13").Select
End Sub

问题是,它会将复制的选择覆盖到相同的范围。

我使用了一个sub,我已经对它进行了修改,以满足您的需要。它将内容转储到名为Data的工作表中,将其更改为您希望它添加到的任何工作表

Sub Transform()

Dim rows As Long
Dim cols As Long
Dim r As Long
Dim c As Long
Dim t As Long

t = 1
rows = ActiveSheet.UsedRange.rows.Count
cols = ActiveSheet.UsedRange.Columns.Count

Application.ScreenUpdating = False

For r = 1 To rows 'If you have headers change 1 to the first row number of data
    For c = 1 To cols

        Sheets("Data").Cells(t, 1) = ActiveSheet.Cells(r, c).Value

        t = t + 1
    Next c
Next r


Application.ScreenUpdating = True

End Sub

这是我使用的一个潜艇,我已经修改过它来满足你的需求。它将内容转储到名为Data的工作表中,将其更改为您希望它添加到的任何工作表

Sub Transform()

Dim rows As Long
Dim cols As Long
Dim r As Long
Dim c As Long
Dim t As Long

t = 1
rows = ActiveSheet.UsedRange.rows.Count
cols = ActiveSheet.UsedRange.Columns.Count

Application.ScreenUpdating = False

For r = 1 To rows 'If you have headers change 1 to the first row number of data
    For c = 1 To cols

        Sheets("Data").Cells(t, 1) = ActiveSheet.Cells(r, c).Value

        t = t + 1
    Next c
Next r


Application.ScreenUpdating = True

End Sub

最简单、最快的方法是使用数组。我假设如下

表1中的数据范围为A1至E15 您希望输出在Sheet2单元格A1中 希望这就是你想要的

Option Explicit

Sub Sample()
    Dim inPutR, outPut()
    Dim i As Long, j As Long, n As Long

    '~~> Change this to the respective range
    inPutR = ThisWorkbook.Sheets("Sheet1").Range("A1:E15")

    ReDim Preserve outPut(UBound(inPutR, 1) * UBound(inPutR, 2))

    For i = LBound(inPutR, 1) To UBound(inPutR, 1)
        For j = LBound(inPutR, 2) To UBound(inPutR, 2)
            outPut(n) = inPutR(i, j)
            n = n + 1
        Next j
    Next i

    ThisWorkbook.Sheets("Sheet2").Range("A1").Resize(UBound(outPut) + 1) = _
    Application.Transpose(outPut)
End Sub

最简单、最快的方法是使用数组。我假设如下

表1中的数据范围为A1至E15 您希望输出在Sheet2单元格A1中 希望这就是你想要的

Option Explicit

Sub Sample()
    Dim inPutR, outPut()
    Dim i As Long, j As Long, n As Long

    '~~> Change this to the respective range
    inPutR = ThisWorkbook.Sheets("Sheet1").Range("A1:E15")

    ReDim Preserve outPut(UBound(inPutR, 1) * UBound(inPutR, 2))

    For i = LBound(inPutR, 1) To UBound(inPutR, 1)
        For j = LBound(inPutR, 2) To UBound(inPutR, 2)
            outPut(n) = inPutR(i, j)
            n = n + 1
        Next j
    Next i

    ThisWorkbook.Sheets("Sheet2").Range("A1").Resize(UBound(outPut) + 1) = _
    Application.Transpose(outPut)
End Sub

+1:但是我不建议使用UsedRange,因为最终可能会有很多空白值。例如,您的数据可能在A1:E15中,UsedRange来自A1:Z200:@SiddharthRout,这是一段懒惰的代码。我可以为此目的添加一个空白支票。+1:但是我不建议使用UsedRange,您可能会得到很多空白值。例如,您的数据可能在A1:E15中,UsedRange来自A1:Z200:@SiddharthRout,这是一段懒惰的代码。我可以为此加一张空白支票。Siddharth我对你感到惊讶,你把一张redim放在一个双循环里。特别是当输出的大小可以从inputr的边界上计算时。是的,你是对的。。。LOL:我想这是其中的一天:有没有一种方法可以使inPutR dymanic定义的范围像这样:RangeSelection,Selection.endxltorRight.Select RangeSelection,Selection.EndxlDown.Select+1表示变量数组。唯一的区别是我从不使用来自工作表的LBound,因为它隐含着第1个方向。我很惊讶你,在一个双循环中放入了一个redim。特别是当输出的大小可以从inputr的边界上计算时。是的,你是对的。。。LOL:我想这是其中的一天:有没有一种方法可以使inPutR dymanic定义的范围像这样:RangeSelection,Selection.endxltorRight.Select RangeSelection,Selection.EndxlDown.Select+1表示变量数组。唯一的区别是我从不使用来自工作表的LBound,因为它隐式地是1