2017-03-17 13 views
0

我能夠連接和查詢特定工作表。某些文件可能會有第一個工作表名稱不同或更改,有時可能會有多個文件名稱。使用ADODB從關閉文件中按Tab鍵順序返回工作表名稱

我嘗試了幾個不同的函數來返回完整列表。但是,沒有人按照它們在Excel中顯示的順序給我提供工作表選項卡名稱。

最簡單的方法是這樣的。

Set cat = CreateObject("ADOX.Catalog") 
Set cat.ActiveConnection = objConnection 
Debug.Print cat.Tables.Count 

For Each tbl In cat.Tables 
Debug.Print tbl.Name 
Debug.Print tbl.datecreated 
Debug.Print tbl.datemodified 
Next tbl 

我想我可以通過datecreated或datemodified來確定,但所有4的日期都是一樣的。

> This prints for me: 
> Avion$ 
> 3/17/2017 12:43:19 PM 
> 3/17/2017 12:43:19 PM 
> Meow$ 
> 3/17/2017 12:43:19 PM 
> 3/17/2017 12:43:19 PM 
> Sheet1$ 
> 3/17/2017 12:43:19 PM 
> 3/17/2017 12:43:19 PM 
> Sheet2$ 
> 3/17/2017 12:43:19 PM 
> 3/17/2017 12:43:19 PM 

因此,它給了我工作表選項卡名稱列表的字母排序。

但是在工作表的順序是:

>[Sheet1][Avion][Sheet2][Meow] 

我無法找到任何屬性來告訴我訂單。

回答

1

摘自:https://www.mrexcel.com/forum/excel-questions/406243-get-sheet-number-using-adox.html

Sub GetSheetNames() 
    '###Requires a reference to Microsoft DAO x.x Object Library 

    Dim FName As String, i As Long, WB As DAO.Database 

    FName = ThisWorkbook.Path & "\ADOXSource.xlsx" 


    Set WB = OpenDatabase(FName, False, True, "Excel 8.0;") 

    With WB.tabledefs 
     For i = 1 To .Count 
      Debug.Print i, .Item(i - 1).Name '<< TableDefs Is zero based 
     Next i 
    End With 

    WB.Close 

End Sub 
+0

謝謝你,我昨天沒有使用DAO想出解決辦法,實際上建立了一個功能...但我很驚訝,我不能用ADO做到這一點。由於DAO最終將會失效,並且技術上微軟認爲它被拋棄了,所以我擔心... – ReportWarrior

0

這是我建的一天用DAO,但我還是想弄清楚ADO ...

Public Function GetSheets(ByVal FileToOpen As String, ByVal FileExt As String) 
    Dim Shts() As String, ShtCnt As Integer: ShtCnt = 0 
    ReDim Shts(0 To ShtCnt) 

    Dim dbE As Object, db As Object, tbl As Object 

    On Error Resume Next 
    Set dbE = CreateObject("DAO.DBEngine") 
    Set dbE = CreateObject("DAO.DBEngine.35") 
    Set dbE = CreateObject("DAO.DBEngine.36") 
    On Error GoTo 0 

    Set db = dbE.OpenDatabase(FileToOpen, False, False, FileExt & ";HDR=Yes;") 

    For Each tbl In db.TableDefs 
     Shts(ShtCnt) = Mid(tbl.Name, 1, Len(tbl.Name) - 1) 
     ShtCnt = ShtCnt + 1 
     ReDim Preserve Shts(0 To ShtCnt) 
    Next 

    Set dbE = Nothing 
    Set db = Nothing 
    Set tbl = Nothing 

    GetSheets = Shts 
End Function 

然後運行我有一堆代碼打開對話框,然後確定格式和字符串:

Select Case Right(FileToOpen, Len(FileToOpen) - InStrRev(FileToOpen, ".")) 
    Case "xls", "XLS" 
     Provider = "Microsoft.Jet.OLEDB.4.0;" 
     FileExt = "Excel 8.0" 
    Case "xlsx", "XLSX" 
     Provider = "Microsoft.ACE.OLEDB.12.0;" 
     FileExt = "Excel 12.0" 
    Case "csv", "CSV" 
     Provider = "Microsoft.Jet.OLEDB.4.0;" 
     FileExt = "Excel 8.0" 
    Case Else 
     GoTo Err: 
End Select 

然後我有:

'Get Spreadsheets 
Dim FileSpreadsheets() As String  
FileSpreadsheets = GetSheets(FileToOpen, FileExt) 

然後,你可以做任何你需要做的,但作爲一個例子來獲得一個MsgBox:

mymsg = "Count: " & UBound(FileSpreadsheets) & vbNewLine & vbNewLine & _ 
"Sheets:" & vbNewLine & vbNewLine 

For Each Sheet In FileSpreadsheets 
    mymsg = mymsg + Sheet & vbNewLine 
Next Sheet 

MsgBox mymsg 
相關問題