Excel精英培训网

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

[已解决]关于工作表的名称问题

[复制链接]
发表于 2016-11-15 12:52 | 显示全部楼层 |阅读模式
遇到一个情况请教一下,如何写才好

原来EXCEL中有一个表叫,“统计表”,写入VBA时代码为Sheets("统计表")


但现在有一个问题就是,每个EXCEL的“统计表”的前缀都不一样。VBA要写入每一个EXCEL之中,比如2月份的EXCEL中为“2月统计表”,3月份的EXCEL中为“3月统计表”,后面统计表这三个字则完全一样。


这个在原来Sheets("统计表")的基础上要如何修改才能自动识别得到统计表这三个字呢?
最佳答案
2016-11-15 18:04
  1. Sub test()
  2.   Dim r%, i%
  3.   Dim arr, brr
  4.   Dim d As Object
  5.   Set d = CreateObject("scripting.dictionary")
  6.   For Each sh In Sheets
  7.     If InStr(sh.Name, "录入表") Then
  8.         With sh
  9.             r = .Cells(.Rows.Count, 1).End(xlUp).Row
  10.             arr = .Range("a2:o" & r)
  11.             For i = 1 To UBound(arr)
  12.               If Not d.exists(arr(i, 1)) Then
  13.                 ReDim brr(1 To 2)
  14.               Else
  15.                 brr = d(arr(i, 1))
  16.               End If
  17.               brr(1) = brr(1) + arr(i, 14)
  18.               brr(2) = brr(2) + arr(i, 15)
  19.               d(arr(i, 1)) = brr
  20.             Next
  21.         End With
  22.     End If
  23. Next
  24.   With Worksheets("统计表")
  25.     r = .Cells(.Rows.Count, 1).End(xlUp).Row
  26.     .Range("H:I").ClearContents
  27.     .Range("H1") = "打包数量": .Range("I1") = "生产数量"
  28.     arr = .Range("b2:b" & r)
  29.     ReDim crr(1 To UBound(arr), 1 To 2)
  30.     For i = 1 To UBound(arr)
  31.       If d.exists(arr(i, 1)) Then
  32.         brr = d(arr(i, 1))
  33.         crr(i, 1) = brr(1)
  34.         crr(i, 2) = brr(2)
  35.       End If
  36.     Next
  37.     .Range("H2").Resize(UBound(crr), 2) = crr
  38.   End With
  39. End Sub
复制代码
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2016-11-15 13:00 | 显示全部楼层
  1. Sub Macro1()
  2. For i = 1 To 3
  3.     MsgBox Sheets(i & "月统计表").[a1]
  4. Next
  5. End Sub
复制代码
回复

使用道具 举报

 楼主| 发表于 2016-11-15 13:26 | 显示全部楼层

  • For i = 1 To 3
  •     With Worksheets(i & "月统计表")
  • Next
.......



我放这段代码放在我的VBA中,好像实现不了效果,无论如何放不是显示下超标界,就是显示没有FOR。因为我这里是用With Worksheets,下面还有很多代码。
回复

使用道具 举报

发表于 2016-11-15 13:42 | 显示全部楼层
要看你的附件或整段代码,才能准确告诉你!
回复

使用道具 举报

 楼主| 发表于 2016-11-15 14:17 | 显示全部楼层
su45 发表于 2016-11-15 13:42
要看你的附件或整段代码,才能准确告诉你!

  • Sub test()
  •   Dim r%, i%
  •   Dim arr, brr
  •   Dim d As Object
  •   Set d = CreateObject("scripting.dictionary")
  •   With Worksheets("2月份录入表")
  •     r = .Cells(.Rows.Count, 1).End(xlUp).Row
  •     arr = .Range("a2:o" & r)
  •     For i = 1 To UBound(arr)
  •       If Not d.exists(arr(i, 1)) Then
  •         ReDim brr(1 To 2)
  •       Else
  •       
  •         brr = d(arr(i, 1))
  •       End If
  •       brr(1) = brr(1) + arr(i, 14)
  •       brr(2) = brr(2) + arr(i, 15)
  •       d(arr(i, 1)) = brr
  •     Next
  •   End With
  •   With Worksheets("统计表")
  •     r = .Cells(.Rows.Count, 1).End(xlUp).Row
  •     arr = .Range("b2:b" & r)
  •     ReDim crr(1 To UBound(arr), 1 To 2)
  •     For i = 1 To UBound(arr)
  •       If d.exists(arr(i, 1)) Then
  •         brr = d(arr(i, 1))
  •         crr(i, 1) = brr(1)
  •         crr(i, 2) = brr(2)
  •       End If
  •     Next
  •     .Range("H2").Resize(UBound(crr), 2) = crr
  •   End With
  • End Sub



就在第6行中的,With Worksheets("2月份录入表")这里,这里每个EXCEL都不同。

