ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[已解决] 把多表格相同位置单元格汇总到一张新的工作表中

[复制链接]

TA的精华主题

TA的得分主题

发表于 2021-1-17 14:11 | 显示全部楼层
Sub demo()
Dim sht As Worksheet, i As Long, s As Worksheet, k As Long, arr

If Sheets(1).Name <> "玻璃汇总" Then
    Set sht = Worksheets.Add(before:=Sheets(1))
    sht.Name = "玻璃汇总"
    Else
    Set sht = Sheets(1)
End If
k = 3
sht.Range("a2:e2") = Array("门名称", "玻璃宽/L", "玻璃高/H", "数量", "玻璃种类")
For Each s In Worksheets
    If IsNumeric(Right(s.Name, 2)) Then
        i = s.[o37].End(xlDown).Row
        s.[o38].Resize(i - 37, 4).Copy
        sht.Range("b" & k).Resize(i - 37, 1) = s.Name
        sht.Range("b" & k).PasteSpecial Paste:=xlPasteValues
        k = k + i - 37
    End If
Next s
sht.Columns("a:e").AutoFit
Set sht = Nothing
End Sub

TA的精华主题

TA的得分主题

发表于 2021-1-17 14:24 | 显示全部楼层
wangrh 发表于 2021-1-17 14:02
工作表的位置能不能放到任意位置,您这个现在不改代码的情况下只能放到第一位

本来你的表名就不规范,表格也非常的混乱,建议你好好看看这个帖,先把自己的基础工作做好,再来做代码。你现有表格的问题,比代码更重要!
对新手谈谈EXCEL用到的数据结构
http://club.excelhome.net/thread-1073526-1-1.html
(出处: ExcelHome技术论坛)

TA的精华主题

TA的得分主题

发表于 2021-1-17 14:28 | 显示全部楼层
wangrh 发表于 2021-1-17 14:02
工作表的位置能不能放到任意位置,您这个现在不改代码的情况下只能放到第一位

这个更简单了,Sheets(1)改成Sheets(“玻璃汇总”)就解决了。但你后面那些有单引号’的表名的位置必须从第7个表的位置开始到最后,因为这些表名都不规范,很难写代码来确定,因为听你说还在不断增加。用个数组也可以,但太长了不行。

TA的精华主题

TA的得分主题

发表于 2021-1-17 15:00 | 显示全部楼层
Option Explicit
Sub test()
  Dim bm$, sq, cn, rs, i%, sh As Worksheet
  bm = "玻璃汇总"
  
  ActiveSht bm
  
  Set cn = CreateObject("ADODB.Connection")
  cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" & ThisWorkbook.FullName
  For Each sh In Worksheets
    With sh
      If .Name <> bm Then
        If Trim(Replace(.Range("A1"), Space(1), "")) = "下料单" Then
          sq = sq & " union all select """ & .Range("b16") & """ AS 门窗代号,* from [" & .Name & "$o37:R43] where 数量 is not null"
        End If
      End If
    End With
  Next
  Set rs = cn.Execute(Mid(sq, 12))
  For i = 0 To rs.Fields.Count - 1
    Cells(2, i + 1) = rs.Fields(i).Name
  Next
  Range("a3").CopyFromRecordset rs
  
  SetFormats bm
End Sub

Function ActiveSht(ShtName As String) '设置工作表
  Dim sht As Worksheet
  On Error Resume Next
  Set sht = Worksheets(ShtName)
  If Err.Number <> 0 Then
    Set sht = Worksheets.Add
    ActiveSheet.Name = ShtName
    Err.Clear
  End If
  sht.Activate
  sht.Cells.Clear
End Function

Function SetFormats(ShtName As String) '设格式
  With Worksheets(ShtName).Range("a1")
    .Value = ShtName & "表"
    .Resize(, 5).Merge
    .Font.Bold = True
    With .CurrentRegion
      .HorizontalAlignment = xlCenter
      .Borders.LineStyle = 1
    End With
  End With
  Columns.AutoFit
  Beep
End Function

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-1-17 15:08 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
cui26896 发表于 2021-1-17 14:28
这个更简单了,Sheets(1)改成Sheets(“玻璃汇总”)就解决了。但你后面那些有单引号’的表名的位置必须从 ...

完全解决了,我之前尝试这样改了的,但是不知道什么原因提示错误,现在没问题了,非常感谢你的耐心讲解。

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-1-17 15:38 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
wangrh 发表于 2021-1-17 15:08
完全解决了,我之前尝试这样改了的,但是不知道什么原因提示错误,现在没问题了,非常感谢你的耐心讲解。 ...

  1. Sub test2()
  2. Dim arr, brr, i%, i2%, j%, tit, k
  3.   Sheets.Add.Name = "玻璃汇总"
  4.   tit = Array("门窗代号", "玻璃宽/L", "玻璃高/H", "数量", "玻璃种类")
  5.   ReDim brr(1 To 50000, 1 To 5)
  6.   For j = 0 To UBound(tit)
  7.     brr(1, j + 1) = tit(j)
  8.   Next
  9.   k = k + 1
  10.   For i2 = 7 To Sheets.Count
  11.     With Sheets(i2)
  12.       arr = .Range("o38:r43")
  13.       For i = 1 To UBound(arr)
  14.         If Len(arr(i, 1)) Then
  15.           k = k + 1
  16.           brr(k, 1) = .[b16]
  17.           For j = 1 To UBound(arr, 2)
  18.             brr(k, j + 1) = arr(i, j)
  19.           Next
  20.         End If
  21.       Next
  22.     End With
  23.   Next
  24.   With Sheets("玻璃汇总")
  25.     .Range("a1").Resize(1000, 5).ClearContents
  26.     .Range("a1").Resize(k, UBound(brr, 2)) = brr
  27.   End With
  28. End Sub
复制代码

我稍微修改了一下,致敬cui26896

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2021-1-17 16:59 | 显示全部楼层
xiangbaoan 发表于 2021-1-17 15:00
Option Explicit
Sub test()
  Dim bm$, sq, cn, rs, i%, sh As Worksheet

我用的是四引号,结果显示有不能引用的字符,看来老师的三重引号是过了!

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2021-1-17 17:06 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
老师真是太强大了,老师提示那帖,我走了弯路,想用ADOX.Catalog的Columns属性去确定字段名,走偏了。本帖,想到有特殊符号要用多重引号,但用了""""四引号,结果又走偏了。

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-1-17 21:01 | 显示全部楼层
xiangbaoan 发表于 2021-1-17 15:00
Option Explicit
Sub test()
  Dim bm$, sq, cn, rs, i%, sh As Worksheet

感谢xiangbaoan老师,现在才看到您的回复,完美解决

TA的精华主题

TA的得分主题

发表于 2021-1-17 21:06 来自手机 | 显示全部楼层
cui26896 发表于 2021-1-17 17:06
老师真是太强大了,老师提示那帖,我走了弯路,想用ADOX.Catalog的Columns属性去确定字段名,走偏了。本帖 ...

老师好!共同学习。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

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

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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