ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 1498|回复: 12

求大神,按目录生成工作表

[复制链接]

TA的精华主题

TA的得分主题

发表于 2022-12-4 09:13 | 显示全部楼层 |阅读模式
求助大神,按项目ID生成工作表,并超链接。和在基础数据表中按项目ID获取数据放到对应工作表中。

基础数据表数据有90万多行,数据多,朋友介绍来EH论坛请教帮忙下,非常感谢。

示例.zip

14.05 KB, 下载次数: 13

TA的精华主题

TA的得分主题

发表于 2022-12-4 09:18 | 显示全部楼层
VBA遍历一遍B列,逐个生成就是

TA的精华主题

TA的得分主题

发表于 2022-12-4 09:24 来自手机 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
帮你转到vba版块,函数公式不适合

TA的精华主题

TA的得分主题

发表于 2022-12-4 09:24 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 Yalishanda30 于 2022-12-4 09:46 编辑

90万行生成超链接速度快不了
只做了拆分,超链接没加,第三项看不懂

示例.zip

37.41 KB, 下载次数: 4

TA的精华主题

TA的得分主题

发表于 2022-12-4 11:45 | 显示全部楼层
1、单单是基础数据表就有90万行数据,如果在拆分为多个工作表在一个文件内,文件就会非常大,估计打开都成问题了,更不用说在做其他的了,
2、加入你拆分为10个工作表,10*90万=9百万行数据,这根本就不是excel能够做的事情了,
3、所以,建议;拆分为多个工作簿文件,
4、在目录中双击B列ID项目,自动打开相应工作簿文件,似乎可行一点吧
5、至于汇总也可以代码遍历所有文件来汇总的,

TA的精华主题

TA的得分主题

发表于 2022-12-4 11:46 | 显示全部楼层
Sub 拆分为工作表()
Application.ScreenUpdating = False
Dim ar As Variant, arr As Variant
Dim i As Long, rs As Long
Dim brr()
Dim rng As Range
With Worksheets("目录")
    r = .Cells(Rows.Count, 2).End(xlUp).Row
    arr = .Range("b1:b" & r)
End With
With Worksheets("基础数据")
    rs = .Cells(Rows.Count, 2).End(xlUp).Row
    ar = .Range("a4:t" & rs)
    Set rng = .Range("a4:t4")
End With
Application.DisplayAlerts = False
For Each sh In Sheets
    If sh.Index > 3 Then
        sh.Delete
    End If
Next sh
Application.DisplayAlerts = True
For i = 2 To UBound(arr)
    n = 0
    ReDim brr(1 To UBound(ar), 1 To UBound(ar, 2))
    If Trim(arr(i, 1)) <> "" Then
        For s = 2 To UBound(ar)
            If Trim(ar(s, 14)) = Trim(arr(i, 1)) Then
                n = n + 1
                For j = 1 To UBound(ar, 2)
                    brr(n, j) = ar(s, j)
                Next j
            End If
        Next s
        If n > 0 Then
            Set sht = Worksheets.Add(after:=Sheets(Sheets.Count))
            With ActiveSheet
                .Name = arr(i, 1)
                rng.Copy .[a1]
                .[a2].Resize(n, UBound(brr, 2)) = brr
                .[a2].Resize(n, UBound(brr, 2)).Borders.LineStyle = 1
                .Columns("a:t").AutoFit
            End With
        End If
    End If
Next i
Application.ScreenUpdating = True
MsgBox "ok!"
End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2022-12-4 11:47 | 显示全部楼层
目前是拆分为工作表,供参考
示例.rar (34.95 KB, 下载次数: 12)

TA的精华主题

TA的得分主题

发表于 2022-12-4 17:10 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
  1. Sub test1() '个人理解,完成1、2 ; 第3汇总不参与。
  2.   Dim vData, vResult(), Dict As Object, Sht As Worksheet
  3.   Dim i As Long, j As Long, posRow As Long, s As String
  4.   Dim titleRow As Long, splitCol As Long
  5.   titleRow = 4   '标题所在 行
  6.   splitCol = 14  '拆分依据 列
  7.   
  8.   DoApp False
  9.   
  10.   For Each Sht In Worksheets
  11.     If Sht.Index > 3 Then Sht.Delete
  12.   Next
  13.   
  14.   Set Sht = Worksheets("目录")
  15.   Sht.Range("A1").CurrentRegion.Columns(1).Resize(, 2).Offset(1).Clear
  16.   
  17.   Set Dict = CreateObject("Scripting.Dictionary")
  18.   
  19.   With Worksheets("基础数据")
  20.     vData = .Range("A1", .Range("A4").CurrentRegion)
  21.   End With
  22.   
  23.   ReDim vTemp(1 To UBound(vData), 1 To UBound(vData, 2)) ' As String
  24.   For j = 1 To UBound(vData, 2)
  25.     For i = 1 To titleRow
  26.       vTemp(i, j) = vData(i, j)
  27.     Next
  28.   Next
  29.   For i = titleRow + 1 To UBound(vData)
  30.     If Not Dict.Exists(vData(i, splitCol)) Then Dict(vData(i, splitCol)) = Dict.Count + 1
  31.   Next
  32.   ReDim vResult(1 To Dict.Count, 1 To 2)
  33.   For i = 1 To Dict.Count
  34.     vResult(i, 1) = titleRow
  35.     vResult(i, 2) = vTemp
  36.   Next
  37.   For i = titleRow + 1 To UBound(vData)
  38.     posRow = Dict(vData(i, splitCol))
  39.     vResult(posRow, 1) = vResult(posRow, 1) + 1
  40.     For j = 1 To UBound(vData, 2)
  41.       vResult(posRow, 2)(vResult(posRow, 1), j) = vData(i, j)
  42.     Next
  43.   Next
  44.   For i = 1 To Dict.Count
  45.     s = vResult(i, 2)(titleRow + 1, splitCol)
  46.     With Worksheets.Add(After:=Worksheets(Worksheets.Count))
  47.       .Name = s
  48.       .Range("A1").Resize(vResult(i, 1), UBound(vData, 2)) = vResult(i, 2)
  49.       .Hyperlinks.Add .Cells(1, 1), "", "'" & Sht.Name & "'!A1", "单击返回目录", "返回目录"
  50.     End With
  51.     With Sht
  52.       .Cells(i + 1, 1) = i
  53.       .Hyperlinks.Add .Cells(i + 1, 2), "", "'" & s & "'!A1", "单击可跳转到该工作表", s
  54.     End With
  55.   Next
  56.   Sht.Activate
  57.   Set Sht = Nothing
  58.   Set Dict = Nothing
  59.   DoApp
  60.   Beep
  61. End Sub

  62. Function DoApp(Optional b As Boolean = True)
  63.   With Application
  64.     .ScreenUpdating = b
  65.     .DisplayAlerts = b
  66.     .Calculation = -b * 30 - 4135
  67.   End With
  68. End Function
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-12-4 19:48 | 显示全部楼层
3190496160 发表于 2022-12-4 11:47
目前是拆分为工作表,供参考

好的,谢谢。才有空来看,没想到这么多人回复。特别感谢大家。

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-12-4 19:50 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-20 14:23 , Processed in 0.039494 second(s), 16 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表