运行时错误13类型不匹配,将数据从Access传输到Excel

时间:2014-11-17 15:49:34

标签: excel vba ms-access

我在Access(2003)中有一个按钮,用于将数据传输到Excel(也是2003)。它将打开Excel工作簿,然后循环访问Access子表单并传输数据。

为了提供有关其工作原理的更多信息,Excel有一个名为“Tables”的范围,其中包含Access子窗体的名称(“Main”,“Demographics”,“History”等)。 Excel还为第一个范围中的每个名称提供了范围。例如,范围“人口统计”包含一系列字段名称(“FirstName”,“LastName”等)。因此第一个循环遍历子表单,嵌套循环遍历字段名称。然后每个字段将其中的值传递给excel。 Excel还具有“Demographics_Anchor”和“History_Anchor”等的范围,这是每个范围旁边的列中的第一个值(即,人口统计数据具有名字,姓氏,右边是数据的位置。所以第一个范围中的项目是FirstName,右边的“Demographics_Anchor”是firstname将去的地方。然后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。我确认每个范围都是正确的,并且不包含任何空值。代码在这一行上爆炸:设置CControl = CForm.Controls(CControlName),它位于第二个循环的底部。

请帮忙!我花了几周时间处理这段代码并没有运气。这个确切的代码适用于我使用的每个其他数据库。

1 个答案:

答案 0 :(得分:1)

您将从Excel范围获取控件CControlName的名称,但随后将此控件的值设置为Access窗体Set CControl = CForm.Controls(CControlName)上的控件。从这一点来看,最可能的解释可能是CControlName实际上并不在Access表单上(可能是拼写错误?)。

在VBA IDE中,转到“工具”菜单,选择“选项”,然后选择“常规”选项卡。在错误捕获部分下,选择“中断所有错误”选项,然后单击“确定”以设置首选项。再次运行您的代码;遇到错误时,VBA将停止处理导致错误的行。检查CControlName的值,并确保它实际存在于Access表单上。