Excel 将数据从行转置到单列

Excel 将数据从行转置到单列,excel,vba,Excel,Vba,我试图用这个公式来转换给定的数据,但它也需要空白单元格,在转换时我怎么能忽略它们呢 这是工作表ss,我想在A列中转置和粘贴数据 B01MU6O7H7 B07XB9NN9B B07261QWHY B071W4GMN3 B07X8BPD82 B07X8BNJZQ B07X8BNBJH B071JLW811 B071WK2YKV B071WK2QHN B072JTCJF8 B071G11SR7 B07

我试图用这个公式来转换给定的数据,但它也需要空白单元格,在转换时我怎么能忽略它们呢

这是工作表ss,我想在A列中转置和粘贴数据

B01MU6O7H7                              
B07XB9NN9B  B07261QWHY  B071W4GMN3  B07X8BPD82  B07X8BNJZQ  B07X8BNBJH          
B071JLW811  B071WK2YKV  B071WK2QHN  B072JTCJF8  B071G11SR7  B072QCCV2Q  B0743JHJBH      
B078GVQFB5  B078GQ9V6W  B078GTFHMY  B078GR4H15  B079KFH765  B078GTXD9N  B078GPVH73      
B078G6515S                              
B07T891H6J  B07T9DFRSM  B07T893RJM  B07TFHJ1XR  B07T9DGB2V  B07TFHJ6ZX  B07TBFC852      
B01N2WJ0OR  B01MQYNB3M  B06Y3Z65C5  B01MQZU45F                  
B076YFYD19  B076YF2ZNY  B074Z9ZY1S  B076XZ9WZV  B079KSDHSQ  B079KQJHZD  B074ZK64V3      
B07XJYL5Y2  B07XL3Y773                          
B07FCQTZ5X  B06XZ7Z93Z                          
B07MN7YHLM  B07M9HGJWP  B07MK98FJ5  B07M9HGN5D  B01NCVGDIC  B01N4NBSV9  B07MN8YKFQ  B074MZ93JP  B01N7RH9ZB
B07TKXWLFZ  B071CMQ6N2  B07VG1L2M5                      
B01B0SR1IY                              
B07GZFZQ6H  B07GZHSBRT  B07GZHG64J  B07GZDQ7QW                  
B07WLX685Q  B07WF3MQPB  B07WD3CHDW  B07W9KXP9Q  B07WG787XB  B07WD3BCDR          
B07J2K4WCV  B07J2MGH5W  B07J2L9MZS  B07J2LF71R                  
B07F9VP9QM  B07F9ZLCZW  B07FB1XZGL                      
试试看

试试看


试着这样做:

循环范围内的单元格,如果不为空,则为数组赋值,然后从目标集中写入数组

Sub TransposeMultiColumnDataToOneColumn()
Dim myArray As Variant
Dim SourceRange As Range, DestinationRange  As Range

Set SourceRange = Application.InputBox("Source Ranges:", xTitleId, Type:=8)
Set DestinationRange = Application.InputBox("Convert to (single cell):", xTitleId, Type:=8)

Dim ArrayCounter As Long
ReDim myArray(1 To SourceRange.Count)
Dim CellToCheck As Range

ArrayCounter = 0

For Each CellToCheck In SourceRange
    If Not CellToCheck.Value = Empty Then
        ArrayCounter = ArrayCounter + 1
        myArray(ArrayCounter) = CellToCheck.Value
    Else '
        'Cell is empty, do nothing
    End If
Next CellToCheck

ReDim Preserve myArray(1 To ArrayCounter)

Set DestinationRange = DestinationRange.Resize(UBound(myArray), 1)
DestinationRange.Value = Application.Transpose(myArray)

End Sub

试着这样做:

循环范围内的单元格,如果不为空,则为数组赋值,然后从目标集中写入数组

Sub TransposeMultiColumnDataToOneColumn()
Dim myArray As Variant
Dim SourceRange As Range, DestinationRange  As Range

Set SourceRange = Application.InputBox("Source Ranges:", xTitleId, Type:=8)
Set DestinationRange = Application.InputBox("Convert to (single cell):", xTitleId, Type:=8)

Dim ArrayCounter As Long
ReDim myArray(1 To SourceRange.Count)
Dim CellToCheck As Range

ArrayCounter = 0

For Each CellToCheck In SourceRange
    If Not CellToCheck.Value = Empty Then
        ArrayCounter = ArrayCounter + 1
        myArray(ArrayCounter) = CellToCheck.Value
    Else '
        'Cell is empty, do nothing
    End If
Next CellToCheck

ReDim Preserve myArray(1 To ArrayCounter)

Set DestinationRange = DestinationRange.Resize(UBound(myArray), 1)
DestinationRange.Value = Application.Transpose(myArray)

End Sub

如果您有Excel 2010+,您可以在2016+中使用Power Query(也称为Get&Transform)

在表中选择一个单元格 2016年,您将导航到数据选项卡;然后选择“从表/范围获取并转换” 在打开的PQ编辑器中: 选择所有列 从“变换”选项卡中,选择“取消填充列” 删除属性列 关闭并加载 M代码:*由PQ生成**

let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Column1", type text}, {"Column2", type text}, {"Column3", type text}, {"Column4", type text}, {"Column5", type text}, {"Column6", type text}, {"Column7", type text}, {"Column8", type text}, {"Column9", type text}}),
    #"Unpivoted Columns" = Table.UnpivotOtherColumns(#"Changed Type", {}, "Attribute", "Value"),
    #"Removed Columns" = Table.RemoveColumns(#"Unpivoted Columns",{"Attribute"})
