2015-04-04 155 views
0

我在Visual Studio Express中使用VBA。我想要做的是給出我通過VB,列名,即我在我的數據庫中的名稱導出MS Access DB創建的excel spreedsheet的第一行。VBA Excel - 將列名保存到MS Access的電子表格中

有9列被跳過的10列,我也將spreedsheet分開以允許第一行有標題,我將如何填充我的spreedsheet的第一行與我的數據庫的列名稱? 此外,如果直接通過代碼分配名稱,而不是從數據庫傳遞列標題,那也沒關係。

我的代碼:

Public Sub ExportEx() 
    Dim strSQL_Query As String 
    Dim oCN As ADODB.Connection 
    Dim oCMD As ADODB.Command 
    Dim oRecords As ADODB.Recordset 
    Dim strDBPath As String 
    Dim varValues As Object 
    Dim lngRows As Long 
    Dim lngCols As Long 
    Dim strCN As String 



    strDBPath = Application.StartupPath & "\SCO_Leaderboard.accdb" 

    strCN = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strDBPath & ";" & _ 
        "Persist Security Info=False;" 


    strSQL_Query = "Select top 10 Rank, Username, Time_Played, Lv, EXP, Floor, Col, Logins, Status FROM tblUsers ORDER BY Rank ASC" 

    Dim oExcel As Object 
    Dim oBook As Object 
    Dim oSheet As Object 
    oExcel = CreateObject("Excel.Application") 
    oBook = oExcel.Workbooks.Add 
    oSheet = oBook.Worksheets(1) 

    oCN = New ADODB.Connection 
    oCN.ConnectionString = strCN 
    oCN.Open() 


    oCMD = New ADODB.Command 
    oCMD.ActiveConnection = oCN 
    oCMD.CommandText = strSQL_Query 
    oRecords = oCMD.Execute 

    varValues = oRecords.GetRows 


    lngCols = UBound(varValues, 2) 
    lngRows = UBound(varValues, 1) 
    oSheet.Range("A2", oSheet.Range("A2").Offset(lngRows, lngCols)) = varValues 


    oBook.SaveAs(Application.StartupPath & "\Top_10_All_Time.xls") 
    oExcel.Quit() 

    MsgBox("An Excel spreadsheet has been created under:" & vbNewLine & vbNewLine & Application.StartupPath & "\Top_10_All_Time.xls") 
    '' Clean up... 

    oCMD = Nothing 
    oCN.Close() 
    oCN = Nothing 

在另一方面會怎麼我的空間在Excel中的字段出來,讓所有的數據擬合在列?

感謝您的幫助,

安迪

回答

1

在VBA中,有兩種方法來訪問表/查詢數據導出到Excel電子表格:

1)TransferSpreadsheet方法

該命令將導出所有字段和記錄。所以,你的VBA字符串保存爲一個存儲的查詢對象,並引用它在下面的命令:

DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, _ 
       "yourtableorqueryname", "fullpathtoExcelFile", True 

2)CopyFromRecordset方法

該命令將只導出記錄。但是,您可以使用記錄集的Fields屬性填寫第一行。請注意下面的代碼假定您使用ADODB連接創建名爲rst的ADO記錄集。

Dim rst As ADODB.Recordset 

Set rst = New ADODB.Recordset 

rst = "Select top 10 Rank, Username, Time_Played, Lv, EXP, Floor, Col, Logins, Status" _ 
    & " FROM tblUsers ORDER BY Rank ASC", oCN 

oSheet.Range("A1").Select 
For Each fld In rst.Fields 
    oExcel.ActiveCell = fld.Name 
    oExcel.ActiveCell.Offset(0, 1).Select 
Next 
'REMOVE BELOW IF YOU WANT ONLY COLUMN HEADERS NOT DATA 
oSheet.Range("A2").CopyFromRecordset rst 
'TO AUTO FIT (SPACE OUT) COLUMNS 
osheet.Range("A1:I" & rst.RecordCount + 1).Columns.AutoFit 
0

這個工作在Access中,我不知道,如果它在你的情況:

Select top 10 Rank As Header1, Username As Header2, Time_Played As Header3 ... 
0

你將不得不從檢索字段集合oRecords的模式:

或者只是從strSQL解析字段名稱.. 。

或 - 很容易,因爲你定義的字段名,並建立從字段名的SQL - 把這些數組中,然後從該陣列構建範圍的第一行。

+0

是否有直接通過代碼設置字段中數據的方法,即單元格A1 =「Rank」等? – Andy 2015-04-04 14:13:55

+0

是...使用第1行的範圍。 – Gustav 2015-04-04 15:21:38