如何用vba把第一页的表转换成第二页的表格式
时间: 2024-12-11 14:38:17 浏览: 15
要使用 VBA 将第一张表格转换为第二张表格的格式,可以编写一个宏来完成这个任务。以下是一个示例代码,假设原始数据在工作表 "Sheet1" 中,并且希望将结果输出到 "Sheet2" 中:
```vba
Sub ConvertTable()
Dim wsSource As Worksheet
Dim wsTarget As Worksheet
Dim lastRow As Long
Dim i As Long, j As Long
Dim dict As Object
Dim roadName As String
Dim pipeSizes As String
Dim materials As String
' 设置源和目标工作表
Set wsSource = ThisWorkbook.Sheets("Sheet1")
Set wsTarget = ThisWorkbook.Sheets("Sheet2")
' 清空目标工作表
wsTarget.Cells.Clear
' 获取源工作表的最后一行
lastRow = wsSource.Cells(wsSource.Rows.Count, 1).End(xlUp).Row
' 创建字典对象
Set dict = CreateObject("Scripting.Dictionary")
' 遍历源工作表中的每一行
For i = 2 To lastRow
roadName = wsSource.Cells(i, 1).Value
If Not dict.exists(roadName) Then
dict.Add roadName, New Collection
End If
' 添加管径和材质
With dict(roadName)
.Add wsSource.Cells(i, 2).Value & "," & wsSource.Cells(i, 3).Value
End With
Next i
' 写入目标工作表
wsTarget.Cells(1, 1).Value = "建设位置"
wsTarget.Cells(1, 2).Value = "管径范围"
wsTarget.Cells(1, 3).Value = "管材"
j = 2
For Each roadName In dict.keys
pipeSizes = ""
materials = ""
' 合并管径和材质
For Each item In dict(roadName)
pipeSize = Split(item, ",")(0)
material = Split(item, ",")(1)
If InStr(pipeSizes, pipeSize) = 0 Then
If pipeSizes <> "" Then pipeSizes = pipeSizes & "、"
pipeSizes = pipeSizes & pipeSize
End If
If InStr(materials, material) = 0 Then
If materials <> "" Then materials = materials & "、"
materials = materials & material
End If
Next item
' 写入目标工作表
wsTarget.Cells(j, 1).Value = roadName
wsTarget.Cells(j, 2).Value = pipeSizes
wsTarget.Cells(j, 3).Value = materials
j = j + 1
Next roadName
' 清理
Set dict = Nothing
MsgBox "转换完成!"
End Sub
```
### 说明:
1. **设置源和目标工作表**:假设原始数据在 `Sheet1` 中,结果将输出到 `Sheet2` 中。
2. **清空目标工作表**:确保目标工作表没有旧的数据。
3. **获取最后一行**:确定源工作表中数据的最后一行。
4. **创建字典对象**:用于存储每个道路名称及其对应的管径和材质。
5. **遍历源工作表中的每一行**:将每行的数据添加到字典中。
6. **写入目标工作表**:将合并后的数据写入目标工作表。
7. **清理**:释放字典对象并提示转换完成。
你可以将上述代码粘贴到 Excel 的 VBA 编辑器中(按 `Alt + F11` 打开),然后运行 `ConvertTable` 宏来完成转换。
阅读全文