ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 不规则表的数据提取问题

[复制链接]

TA的精华主题

TA的得分主题

发表于 2020-2-12 10:14 | 显示全部楼层 |阅读模式
本帖最后由 心电感应 于 2020-2-12 10:44 编辑

职工的健康卡是不规则,总数有几百个表,要转换为一维表进行汇总统计。复制粘贴是万能的,但肯定万万不能。
本人是个vba小白,求大神出手。需要的结果是“健康卡汇总表”样式,并且想要以后如果表结构改变了,可以简单修改一下提取数据的单元格位置(这个我会干)就能搞定,,万能的vba代码。这个像是有些贪得无厌吧。谢谢。

不规则表转换一维表.zip

91.04 KB, 下载次数: 11

TA的精华主题

TA的得分主题

发表于 2020-2-12 11:29 | 显示全部楼层
  1. Sub test()
  2.   Dim r%, i%
  3.   Dim arr, brr(1 To 1000, 1 To 49)
  4.   Dim wb As Workbook
  5.   Dim ws As Worksheet
  6.   Dim mypath$, myname$
  7.   Application.ScreenUpdating = False
  8.   Application.DisplayAlerts = False
  9.   vs = [{2,2;2,4;2,6;2,8;3,2;3,5;4,3;5,3;5,7;6,3}]
  10.   mypath = ThisWorkbook.Path & ""
  11.   myname = Dir(mypath & "*.xlsx")
  12.   Do While myname <> ""
  13.     If myname <> ThisWorkbook.Name Then
  14.       Set wb = GetObject(mypath & myname)
  15.       With wb
  16.         With .Worksheets("sheet1")
  17.           arr = .Range("a1:h18")
  18.           m = m + 1
  19.           For k = 1 To UBound(vs)
  20.             brr(m, k) = arr(vs(k, 1), vs(k, 2))
  21.           Next
  22.           n = 11
  23.           For i = 10 To UBound(arr)
  24.             If Len(arr(i, 1)) <> 0 Then
  25.               brr(m, n) = arr(i, 1)
  26.               brr(m, n + 1) = arr(i, 2)
  27.               brr(m, n + 2) = arr(i, 3)
  28.               brr(m, n + 3) = arr(i, 4)
  29.               brr(m, n + 4) = arr(i, 6)
  30.               brr(m, n + 5) = arr(i, 7)
  31.               brr(m, n + 6) = arr(i, 8)
  32.               n = n + 7
  33.             End If
  34.           Next
  35.         End With
  36.         .Close False
  37.       End With
  38.     End If
  39.     myname = Dir
  40.   Loop
  41.   With Worksheets("sheet1")
  42.     .UsedRange.Offset(1, 0).Clear
  43.     .Columns(8).NumberFormatLocal = "@"
  44.     .Range("a2").Resize(m, UBound(brr, 2)) = brr
  45.   End With
  46.   Application.ScreenUpdating = True
  47.   MsgBox "数据提取完毕!"
  48.         
  49. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2020-2-12 11:29 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2020-2-12 12:21 | 显示全部楼层
完成了部分汇总,其他楼主可以参考补充
另外汇总表里的后面部分有空列,已经删除。
供参考

不规则表转换一维表.zip

103.24 KB, 下载次数: 7

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2020-2-12 12:25 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-2-12 15:00 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
谢谢。。。。。。。。。。。

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-2-12 15:02 | 显示全部楼层
liulang0808 发表于 2020-2-12 12:21
完成了部分汇总,其他楼主可以参考补充
另外汇总表里的后面部分有空列,已经删除。
供参考

我只会这个,,补充了一下,好像可以用了,谢谢。。。
Sub 按钮1_Click()
    Set fso = CreateObject("Scripting.FileSystemObject")
    brr = Array(1, 2, 3, 4, 6, 7, 8)
    Application.ScreenUpdating = False
    Set sh = ActiveSheet
    sh.UsedRange.Offset(1).ClearContents
    r = 2
        For Each f In fso.getfolder(ThisWorkbook.Path).Files
        If InStr(f.Name, "健康卡汇总表") = 0 Then
            With Workbooks.Open(f)
            
                sh.Cells(r, 1) = .Sheets(1).[b2]
                sh.Cells(r, 2) = .Sheets(1).[d2]
                sh.Cells(r, 3) = .Sheets(1).[f2]
                sh.Cells(r, 4) = .Sheets(1).[h2]
                sh.Cells(r, 5) = .Sheets(1).[b3]
                sh.Cells(r, 6) = .Sheets(1).[e3]
                sh.Cells(r, 7) = .Sheets(1).[c4]
                sh.Cells(r, 8) = .Sheets(1).[c5]
                sh.Cells(r, 9) = .Sheets(1).[c6]
                sh.Cells(r, 10) = .Sheets(1).[b10]
                       
                c = 11
                For j = 10 To .Sheets(1).Cells(Rows.Count, 1).End(3).Row
                    For Each i In brr
                        sh.Cells(r, c) = .Sheets(1).Cells(j, i)
                        c = c + 1
                    Next
                Next j
                .Close False
            End With
            r = r + 1
        End If
    Next f
    Application.ScreenUpdating = True
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-2-12 15:45 | 显示全部楼层
liulang0808 发表于 2020-2-12 12:21
完成了部分汇总,其他楼主可以参考补充
另外汇总表里的后面部分有空列,已经删除。
供参考

