EXCEL 中sheet1有13列, A列为费用类别,后面12列为1-12月份,会将费用录入费用类型对应的月份;期望把数据转置成3列,第一列为月份,第二列为费用类别,第三列为 具体的费用值,并将输出的结果展示到sheet2中; 利用VBA可以怎么实现?
时间: 2024-12-22 10:21:49 浏览: 17
要在Excel中使用VBA实现这个需求,你需要创建一个新的工作表(Sheet2),并将数据从Sheet1按照指定格式转置。以下是一个简单的VBA宏示例,假设数据开始于Sheet1的A2单元格:
```vba
Sub TransposeData()
Dim wsSource As Worksheet
Set wsSource = ThisWorkbook.Sheets("Sheet1") '源工作表
Dim wsDestination As Worksheet
Set wsDestination = ThisWorkbook.Sheets.Add(After:=wsSource) '目标工作表,插入到Sheet1之后
wsDestination.Name = "Sheet2" '设置新工作表名称
Dim dataStartRow As Long
dataStartRow = 2 '假设费用数据从第二行开始
Dim categoriesRange As Range
Set categoriesRange = wsSource.Range("A" & dataStartRow)
Dim monthsRange As Range
Dim categoryValues() As Variant
Dim newRow As Long
newRow = 1 '新行的初始位置
'遍历费用类别并将对应月份的数据复制到新的3列结构
For Each cell In categoriesRange
Dim monthColumn As Long
For monthColumn = 2 To 13 '假设费用类别是从B列开始的
If cell.Value <> "" And wsSource.Cells(dataStartRow, monthColumn).Value <> "" Then
categoryValues(newRow) = wsSource.Cells(dataStartRow, monthColumn).Value
Else
Exit For '跳出循环,如果当前类别或月份数字为空,则停止填充
End If
Next monthColumn
'将数据写入新工作表
wsDestination.Cells(rowIndex:=newRow, columnIndex:=1).Value = rowMonthColumn + 1 '月份(从1开始)
wsDestination.Cells(rowIndex:=newRow, columnIndex:=2).Value = cell.Value '费用类别
wsDestination.Cells(rowIndex:=newRow, columnIndex:=3).Value = categoryValues(newRow) '费用值
newRow = newRow + 1
Next cell
End Sub
```
运行这个宏后,Sheet2将会按照要求的格式显示数据。记得保存并关闭Sheet1,以便不会干扰到原始数据。
阅读全文