其实这个表还有一个问题,就是“统计表”中“A列批次”空白时,右侧的数据至少缺一个或者全部都没有。其实条件值应该是“统计表”中的“B列”,是B列有数据时“H与I列”才会有数据,否则那两列均自动清空,这个问题你也能解决吗?


SUMIF带月份判断.zip

15.41 KB, 下载次数: 3

回复

使用道具 举报

发表于 2016-11-15 14:40 | 显示全部楼层
你试试:

  1. Sub test()
  2.   Dim r%, i%
  3.   Dim arr, brr
  4.   Dim d As Object
  5.   Set d = CreateObject("scripting.dictionary")
  6.   With Worksheets("2月份录入表")
  7.     r = .Cells(.Rows.Count, 1).End(xlUp).Row
  8.     arr = .Range("a2:o" & r)
  9.     For i = 1 To UBound(arr)

  10.       If Not d.exists(arr(i, 1)) Then
  11.         ReDim brr(1 To 2)
  12.       Else
  13.       
  14.         brr = d(arr(i, 1))
  15.       End If

  16.       brr(1) = brr(1) + arr(i, 14)

  17.       brr(2) = brr(2) + arr(i, 15)
  18.       d(arr(i, 1)) = brr
  19.     Next
  20.   End With
  21.   For Each sh In Sheets
  22.     If InStr(sh.Name, "统计表") Then
  23.         With sh
  24.             r = .Cells(.Rows.Count, 1).End(xlUp).Row
  25.             arr = .Range("b2:b" & r)
  26.             ReDim crr(1 To UBound(arr), 1 To 2)
  27.             For i = 1 To UBound(arr)
  28.                 If d.exists(arr(i, 1)) And arr(i, 1) <> "" Then
  29.                     a = a + 1
  30.                     brr = d(arr(i, 1))
  31.                     crr(a, 1) = brr(1)
  32.                     crr(a, 2) = brr(2)
  33.                 End If
  34.             Next
  35.             .Range("H2").Resize(a, 2) = crr
  36.         End With
  37.         Exit For
  38.     End If
  39.   Next
  40. End Sub
复制代码
回复

使用道具 举报

 楼主| 发表于 2016-11-15 16:55 | 显示全部楼层

你好。谢谢,又迈向一大步了。
1.我想改的位置是
With Worksheets("2月份录入表")


因为其他EXCEL还有With Worksheets("3月份录入表")之类的。


2.B列没有数据时,H与J列的旧数据尚在,需要清空(详见附图)






360截图20161115165223428.jpg
回复

使用道具 举报

发表于 2016-11-15 18:04 | 显示全部楼层    本楼为最佳答案   
  1. Sub test()
  2.   Dim r%, i%
  3.   Dim arr, brr
  4.   Dim d As Object
  5.   Set d = CreateObject("scripting.dictionary")
  6.   For Each sh In Sheets
  7.     If InStr(sh.Name, "录入表") Then
  8.         With sh
  9.             r = .Cells(.Rows.Count, 1).End(xlUp).Row
  10.             arr = .Range("a2:o" & r)
  11.             For i = 1 To UBound(arr)
  12.               If Not d.exists(arr(i, 1)) Then
  13.                 ReDim brr(1 To 2)
  14.               Else
  15.                 brr = d(arr(i, 1))
  16.               End If
  17.               brr(1) = brr(1) + arr(i, 14)
  18.               brr(2) = brr(2) + arr(i, 15)
  19.               d(arr(i, 1)) = brr
  20.             Next
  21.         End With
  22.     End If
  23. Next
  24.   With Worksheets("统计表")
  25.     r = .Cells(.Rows.Count, 1).End(xlUp).Row
  26.     .Range("H:I").ClearContents
  27.     .Range("H1") = "打包数量": .Range("I1") = "生产数量"
  28.     arr = .Range("b2:b" & r)
  29.     ReDim crr(1 To UBound(arr), 1 To 2)
  30.     For i = 1 To UBound(arr)
  31.       If d.exists(arr(i, 1)) Then
  32.         brr = d(arr(i, 1))
  33.         crr(i, 1) = brr(1)
  34.         crr(i, 2) = brr(2)
  35.       End If
  36.     Next
  37.     .Range("H2").Resize(UBound(crr), 2) = crr
  38.   End With
  39. End Sub
复制代码
回复

使用道具 举报

 楼主| 发表于 2016-11-16 09:33 | 显示全部楼层
1.现在A列的批次,最后那行没有数据的情况下,相对应的H与I列就无显示了。
2.如果只有一个批次就会显示工程错误“    ReDim crr(1 To UBound(arr), 1 To 2)”

希望是否有数据以B列为准,而不是A列为准,望老师帮下手。
2.jpg

SUMIF带月份判断5.zip

17.73 KB, 下载次数: 1

回复

使用道具 举报

发表于 2016-11-16 12:44 | 显示全部楼层
你要回复我的帖子,我才知道呀!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-6 12:05 , Processed in 0.304644 second(s), 11 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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