Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel将列转换为新行_Excel_Vba - Fatal编程技术网

Excel将列转换为新行

Excel将列转换为新行,excel,vba,Excel,Vba,我有一张这样的桌子: | A | B | C | D | +-------+------------+------------+------------+ 1 | Name | Language 1 | Language 2 | Language 3 | +=======+============+============+============+ 2 | John | English | Chinese

我有一张这样的桌子:

  |   A   |     B      |     C      |     D      |
  +-------+------------+------------+------------+
1 | Name  | Language 1 | Language 2 | Language 3 |
  +=======+============+============+============+
2 | John  | English    | Chinese    | Spanish    | 
3 | Wendy | Chinese    | French     | English    | 
4 | Peter | Spanish    | Chinese    | English    |
   |   A   |    B     | 
   +-------+----------+
 1 | Name  | Language |
   +=======+==========+
 2 | John  | English  |
 3 | John  | Chinese  |
 4 | John  | Spanish  |
 5 | Wendy | Chinese  |
 6 | Wendy | French   |
 7 | Wendy | English  |
 8 | Peter | Spanish  |
 9 | Peter | Chinese  |
10 | Peter | English  |
我想生成一个只有一个语言列的表。其他两个语言列应成为新行,如下所示:

  |   A   |     B      |     C      |     D      |
  +-------+------------+------------+------------+
1 | Name  | Language 1 | Language 2 | Language 3 |
  +=======+============+============+============+
2 | John  | English    | Chinese    | Spanish    | 
3 | Wendy | Chinese    | French     | English    | 
4 | Peter | Spanish    | Chinese    | English    |
   |   A   |    B     | 
   +-------+----------+
 1 | Name  | Language |
   +=======+==========+
 2 | John  | English  |
 3 | John  | Chinese  |
 4 | John  | Spanish  |
 5 | Wendy | Chinese  |
 6 | Wendy | French   |
 7 | Wendy | English  |
 8 | Peter | Spanish  |
 9 | Peter | Chinese  |
10 | Peter | English  |
我知道这可能需要一个宏或其他东西。如果有人给我指出正确的方向,我将不胜感激。我不太熟悉VBA或Excel对象模型

杂乱无章,但应该有效:

For Each namething In Range("A1", Range("A1").End(xlDown))
    Range("A1").End(xlDown).Offset(1, 0) = namething.Value
    Range("A1").End(xlDown).Offset(0, 1) = namething.Offset(0, 2)
    Range("A1").End(xlDown).Offset(1, 0) = namething.Value
    Range("A1").End(xlDown).Offset(0, 1) = namething.Offset(0, 3)
    namething.Offset(0, 2) = ""
    namething.Offset(0, 3) = ""
Next

然后只需排序

以下公式就可以了。sheet2中的数据将始终反映sheet1中的数据,因此不必重新运行宏来创建新列表

也就是说,使用宏生成它可能是一个更好的选择,因为如果您以后需要添加第四语言或其他语言,它将允许更大的灵活性

第二张!A2

=间接(“Sheet1!A”&ABS(INT((ROW()+1)/3))+1)

第二张!B2

=间接(“Sheet1!”&IF(ABS(INT((ROW()+1)/3)-(ROW()+1)/3)=0,“B”,IF(ABS(INT((ROW()+1)/3)-(ROW()+1)/3)=(1/3),“C”,“D”)和ABS(INT((ROW()+1)/3))+1)


在A1和B1中添加列标题,然后将公式自动填充到工作表中。

这样就可以了。它也是动态的,支持任意多个语言列,每个人可以使用任意多个语言。 假设数据按照以下示例格式化:

Sub ShrinkTable()
    Dim maxRows As Double
    Dim maxCols As Integer
    Dim data As Variant
    maxRows = Cells(1, 1).End(xlDown).row
    maxCols = Cells(1, 1).End(xlToRight).Column

    data = Range(Cells(1, 1), Cells(maxRows, maxCols))

    Dim newSht As Worksheet
    Set newSht = Sheets.Add

    With newSht

        .Cells(1, 1).Value = "Name"
        .Cells(1, 2).Value = "Column"

        Dim writeRow As Double
        writeRow = 2

        Dim row As Double
        row = 2
        Dim col As Integer

        Do While True

            col = 2
            Do While True
                If data(row, col) = "" Then Exit Do 'Skip Blanks

                'Name
                .Cells(writeRow, 1).Value = data(row, 1)

                'Language
                .Cells(writeRow, 2).Value = data(row, col)

                writeRow = writeRow + 1
                If col = maxCols Then Exit Do 'Exit clause
                col = col + 1
            Loop

            If row = maxRows Then Exit Do 'exit cluase
            row = row + 1
        Loop

    End With
End Sub

+我从来不知道End.Row和End.Column。您只需在
With newSht
命令下添加
.Name=“Master”
,即可完全满足OP的问题。根据建议进行更改。很抱歉,我对错误的问题发表了评论。新的“主”表从来不是OP的要求。我只是这么想,因为你把数据转移到了一个新的表上,我相信他希望它在适当的地方完成。对不起,弄错了,没关系。我在一张新的表格中做了这件事,因为它更容易重新检查并确保没有数据丢失。一旦他有了他想要的格式,他就可以把它复制到任何他想要的地方。一张新的表格就好了,伙计们!非常感谢你的投入。我现在只是在尝试。我很快就回来报到。