excel - 单个 Excel 工作表到多个工作表,基于特定的列值
问题描述
我有以下问题:
我有一个类型的电子表格:
Field1 Field2 Field3 Field4
NameA AddressA KeyA ValueA
NameB AddressB KeyA ValueB
NameD AddressD KeyA ValueD
NameE AddressE KeyB ValueE
NameC AddressC KeyB ValueC
NameF AddressF KeyC ValueF
.... (200k entries)
我想阅读工作表,并创建许多单独的 excel 工作簿,其中只有一个工作表,每个工作表包含即:
Workbook1/Sheet1: (Workbookname ie KeyA.xlsx)
Field1 Field2 Field3 Field4
NameA AddressA KeyA ValueA
NameB AddressB KeyA ValueB
NameD AddressD KeyA ValueD
Workbook2/Sheet1: (Workbookname ie KeyB.xlsx)
Field1 Field2 Field3 Field4
NameC AddressC KeyB ValueC
NameE AddressE KeyB ValueE
Workbook3/Sheet1: (Workbookname ie KeyC.xlsx)
Field1 Field2 Field3 Field4
NameF AddressF KeyC ValueF
第一行必须存在于所有生成的工作簿中。他们对 Field3 值进行了排序,这是我在 c 中的逻辑:
main(excel_file)
{
open(excel_file, r)
header = read(excel_file)
first_line = true
while not eof(excel_file)
{
line_cur = read(excel_file)
if first_line
{
office = get_office(line_cur)
office_file = open(name=office, w)
write(office_file, header)
write(office_file, line_cur)
line_prv = line_cur
first_line = false
continue
}
office_cur = get_office(line_cur)
office_prv = get_office(line_prv)
// If same group.
if office_cur = office_prv
{
write(office_file, line_cur)
line_prv = line_cur
continue
}
// If different group.
if office_cur != office_prv
{
close(office_file)
office_file = open(name=office_cur, w)
write(office_file, header)
write(office_file, line_cur)
line_prv = line_cur
continue
}
} // while end.
close(office_file)
close(excel_file)
}
你们能帮我弄清楚如何在VBA中实现这个逻辑吗?零经验。先感谢您。
解决方案
根据您的示例数据(使用ActiveSheet
),这会在当前路径中生成 3 个文件
KeyA.xlsx
KeyB.xlsx
KeyC.xlsx
Option Explicit
Public Sub GenerateKeyFiles()
Const K_COL = "C"
Dim ws As Worksheet: Set ws = ActiveSheet
Dim ur As Range: Set ur = ws.UsedRange
Dim ck As Range: Set ck = ur.Columns(K_COL)
Dim arr As Variant: arr = ck.Offset(1)
Dim d As Object: Set d = CreateObject("Scripting.Dictionary")
Dim itm As Variant, i As Long, wbp As String
For Each itm In arr
If Len(itm) > 0 Then d(itm) = 0
Next
Dim wbX As Workbook: Set wbX = Workbooks.Add
Dim wsX As Worksheet: Set wsX = wbX.Worksheets(1): wbp = ThisWorkbook.Path & "\"
Application.ScreenUpdating = False: Application.DisplayAlerts = False
For i = 2 To wbX.Worksheets.Count
wbX.Worksheets(i).Delete
Next
If ws.AutoFilterMode Then ur.AutoFilter
For Each itm In d
ck.AutoFilter Field:=1, Criteria1:=itm
ur.Copy
wsX.Cells(1).PasteSpecial xlPasteColumnWidths
wsX.Cells(1).PasteSpecial xlPasteAll: wsX.Cells(1).Select
wsX.SaveAs wbp & itm, Excel.XlFileFormat.xlOpenXMLWorkbook
wsX.UsedRange.Clear
Next
wbX.Close SaveChanges:=False: ur.AutoFilter
Application.DisplayAlerts = True: Application.ScreenUpdating = True
End Sub
Main.xlsm
KeyA.xlsx
KeyB.xlsx
KeyC.xlsx
推荐阅读
- .htaccess - 通过 301 重定向将 HTTP 更改为 HTTPS 的正确方法?它会伤害我的SEO吗?
- python - 回文字符串分解的代码效率 + 时间成本说明
- angular6 - 无法使用 ngModel 更新 mdc 对话框中的值
- javascript - 使用 PHP 创建 Javascript 数组时未定义
- python - Python str is not callable error with date
- jdbc - Kafka JDBC-Sink 连接器未按预期工作
- php - 如何在php中将单个数组值转换为多个?
- python - 无法启动 Tensorboard(请求错误)
- swift - 检测闭包内的对象(在 Linux Swift 中)
- javascript - SweetAlerts Ajax 与 PHP