我有一个文本框,我在其中获取输入目录并计算.xlsx报告的数量以及这些报告中的工作表总数。
我想获取每个报告的报告名称和工作表名称。
最快的方法是什么。
因为有些情况下可能有100个工作簿,而且里面总共有1000个工作表。
这是我的代码,只需获取这些报告中的报告和工作表的数量。
Private Sub FL_TextBox_Change()
Dim FolderPath As String
Dim path As String
Dim count As Integer
Dim Wk As Workbook
Dim Ws As Workbook
Set Ws = ActiveWorkbook
FolderPath = NewTask.FL_TextBox.Value
MsgBox ("Click Ok & Wait for the Total Number of Reports and Worksheets" & vbNewLine & vbNewLine & "to be calculated.")
If FolderPath = "" Then
NewTask.Num_Rpt_TextBox.Value = ""
Ws.Sheets("Config").Range("I1").Value = ""
Else
path = FolderPath & "\*.xlsx"
Filename = Dir(path)
File = (FolderPath & "\" & Filename)
wkcount = 0
Shcount = 0
shtcount = 0
RptSheets = ""
Do While Filename <> ""
wkcount = wkcount + 1
File = FolderPath & "\" & Filename
Set Wk = Workbooks.Open(File, ReadOnly:=True)
Shcount = Wk.Sheets.count
If RptSheets <> "" Then
RptSheets = RptSheets & "," & Shcount
Else
RptSheets = Shcount
End If
Wk.Close
shtcount = shtcount + Shcount
Filename = Dir()
Loop
Ws.Sheets("Config").Range("I1").Value = RptSheets
XlsxFilesPresent = wkcount & " / " & shtcount
NewTask.Num_Rpt_TextBox.Value = XlsxFilesPresent
End If
End Sub
因此,简而言之 - 我希望以结构化的方式获取.xlsx报告的数量以及这些报告中的报告名称和工作表数量以及工作表名称。
像
这样的东西Number of workbooks = 3
Number of Worksheets = 100
ReportNames = TestFile1, TestFile2, TestFile3.
SheetNames = TestFile1:TestSheet1, TestFile1:TestSheet2, TestFile1:TestSheet3, TestFile1:TestSheet4
等,
请分享您的想法,让这个过程更快地运行。
答案 0 :(得分:1)
看起来你有你需要的一切,你只需要添加一些线来制作一个包含你需要的所有数据的对象,然后你可以使用那个对象来提取你想要的任何东西,我想不出比字典对象。
工作表的所有信息都存储在名为worksheets
的集合对象中,因此您可以简单地存储该对象并遍历它以访问工作表名称以及可能的任何其他信息。所以首先要创建一个集合对象和一个字典对象:
Dim coll As Object
Dim dict As Object
Set dict = CreateObject("scripting.dictionary")
在do while
循环中,将工作簿名称用作键,将该工作簿的工作表对象用作项目。请注意,密钥应该是唯一的,我假设您将在一个目录中运行它,因此操作系统必须强制使用文件名。
要在打开工作簿后在循环内添加键和项,请使用以下命令:
set coll=wk.Worksheets
dict.add Wk,coll
一旦执行离开循环,您就会拥有所有工作簿及其工作表对象的字典。现在,您可以遍历字典并根据需要形成数据。例如,假设您要打印工作簿名称,然后打印工作表:
dim i as integer
dim key as variant
Dim sht As Worksheet
for each key in dict.keys
set coll=dict(key) 'sets the item of the dict=worksheets
For i = 1 To coll.Count 'loop through worksheets object and print their names
Set sht = coll(i)
Debug.Print key & ":" & sht.Name
Next
next key