我希望将特定的访问表字段导出到特定的Excel单元格。我的vba代码不起作用

时间:2013-11-27 21:12:48

标签: vba ms-access access-vba ms-access-2010 export-to-excel

以下是我目前正在尝试使用的代码。基本上我想从表中选择字段并将它们导出到excel中的特定单元格区域。当我在Access中运行此代码时,我没有收到任何错误,但我也没有得到我在我指定的单元格中选择的字段保存的第二个excel临时文件。谢谢你的帮助。以下代码已更新,以反映现在正在运作的内容。请参阅以下有助于解决我遇到的问题的评论。

Option Explicit

'Enter Location of your Template Here
Const ExcelTemplate = "C:\Users\Desktop\Export Excel\Temp.xlsx"
'Enter the Folder Directory to save results to
Const SaveResutsFldr = "C:\Users\Desktop\Export Excel\"
Sub CreateWorkbook()
Dim SaveAsStr As String
Dim ExcelApp, WB As Object
Dim i As Integer
Dim c As Integer

c = DCount("*", "tbldata") + 4

'Create Reference to Run Excel
Set ExcelApp = CreateObject("Excel.Application")

'Create Reference to your Table
Dim T As Recordset
Set T = CurrentDb.OpenRecordset("tblData")

'Loop through all Record on Table
If Not (T.BOF And T.EOF) Then
T.MoveFirst
End If
Do While Not T.EOF
'Open Your Excel Template
Set WB = ExcelApp.Workbooks.Open(ExcelTemplate)

For i = 5 To c
'Enter your data from your table here to the required cells
WB.Worksheets("sheet1").Range("B" & i) = T("Field1")
WB.Worksheets("sheet1").Range("C" & i) = T("field2")
WB.Worksheets("sheet1").Range("D" & i) = T("field3")
WB.Worksheets("sheet1").Range("E" & i) = T("field4")
'Repeat this line for each piece of data you need entered
'Changing the Sheet name, cell range, a field name as per your requirements
'WB.Wor...
'WB.Wor...

T.MoveNext
Next i
i = i + 1
Loop
'Save and Close the Workbook
SaveAsStr = SaveResutsFldr & ("Temp1") & ".xlsx"
WB.SaveAs SaveAsStr
WB.Close
Set WB = Nothing

'Move to the Next Record


'Close down the Excel Application
ExcelApp.Quit
Set ExcelApp = Nothing
End Sub

2 个答案:

答案 0 :(得分:3)

在此行设置断点...

Set T = CurrentDb.OpenRecordset("tblData")

当光标位于该行的任何位置时,您可以通过按 F9 来设置断点。或者右键单击该行,然后从快捷菜单中选择“切换” - >“断点”。无论哪种方式,您都应该在该行旁边的左边距中看到一个带红色的点。

然后运行您的代码。当它到达断点时,Access将进入调试(中断)模式。然后,您可以使用 F8 键一次执行一行,然后按照代码操作。

您将发现由于循环控件中的逻辑,While循环中的代码无法执行...

While Not T.BOF And T.EOF

如果BOF为False且EOF为True,则表示“进入循环。”当您第一次点击该行时,您位于记录集的第一行,因此BOF为False,但EOF也为False。因此,当您AND这两个值时,结果为False ...并且Access会跳过循环。

这是一个Access Immediate窗口会话,其记录集的当前行是第一行。

' name and value of the first field in current row ...
? rs.Fields(0).Name, rs.Fields(0).Value
id             1 
' this is the WHILE condition from your code ...
? Not rs.BOF And rs.EOF
False

希望一切都有意义。如果仍然模糊,只需像这样启动循环......

If Not (T.BOF And T.EOF) Then
    T.MoveFirst
End If
Do While Not T.EOF

并以此结束......

T.MoveNext
Loop

您设置的断点是临时的。它不会随代码一起保存。因此,如果重新启动Access,它将会消失。如果你想在当前会话期间摆脱它,只需再次“切换”它。

答案 1 :(得分:1)

问题出在While-Condition,HTH。

  

如果您打开不包含记录的Recordset对象,则 BOF   和EOF属性设置为True ,并设置为Recordset对象   RecordCount属性设置为0。

    If (T.EOF = True And T.BOF = True) Then
        MsgBox "Recordset object contains no records."
        Exit Sub
    End If

    'Create Reference to Run Excel
    Set ExcelApp = CreateObject("Excel.Application")      
  

当您打开包含至少一个的 Recordset对象时   记录,第一条记录是当前记录和 BOF和EOF   属性为False 和...

    While (T.BOF = False And T.EOF = False)

... 它们保持为False,直到您超出Recordset对象的开头或结尾         '分别使用 MovePrevious MoveNext 方法。