我完善了下,能用了。谢谢。。
Sub 按钮1_Click()     '表头先单独单独设置好
    Set fso = CreateObject("Scripting.FileSystemObject")
    brr = Array(1, 2, 3, 4, 6, 7, 8)
    Application.ScreenUpdating = False
    Set sh = ActiveSheet
    sh.UsedRange.Offset(1).ClearContents
    r = 2
        For Each f In fso.getfolder(ThisWorkbook.Path).Files
        If InStr(f.Name, "健康卡汇总表") = 0 Then
            With Workbooks.Open(f)                 '修改,不同表修改数据提取单元格位置
                sh.Cells(r, 1) = .Sheets(1).[b2]   '等号前为汇总表字段列号,等号后是不规则表单元格代码,姓名
                sh.Cells(r, 2) = .Sheets(1).[d2]   '性别
                sh.Cells(r, 3) = .Sheets(1).[f2]   '年龄
                sh.Cells(r, 4) = .Sheets(1).[h2]   '民族
                sh.Cells(r, 5) = .Sheets(1).[b3]   '出生日期
                sh.Cells(r, 6) = .Sheets(1).[e3]    '家庭住址
                sh.Cells(r, 7) = .Sheets(1).[c4]    '工作单位
                sh.Cells(r, 8) = .Sheets(1).[c5]    '身份证
                sh.Cells(r, 9) = .Sheets(1).[g5]    '联系电话
                sh.Cells(r, 10) = .Sheets(1).[c6]     '离昌情况
                sh.Cells(r, 11) = .Sheets(1).[c7]    '健康状况
                       
                c = 11
                For j = 10 To .Sheets(1).Cells(Rows.Count, 1).End(3).Row
                    For Each i In brr
                        sh.Cells(r, c) = .Sheets(1).Cells(j, i)
                        c = c + 1
                    Next
                Next j
                .Close False
            End With
            r = r + 1
        End If
    Next f
    Application.ScreenUpdating = True
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-2-12 15:46 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

谢谢大神。。。。。。。。。。。。

TA的精华主题

TA的得分主题

发表于 2020-2-12 18:13 | 显示全部楼层
真是不规则,连结果表都不规则,搞几个无用空列,空列已删除
  1. Sub 不规则汇总()
  2.     Dim i, arr, n, mypath, k, brr(), m, crr, j, l
  3.     Dim wbk As Workbook
  4.     Dim rng As Range
  5.     Dim fd, f, fs
  6.     Application.ScreenUpdating = False
  7.     Set fs = CreateObject("scripting.filesystemobject")
  8.     With Sheet1
  9.         n = .Cells(Rows.Count, 1).End(xlUp).Row
  10.         arr = .Range("A1:AW1")
  11.     End With
  12.     mypath = ThisWorkbook.Path & ""
  13.     Set fd = fs.getfolder(mypath)
  14.     For Each f In fd.Files
  15.         If f.Name <> ThisWorkbook.Name And Not f.Name Like "~$*" Then
  16.             With Workbooks.Open(mypath & f.Name)
  17.                 k = k + 1
  18.                 ReDim Preserve brr(1 To UBound(arr, 2), 1 To k)
  19.                 For i = 1 To Range("J1").Column
  20.                     Set rng = .Sheets(1).Range("A2:H7").Find(arr(1, i), lookat:=xlWhole)
  21.                     brr(i, k) = rng.Offset(0, 1)
  22.                 Next
  23.                 m = .Sheets(1).Cells(Rows.Count, 1).End(xlUp).Row
  24.                 crr = .Sheets(1).Range("A9:h" & m)
  25.                 l = Range("J1").Column
  26.                 For i = 2 To UBound(crr)
  27.                     For j = 1 To UBound(crr, 2)
  28.                         If j <> 5 Then
  29.                             l = l + 1
  30.                             brr(l, k) = crr(i, j)
  31.                         End If
  32.                     Next
  33.                 Next
  34.                 .Close False
  35.             End With
  36.         End If
  37.     Next
  38.     ReDim drr(1 To UBound(brr, 2), 1 To UBound(brr))
  39.     For i = 1 To UBound(drr)
  40.         For j = 1 To UBound(drr, 2)
  41.             drr(i, j) = brr(j, i)
  42.         Next
  43.     Next
  44.     Sheet1.Cells(2, 1).Resize(UBound(drr), UBound(drr, 2)).ClearContents
  45.     Sheet1.Cells(2, 1).Resize(UBound(drr), UBound(drr, 2)) = drr
  46.     Application.ScreenUpdating = True
  47. End Sub
复制代码

不规则表转换一维表.zip

102.21 KB, 下载次数: 8

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-4-27 10:39 , Processed in 0.050803 second(s), 18 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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