in
    #"Removed Columns"
结果


如果您有Excel 2010+,您可以在2016+中使用Power Query(也称为Get&Transform)

在表中选择一个单元格 2016年,您将导航到数据选项卡;然后选择“从表/范围获取并转换” 在打开的PQ编辑器中: 选择所有列 从“变换”选项卡中,选择“取消填充列” 删除属性列 关闭并加载 M代码:*由PQ生成**

let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Column1", type text}, {"Column2", type text}, {"Column3", type text}, {"Column4", type text}, {"Column5", type text}, {"Column6", type text}, {"Column7", type text}, {"Column8", type text}, {"Column9", type text}}),
    #"Unpivoted Columns" = Table.UnpivotOtherColumns(#"Changed Type", {}, "Attribute", "Value"),
    #"Removed Columns" = Table.RemoveColumns(#"Unpivoted Columns",{"Attribute"})
in
    #"Removed Columns"
结果

假设:

源范围为活页1中的A1到I17 目的地是第二张 数据是常量 尝试:

注:

使用特殊单元格可避免清空。

假设:

源范围为活页1中的A1到I17 目的地是第二张 数据是常量 尝试:

注:

使用SpecialCells可以避免清空。

如果您在vers中放弃FilterXML功能。2013+您可以通过以下步骤尝试以下方法:

声明源和目标范围请参见第[0]和[1]节 将使用范围内的所有数据分配给1-dim阵列参见[2] 通过FilterXML删除空单元格请参见[3] 将数组写入目标列请参见[4] 如果您在vers中放弃FilterXML功能。2013+您可以通过以下步骤尝试以下方法:

声明源和目标范围请参见第[0]和[1]节 将使用范围内的所有数据分配给1-dim阵列参见[2] 通过FilterXML删除空单元格请参见[3] 将数组写入目标列请参见[4]

为了清楚起见,您想说从RangeA1:C10中获取所有数据并将它们全部放入D列,但忽略任何空白单元格?这些参考文献只是example@SamuelEverson我已经添加了工作表ss我想将数据转置并粘贴到A列为了社区的利益,您应该将解决问题的答案标记为已接受。为了清楚起见,您想说从A1:C10范围中获取所有数据并将其全部放入D列,但忽略任何空白单元格?这些参考文献只是example@SamuelEverson我添加了工作表ss,为了社区的利益,我想将数据转换并粘贴到A列中,您应该将解决问题的答案标记为已接受。thanx寻求帮助,但在转置后将数据粘贴到a列时问题相同我不想粘贴空白单元格,但也会得到空白单元格。我想忽略空白单元格,我还添加了结果截图,我想要@Dy.Leei have excel 2013@RonRosenfeld@LifeStyle如果你愿意,你可以使用我的解决方案。但请在我的问题上发表你的评论,所以我会看到答案。thanx的帮助我得到了两种解决方案的结果@Samuel Eversonand@Ron Rosenfeldthanx的帮助,但在转置后粘贴a列中的数据时问题是一样的。我不想粘贴空白单元格,但也得到了空白单元格。我想忽略空白单元格,我还添加了结果屏幕截图我想要@Dy.Leei有excel 2013@RonRosenfeld@LifeStyle如果你愿意,你可以使用我的解决方案。但是,请在我的问题上发表您的评论,这样我就会看到答案。thanx为了帮助我,我用两种解决方案得到了结果@Samuel Eversonand@Ron Rosenfeld尝试了相同的解决方案,但内部区域相关的尝试的缺点,而不是在目标列中按行显示:-尝试了相同的,但与内部区域相关的重排序,而不是在目标列中按行显示的缺点:-
Sub dural()
    Dim rng As Range, cell As Range, WhereTo As Range
    Dim i As Long, rc As Long, arr

    Set rng = Range("A1:I17").SpecialCells(xlCellTypeConstants)
    rc = rng.Count

    Set WhereTo = Sheets("Sheet2").Range("A1:A" & rc)
    ReDim arr(1 To rc, 1 To 1)

    i = 1
    For Each cell In rng
        arr(i, 1) = cell.Value
        i = i + 1
    Next cell

    WhereTo = arr

End Sub
Sub ListAllTo1Column()
    '[0] set target range to memory and clear existing data
    Dim tgt As Range: Set tgt = Sheet2.Range("A:A")
    tgt = vbNullString    ' clear target column (before declaring source range)

    '[1] set source range to memory
    Dim src As Range: Set src = Sheet1.UsedRange

    '[2] get all data
    ReDim arr(1 To src.Cells.Count)
    Dim cell As Variant, i As Long
    For Each cell In src
        i = i + 1: arr(i) = cell
    Next cell

    '[3] remove empty cells
    arr = WorksheetFunction.FilterXML("<t><s>" & Join(arr, "</s><s>") & "</s></t>", "//s[not(.='')]")

    '[4] write results to target
    'Debug.Print Join(Application.Transpose(arr), ", ")
    tgt.Resize(UBound(arr), 1).Offset(1) = arr
End Sub

Dim tmp: tmp = Split(Evaluate("=TEXTJOIN("","",True,Sheet1!" & Replace(Sheet1.UsedRange.Address, "$", "") & ")"), ",")
' Debug.Print Join(tmp, "|")

tgt.Resize(UBound(tmp), 1).Offset(1) = Application.Transpose(tmp)