2017-11-13 24 views
0

私はInput Directoryを取得し、.xlsxレポートの数とそのレポート内のワークシートの総数を計算するテキストボックスを持っています。ディレクトリ内のすべての.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

可能な複製(https://stackoverflow.com/questions/26262962/excel- vba-efficient-get-file-names-function) – Ralph

+0

@Ralphシート名も必要です。私はその質問を見て、私は思う - 私の要件はそれに似ていますが、まったく同じではありません。 – Sid29

+0

ADO OpenSchemaメソッドを使用して、ワークシート名を取得できます。 –

答えて

1

あなたが必要とするすべてのデータを含んでいるオブジェクトを作成するためにいくつかの行を追加し、そのオブジェクトを使用して必要なものを抽出することができます。辞書オブジェクトよりも。

シートのすべての情報はworksheetsというコレクションオブジェクトに格納されているため、そのオブジェクトを保存して繰り返し、ワークシート名や必要な情報にアクセスできます。だから、最初のコレクションオブジェクトと、このような辞書オブジェクトを作成します。項目としてキーとそのワークブックのワークシートオブジェクトとしてごdo whileループ使用のワークブック名​​インサイド

Dim coll As Object 
Dim dict As Object 

Set dict = CreateObject("scripting.dictionary") 

を。キーは一意でなければならないことに注意してください。これは1つのディレクトリでこれを実行することを前提としているため、ファイル名はOSによって一意に強制されなければなりません。あなたは、ブックはこれを使用して開いた後

は、ループ内でのキーと項目を追加するには、次の実行はループから抜ける

set coll=wk.Worksheets 
dict.add Wk,coll 

たら、あなたはすべてのブックの辞書を持っており、彼らのワークシートオブジェクト。これで、辞書をループして必要なデータを作成できます。例えば、あなたは、ブック名を印刷したいとしましょう、その後のワークシート:[エクセルVBA効率的なGETファイル名機能]の

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 
関連する問題