运行时错误 13 类型不匹配,将数据从 Access 传输到 Excel
Posted
技术标签:
【中文标题】运行时错误 13 类型不匹配,将数据从 Access 传输到 Excel【英文标题】:Run-time error 13 Type Mismatch, Transferring data from Access to Excel 【发布时间】:2014-11-17 15:49:34 【问题描述】:我在 Access (2003) 中有一个按钮,可将数据传输到 Excel(也是 2003)。它打开 Excel 工作簿,然后循环访问 Access 子窗体并传输数据。
为了提供有关其工作原理的更多信息,Excel 有一个名为“表”的范围,其中包含 Access 子窗体的名称(“主”、“人口统计”、“历史”等)。 Excel 还为第一个范围中的每个名称提供了一个范围。例如,“Demographics”范围包含一系列字段名称(“FirstName”、“LastName”等)。所以第一个循环遍历子表单,嵌套循环遍历字段名。然后每个字段将其中的值传递给excel。 Excel 还具有“Demographics_Anchor”和“History_Anchor”等范围,这是每个范围旁边的列中的第一个值(即范围 Demographics 有名字、姓氏,右边是数据的去向。所以第一个范围内的项目是 FirstName,右侧的“Demographics_Anchor”是名字所在的位置。然后 LastName 转到 Demographics_Anchor,从锚点向下偏移 1 或 1 个单元格)。
Dim ThisForm As Form
Dim CForm As Object
Dim CTab As TabControl
Dim CControl As Control
Dim CurrentTab As Variant
Dim CControlName As Variant
Dim CControlValue As String
Dim Code As Control
Dim counter1 As Integer
Dim appExcel As Object
Dim Anchor As Object
Dim PageRange As Object
Dim ControlNameRange As Object
strpath = "C:\blah\blah\filename.xlsm"
Set appExcel = CreateObject("Excel.Application")
appExcel.Workbooks.Open Filename:=strpath, UpdateLinks:=1, ReadOnly:=True
Set wbk = appExcel.ActiveWorkbook
Set PageRange = appExcel.Range("Tables")
'set Access environment
Set ThisForm = Forms("frmHome")
Set CTab = ThisForm.Controls("Subforms")
'export the data from Access Forms to Excel
For Each CurrentTab In PageRange
If CurrentTab = "Main" Then
Set CForm = ThisForm
Else
CTab.Pages(CurrentTab).SetFocus
Set CForm = ThisForm.Controls(CurrentTab & " Subform").Form
End If
Set ControlNameRange = appExcel.Range(CurrentTab)
Set Anchor = appExcel.Range(CurrentTab & "_Anchor")
counter1 = 0
For Each CControlName In ControlNameRange
Set CControl = CForm.Controls(CControlName)
CControl.SetFocus
Anchor.Offset(RowOffset:=counter1).Value = CControl.Value
counter1 = counter1 + 1
Next CControlName
Next CurrentTab
我希望这能解释代码中发生了什么。我只是想不通为什么这会一直与类型不匹配(错误 13)轰炸。
数据确实传输。它遍历整个代码,并且每条数据都正确传输。它在最后轰炸了,就好像它上次不应该通过代码 1 一样。我确实确认每个范围都是正确的并且不包含任何空值。代码在这一行中爆炸: Set CControl = CForm.Controls(CControlName) 位于第二个循环的底部。
请帮忙!我花了数周时间处理这段代码,但没有运气。这个确切的代码适用于我使用过的所有其他数据库。
【问题讨论】:
【参考方案1】:您从 Excel 范围中获取控件的名称 CControlName
,但随后将此控件的值设置为 Access 表单上的控件 Set CControl = CForm.Controls(CControlName)
。由此,最可能的解释可能是 CControlName
实际上不在 Access 表单上(可能是错字?)。
在 VBA IDE 中,转到“工具”菜单下,选择“选项”,然后选择“常规”选项卡。在 Error Trapping 部分下,选择“Break on All Errors”选项,然后单击“OK”设置首选项。再次运行您的代码;当遇到错误时,VBA 将停止对导致错误的行进行处理。检查CControlName
的值并确保它确实存在于Access 表单中。
【讨论】:
我没有错误处理经验。感谢您指出如何打开它。您能否详细说明我如何查看 CControlName 的值?它像往常一样给了我错误,但我看不到任何可以查看变量值的地方。我可以打开什么东西来显示这些东西吗?谢谢! 哦!!!您将鼠标悬停在变量上并显示它。那太棒了!我可以在我的代码中停止使用大量的 MsgBoxes。谢谢你!!!这解决了我的问题,我发现了问题。你是对的,我的一个字段有错字。以上是关于运行时错误 13 类型不匹配,将数据从 Access 传输到 Excel的主要内容,如果未能解决你的问题,请参考以下文章
VB6:运行时错误“13”:设置和 int 时类型不匹配 int
查找文件夹/子文件夹名称时 MS Access VBA 运行时错误“13”类型不匹配
打开金蝶kis专业版提示:运行时错误'13'类型不匹配是怎么回事?