常用VBA(三)快速提取结构相同的多个表单中数据

目标

源文件为每月的财务报表,查找值所在的单元格位置、表页结构和表页名称相同。

局限和特点

目标文件和源文件必须在同一个文件夹内
设置条件,指定值和参数,如表页名称,目标值名称,目标值的单元格地址




程序

Private Sub CommandButton1_Click()
Dim start As Double
start = Timer '设置计时器
Dim myfile, mypath, wb '声明变量
Application.ScreenUpdating = False '关闭屏幕更新
'预设定义
Sheets("结果表").UsedRange.Clear
R1 = Sheets("条件表").Range("B5").CurrentRegion.Rows.Count - 1 'b5单元格CTRL+A的区域的行数-1
Sheets("条件表").Range("B5").Resize(R1, 1).Copy
Sheets("结果表").Range("B1").PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:=False, Transpose:=True '转置
R2 = Sheets("条件表").Range("C2")
'预设定义执行完毕
mypath = ThisWorkbook.Path
myfile = Dir(mypath & "\*.xls*") '遍历当前文件夹内所有xls*文件
N1 = 1 'N1为J结果表中行序号,和N1+1配合使用,放到哪个循环外
Do While myfile <> ""
If myfile <> ThisWorkbook.Name Then
Set wb = GetObject(mypath & "\" & myfile) 'wb为工作簿
  For I = 1 To wb.Sheets.Count
    On Error Resume Next '报错跳过
    If wb.Sheets(I).Name = R2 Then
      Sheets("结果表").Range("A1").Offset(N1, 0) = wb.Name
      For J = 1 To R1
      R3 = Sheets("条件表").Range("C5").Offset(J - 1, 0)
      Sheets("结果表").Range("A1").Offset(N1, J) = wb.Sheets(R2).Range(R3)
      Next J
    End If
  Next I
'主体程序执行完毕
wb.Close False
N1 = N1 + 1
End If
myfile = Dir
Loop
Application.ScreenUpdating = True
MsgBox "运行程序使用" & Format(Timer - start, "0.00") & "秒"
End Sub