以下是我目前正在尝试使用的代码。基本上我想从表中选择字段并将它们导出到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
答案 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 方法。