|
发表于 2013-11-4 17:47
|
显示全部楼层
本楼为最佳答案
hgqing2010 发表于 2013-11-4 16:40
感谢美斯特邦威! 烦劳再对代码作个注解,特别是循环结构里的代码。 - Sub abc()
- Application.ScreenUpdating = False '关闭屏幕刷新
- Set d = CreateObject("scripting.dictionary") '创建字典
- st = Dir(ThisWorkbook.Path & "" & "*.xls") '定义变量为当前工作薄的xls文件,下面循环
- m = 1
- pp = Range("a1:bs2").Value '将此单元格区域存为数值pp,初值
- Do While st <> "" '循环st,直到st为空值,也就是所有xls文件循环
- qq = pp '设置qq为循环中的初值变量,每个文件开始循环都设置qq为初值pp
- If st <> "汇总.xls" Then '汇总的本工作薄不需循环
- Set wb = GetObject(ThisWorkbook.Path & "" & st) '设置wb为当前循环到的xls文件
- With wb.Sheets(1)
- kk = .Range("b5:h72").Value '因区域固定,所以wb的每个工作表固定区域存为数值
- For i = 1 To UBound(kk) '对kk进行循环
- For j = 3 To 7 Step 4 'kk的列进行循环,这里只取表中的基础数据列
- If kk(i, j - 2) <> "" Then '空值略过
- d(Replace(kk(i, j - 2), "★", "")) = kk(i, j) '将每个项目名称和对应的基础数据存入字典,项目名称去掉★
- End If
- Next j, i
- For j = 1 To UBound(qq, 2)
- qq(2, j) = d(qq(1, j)) '在qq数组中循环,第二行的数据通过第一行对应用以上存入的字典获取
- Next j
- Cells(m + 1, 1).Resize(1, UBound(qq, 2)) = Application.Index(qq, 2) '将新得到的数组qq的第二行读取到对应的位置
- m = m + 1 '位置+1,也就是一行一个表的数据
- d.RemoveAll '清空数组,以便下次循环
- End With
- wb.Close False '不保存关闭已用过的xls文件
- End If
- st = Dir() '下一个xls文件循环
- Loop
- Application.ScreenUpdating = True '打开屏幕刷新
- End Sub
复制代码 |
|