excel - 我用于创建具有数据连接的 excel 文件的访问 VBA 代码适用于第一个文件,然后总是在随机点失败
问题描述
我在 Access 中编写了一些代码来复制一个 excel 模板文件,对复制的内容执行一些刷新和简单的转换,保存,然后移动到下一个文件。最初,我可以通过循环遍历列表来创建多个文件,但在随后的迭代中不断在随机行上出现奇怪的错误。我已经避免了 Active 任何东西,因为这似乎是有问题的,但代码在第二次迭代中仍然失败。主要是在 Connection.Refresh 上,但有时是其他行,例如“对象全局的方法行失败”。我在这方面相当有经验。我还尝试在每个循环结束时将所有 vba excel 对象设置为空,但这没有帮助。代码如下。感激地收到任何想法:
Sub CreateFilesIndividual()
Dim mw As Variant
Dim ccount As Integer
Dim rs As Recordset
Dim i As Integer
Set rs = CurrentDb.OpenRecordset("SELECT CM1920 as CM from Comm1920 order by rscount desc", dbOpenSnapshot)
If rs.RecordCount = 0 Then
MsgBox "No Commissioners Codes available - exiting"
Exit Sub
End If
For i = 1 To rs.RecordCount
CreateFile rs("CM")
Next
End Sub
Sub CreateFile(commCode)
Dim templateloc As String
Dim fileloc As String
Dim Xl As Excel.Application
Dim wb As Excel.Workbook
Dim ws As Excel.Worksheet
Dim ws2 As Excel.Worksheet
Dim ws3 As Excel.Worksheet
Dim ws4 As Excel.Worksheet
templateloc = "\\gstt.local\Users\01\MWaring\Documents\Bespoke Report Requests\Contracts automation\Proposal template CCGs 2021 v2.6.xlsm"
fileloc = "\\gstt.local\Users\01\MWaring\Documents\Bespoke Report Requests\Contracts automation\test\Proposal CCGs 1920 v2.6 " & commCode & ".xlsm"
FileCopy templateloc, fileloc
'
Set Xl = CreateObject("Excel.Application")
Set wb = Xl.Workbooks.Open(fileloc)
Set ws = wb.Sheets("Commissioner Summary")
ws.Unprotect
ws.Cells(2, 4) = commCode.Value
Debug.Print ws.Cells(2, 4).Value & " - " & commCode.Value
wb.Connections("Update1").Refresh
Set ws2 = wb.Sheets("Contract Category Detail")
ws2.Range("A:AM").Copy
Set ws3 = wb.Sheets("CC detail")
ws3.Range("A1").PasteSpecial Paste:=xlPasteColumnWidths
ws3.Range("A1").PasteSpecial Paste:=xlPasteFormats
ws3.Range("A1").PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
xlNone, SkipBlanks:=False, Transpose:=False
ws3.Range("AG3").FormulaR1C1 = "=ROUND(RC[-2]+RC[-1],0)"
Dim myrange As Integer
myrange = ws3.Range("A" & Rows.Count).End(xlUp).Row
ws3.Range("AG3:AG" & myrange).FillDown
ws3.Range("AL3").FormulaR1C1 = "=RC[-5]*RC34"
ws3.Range("AL3:AL" & myrange).FillDown
ws3.Range("A:AM").Copy
Set ws4 = wb.Sheets("Contract_Category_detail")
ws4.Range("A1").PasteSpecial Paste:=xlPasteColumnWidths
ws4.Range("A1").PasteSpecial Paste:=xlPasteFormats
ws4.Range("A1").PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
xlNone, SkipBlanks:=False, Transpose:=False
ws2.Delete
ws3.Delete
wb.Save
wb.Close
'Clean up
Xl.Quit
Set ws = Nothing
Set ws2 = Nothing
Set ws3 = Nothing
Set ws4 = Nothing
Set wb = Nothing
Set Xl = Nothing
End Sub
解决方案
当我从 Access 使用 Excel 执行大量复制粘贴操作时,我想我遇到了一个奇怪的错误(可能相同)。比我创建了一个函数 ClearClipboard() 在所有这些操作之后我调用它。这里是:
Private Declare Function OpenClipboard Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function CloseClipboard Lib "user32" () As Long
Private Declare Function EmptyClipboard Lib "user32" () As Long
Public Function ClearClipboard()
OpenClipboard (0&)
EmptyClipboard
CloseClipboard
End Function
试试看。我希望它有所帮助。
推荐阅读
- c# - 使用 ValueChanged 和 EventCallback 时丢弃变量
- php - ErrorException (E_ERROR) 尝试访问关系表上的列时尝试获取非对象的属性
- c++ - 如何在 C++ 中将 void 函数传递给 void 指针
- bash - 将环境变量传递给 jq 命令
- ios - iOS:iPhone 11 Pro 上的手电筒级别
- aws-lambda - 在 serverless.yml 文件中,如何自定义默认的 http 响应模板?
- arrays - 在唯一元素上过滤 ARRAY of ARRAY of STRINGS
- c# - 在 Unity3D 中序列化嵌套的 JSON 数组
- python - 将 Minimax 与 Alpha-Beta Pruning 结合使用时如何找到最佳节点
- android - 如何在 ViewModel 中安全关闭数据库?