excel表格按城市快速归类并生成新表教程
在excel中处理包含大量地名的原始表格时,如果需要将特定城市(如厦门)的所有行提取并独立成表,最快捷的手段是使用VBA自动拆分。这种操作能避免手动筛选、复制、粘贴的低效率工作,尤其适合处理数百条甚至上万条数据的场景。

通过执行脚本,系统会自动识别H列(或其他指定列)的地名,为每个城市创建一个独立的工作表并同步表头。
一、准备与脚本导入
首先需要保证原始表格有明确的标题行(如:序号、名称、地点等),随后通过开发者工具注入拆分逻辑。
打开编辑器:在excel界面按 Alt + F11 进入VBA编辑界面。

插入模块:点击菜单栏的“插入”,选择“模块”。

粘贴代码:在空白代码框中粘贴以下脚本
Sub SplitDataByLocation()
Dim wsSource As Worksheet, wsDest As Worksheet
Dim dict As Object, lastRow As Long, cell As Range, key As Variant
Set wsSource = ThisWorkbook.Worksheets("Sheet1") '改为你原表的名字
Set dict = CreateObject("Scripting.Dictionary")
Application.ScreenUpdating = False
lastRow = wsSource.Cells(wsSource.Rows.Count, "H").End(xlUp).Row '假设地名在H列
For Each cell In wsSource.Range("H2:H" & lastRow)
If Not dict.Exists(cell.Value) And cell.Value <> "" Then dict.Add cell.Value, Nothing
Next cell
For Each key In dict.keys
On Error Resume Next
Set wsDest = ThisWorkbook.Worksheets(CStr(key))
On Error GoTo 0
If wsDest Is Nothing Then
Set wsDest = ThisWorkbook.Worksheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
wsDest.Name = CStr(key)
Else
wsDest.Cells.Clear
End If
wsSource.Range("A1:H1").Copy wsDest.Range("A1") '复制标题
wsSource.Range("A1:H" & lastRow).AutoFilter Field:=8, Criteria1:=key
wsSource.Range("A2:H" & lastRow).SpecialCells(xlCellTypeVisible).Copy wsDest.Range("A2")
wsSource.AutoFilterMode = False
Set wsDest = Nothing
Next key
Application.ScreenUpdating = True
MsgBox "归类完成!"
End Sub
二、执行拆分与参数微调
代码粘贴完成后,需要返回excel工作表界面执行宏任务。
运行宏:按 Alt + F8,在弹出的对话框中选择 SplitDataByLocation 并点击运行。

检查结果:你会发现原本混杂在一起的厦门、江门、番禺等数据,已经分别生成了独立的Sheet标签。

三、关键参数配置说明
如果你的表格结构和示例不同,请根据实际情况修改代码中的对应项:
wsSource:将 "Sheet1" 改为你存放原始数据的工作表实际名称。
H列(第8列):代码中的 Field:=8 代表地名在第8列,如果地名在A列,改为 Field:=1。
标题范围:Range("A1:H1") 决定了复制哪些标题,如果你的表格列数更多,请扩大此范围。
如果你只是偶尔需要看某个城市的数据,使用excel自带的“筛选”功能或者“切片器”是最快的。但如果你需要将不同城市的数据分别发给不同的人,使用上面的脚本生成独立表格是这个场景下效率最高的方案。需要注意,VBA无法撤销操作,在运行前请务必对这个文件进行备份。






