我在excel中有一个表,其中有100多列,其中许多列的名称结构为“INFO_COMPLETE_.....”。 这是“TRUE”或“FALSE”(但在西班牙语).我想创建一个新的表从所有这些列透视.原表的结构是这样的:
| ID_元素|名称|描述|INFO_COMPLETE_DATE开始|信息_完成_完成日期|信息_完成_其他|
| --------------|--------------|--------------|--------------|--------------|--------------|
| ID1|名称1|D1|FALSO|贝达德罗|FALSO|
| ID2|名称2|D2|FALSO|FALSO|贝达德罗|
| ID3|名称3|D3|贝达德罗|贝达德罗|贝达德罗|
我要创建的表将具有以下结构
| ID_元素|名称|FIELD|价值|
| --------------|--------------|--------------|--------------|
| ID1|名称1|INFO_COMPLETE_DATE开始|FALSO|
| ID1|名称1|信息_完成_完成日期|贝达德罗|
| ID1|名称1|信息_完成_其他|FALSO|
| ID2|名称2|INFO_COMPLETE_DATE开始|FALSO|
| ID2|名称2|信息_完成_完成日期|FALSO|
| ID2|名称2|信息_完成_其他|贝达德罗|
| ID3|名称3|INFO_COMPLETE_DATE开始|贝达德罗|
| ID3|名称3|信息_完成_完成日期|贝达德罗|
| ID3|名称3|信息_完成_其他|贝达德罗|
我只想保留原始表中的两列,分别是“ID_ELEMENT”和“NAME”。为此,我想使用以下代码,另外只保留“FALSE”值 而且“值”列将不再是必要的。我该如何修改代码,甚至有可能简化它?
Sub PivotColumnsToRows()
' Variables
Dim tblDatos As ListObject
Dim tblNew As ListObject
Dim newTablename As String
Dim i As Long, j As Long, k As Long
Dim ID_ELEMENT As String, nameElement As String, columnElement As String
Dim bValor As Boolean
Dim NewSheet As String
NewSheet = "TABLA_PIVOT" ' Name of the new Sheet
ThisWorkbook.Worksheets.Add().Name = NewSheet ' Create new Sheet
' Name of the new table
newTablename = "DATOS_PIVOT"
' Reference of the original table (name "Tabla4"), Sheetsname "DATOS"
Set tblDatos = ThisWorkbook.Worksheets("DATOS").ListObjects("Tabla4")
' Create new table
Set tblNew = ThisWorkbook.Worksheets(NewSheet).ListObjects.Add(xlSrcRange, Range("A1").CurrentRegion, , xlYes)
tblNew.Name = newTablename
' Add columns to the new table
With tblNew
.ListColumns.Add
.ListColumns.Add
.ListColumns.Add
End With
' Rename columns of the new table
With tblNew
.HeaderRowRange(1) = "ID_ELEMENT"
.HeaderRowRange(2) = "NAME"
.HeaderRowRange(3) = "FIELD"
End With
' Loop for columns of the original table
For i = 1 To tblDatos.ListColumns.Count
' "INFO_COMPLETE_"
If InStr(tblDatos.ListColumns(i).Name, "INFO_COMPLETE_") = 1 Then
' loop for rows
For j = 1 To tblDatos.ListRows.Count
' get ID and name
ID_ELEMENT = tblDatos.DataBodyRange(j, 1)
nameElement = tblDatos.DataBodyRange(j, 2)
' Check the value in the current column
bValor = tblDatos.DataBodyRange(j, i)
' If the value is FALSE, add a row to the new table
If Not bValor Then
' get the name of the actual column
columnElement = tblDatos.ListColumns(i).Name
' Add row to the new table
tblNew.ListRows.Add
k = tblNew.ListRows.Count
' Write values in the new file
With tblNew
.DataBodyRange(k, 1) = ID_ELEMENT
.DataBodyRange(k, 2) = nameElement
.DataBodyRange(k, 3) = columnElement
End With
End If
Next j
End If
Next i
' Style
tblNew.TableStyle = "TableStyleMedium2"
End Sub
2条答案
按热度按时间6pp0gazn1#
你不是在旋转,而是在不旋转。
这是可以使用Power Query轻松完成的事情,在Windows Excel 2010+和Excel 365(Windows或Mac)中提供
使用Power Query
Data => Get&Transform => from Table/Range
或from within sheet
Home => Advanced Editor
Applied Steps
以了解算法数据结果
因此,如果您希望只保留False值,并消除Value列,只需将这些步骤添加到上面的代码中:
过滤并删除列后
idv4meu82#
反透视:只检查布尔值