Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 2559|回复: 3

[VBA] [原创]获取表格标题行数的自定义函数

[复制链接]
发表于 2017-12-29 15:19 | 显示全部楼层 |阅读模式
本帖最后由 hhzjxss 于 2017-12-29 15:31 编辑

最近对工作表、工作簿汇总与拆分产生了兴趣,进行了一段时间的研究,发现表格的标题行的行数,都是要通过程序默认设定,或者是通过选取获得。

我一直在思考这个问题,如果能够通过程序自动获取表格标题行的行数呢?

这样可以手工选择的麻烦,但一直没得要领。

思来想去,产生了一种思路:

1、从第一行往下依次提取单元格的内容,判断是否含有“小计”、“合计”、“总计”等字样,如果有,则认为其上一行就是标题行的最后一行;如果没有,则进行下一层判断;

2、从第一行第一列的内容与第二行第一列的内容进行对比,判断单元格内容的数据类型是否一致,如果一致,说明已经是表格的内容,则其上一行就是标题行的最后一行。
动画:



  1. Function 提取标题行数(Sht As Worksheet)
  2.     Dim i%, colm%, rowm%, j%, btrow%
  3.     Dim str1, str2

  4.     On Error Resume Next

  5.     rowm = Application.Min(ActiveSheet.UsedRange.Rows.Count, Range("A1").CurrentRegion.Rows.Count)
  6.     colm = ActiveSheet.UsedRange.Columns.Count

  7.     For i = 1 To rowm
  8.         k = 0
  9.         For j = 1 To colm
  10.             str1 = Cells(i, j).Value
  11.             str2 = Cells(i + 1, j).Value
  12.             ''如果有“小计”、"合计"、“总计”说明是表格内容行一行,则上一行为标题行
  13.             If str1 Like "*小*计*" Or str1 Like "*合*计*" Or str1 Like "*总*计*" Then
  14.                 提取标题行数 = i - 1
  15.                 Exit Function
  16.             Else
  17.                 ''判断上、下两行对应单元格的数据是否都是相同的类型,相同则说明是正文,则上一行就是标题的最后一行
  18.                 If TypeName(str1) = TypeName(str2) Then
  19.                     k = k + 1
  20.                 End If
  21.                 If k = colm Then
  22.                     提取标题行数 = i - 1
  23.                     Exit Function
  24.                 End If
  25.             End If
  26.         Next j
  27.     Next i
  28. End Function
复制代码


代码测试:

  1. Sub AAA()
  2.     MsgBox "标题有" & 提取标题行数(ActiveSheet) & "行。"
  3. End Sub
复制代码








附件下载:




但代码如果一下BUG,当表格内容有空格时,造成上、下两行的单元格数据类型不同,就会使程序会继续往下循环判断,以致于获取的标题行比实际的标题行要大几行,这个问题我还没有想到好的方法解决,大家如果有好的思路,欢迎完善代码,谢谢!





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
 楼主| 发表于 2018-1-2 09:13 | 显示全部楼层
2018年上班头一天啦,我到论坛转一圈呀!
回复

使用道具 举报

 楼主| 发表于 2018-1-4 09:48 | 显示全部楼层
小修改了了下,增加了对“序号”、"编号"、“姓名”、“性别”等的识别。


  1. Function 提取标题行数(Sht As Worksheet)
  2.     Dim i%, colm%, rowm%, j%, btrow%
  3.     Dim str1, str2

  4.     On Error Resume Next

  5.     rowm = Application.Min(ActiveSheet.UsedRange.Rows.Count, Range("A1").CurrentRegion.Rows.Count)
  6.     colm = ActiveSheet.UsedRange.Columns.Count

  7.     For i = 1 To rowm
  8.         k = 0
  9.         For j = 1 To colm
  10.             str1 = Cells(i, j).Value
  11.             str2 = Cells(i + 1, j).Value
  12.             ''如果有“小计”、"合计"、“总计”说明是表格内容行一行,则上一行为标题行
  13.             If str1 Like "*小*计*" Or str1 Like "*合*计*" Or str1 Like "*总*计*" Then
  14.                 提取标题行数 = i - 1
  15.                 Exit Function
  16.                 ''如果有“序号”、"编号"、“姓名”、“性别”等,且下一行的单元格不为空,则说明不是合并单元格,则本行为标题行
  17.             ElseIf str1 Like "*序*号*" Or str1 Like "*编*号*" Or str1 Like "*姓*名*" Or str1 Like "*性*别*" Then
  18.                 If str2 <> "" Then
  19.                     提取标题行数 = i
  20.                     Exit Function
  21.                 End If
  22.             Else
  23.                 ''判断上、下两行对应单元格的数据是否都是相同的类型,相同则说明是正文,则上一行就是标题的最后一行
  24.                 If TypeName(str1) = TypeName(str2) Then
  25.                     k = k + 1
  26.                 End If
  27.                 If k = colm Then
  28.                     提取标题行数 = i - 1
  29.                     Exit Function
  30.                 End If
  31.             End If
  32.         Next j
  33.     Next i
  34. End Function
复制代码
回复

使用道具 举报

 楼主| 发表于 2020-4-17 15:10 | 显示全部楼层
怎么帖子都看不了呀,动画总在打圈圈!
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-16 15:08 , Processed in 0.110330 second(s), 5 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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