2014-11-17 3 views
0

Excel (2003)에 데이터를 전송하는 Access (2003) 단추가 있습니다. Excel 통합 문서를 연 다음 Access 하위 양식을 순환하고 데이터를 전송합니다.런타임 오류 13 형식 불일치, Excel에서 데이터를 Access로 전송

이 작동 방식에 대한 자세한 내용을 보려면 Excel에는 Access 하위 양식 ("Main", "Demographics", "History"등)의 이름이 포함 된 "Tables"범위가 있습니다. Excel에는 첫 번째 범위에있는 각 이름의 범위도 있습니다. 예를 들어, "인구 통계"범위에는 일련의 필드 이름 ("성", "성"등)이 있습니다. 따라서 첫 번째 루프는 하위 양식을 통해 이동하고 중첩 된 루프는 필드 이름을 통해 이동합니다. 그런 다음 각 입력란에 값을 전달하여 Excel을 실행합니다. Excel은 또한 "Demographics_Anchor"및 "History_Anchor"등의 범위를 가지며, 각 범위 옆에있는 열의 첫 번째 값입니다 (즉, 인구 통계 범위는 성, 성, 오른쪽은 데이터가있는 곳입니다. 항목의 이름이 FirstName이고 오른쪽의 "Demographics_Anchor"는 firstname이있는 곳이며, 성은 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을 통과하는 것처럼 마지막으로 폭탄을 터뜨립니다. 모든 범위가 정확하고 null 값을 포함하지 않는지 확인했습니다. 코드는이 줄에서 폭탄을 터뜨립니다 : Set CControl = CForm.Controls (CControlName) 이것은 두 번째 루프의 맨 아래에 있습니다.

도와주세요! 나는이 코드를 사용하여 몇 주를 보냈으며 운이 없었습니다. 이 정확한 코드는 제가 작업해온 다른 모든 데이터베이스에서 작동합니다.

답변

1

Excel 범위에서 CControlName 컨트롤의 이름이 표시되지만이 컨트롤의 값을 Access 폼의 컨트롤 Set CControl = CForm.Controls(CControlName)에 설정하면됩니다. 이 경우 가장 가능성있는 설명은 아마도 CControlName이 실제로 액세스 양식 (오타 일 가능성이 있음)에없는 것일 수 있습니다.

VBA IDE에서 도구 메뉴로 이동하여 옵션을 선택한 다음 일반 탭을 선택하십시오. Error Trapping 섹션에서 "Break on All Errors"옵션을 선택하고 "OK"를 클릭하여 환경 설정을 설정하십시오. 코드를 다시 실행하십시오. 오류가 발생하면 VBA는 오류를 일으킨 회선에서 처리를 중지합니다. CControlName의 값을 확인하고 액세스 양식에 실제로 있는지 확인하십시오.

+0

오류 처리에 대한 경험이 없습니다. 이 기능을 사용하는 방법을 지적 해 주셔서 감사합니다. CControlName의 가치를 어떻게 볼 수 있는지 자세히 설명해 주시겠습니까? 평소와 같이 오류가 발생했지만 변수 값을 볼 수있는 곳을 어디에도 알 수 없습니다. 이걸 보여줄 수있는 것이 내가있을 수 있습니까? 감사! – JohnT

+0

오! 변수를 가리키면 표시됩니다. 환상적입니다! 내 코드 전체에서 수십 개의 MsgBoxes 사용을 중단 할 수 있습니다. 고맙습니다!!! 이것은 내 문제를 해결하고 나는 그 문제를 발견했다. 당신이 옳았는데, 제 필드 중 하나에 오자가있었습니다. – JohnT

관련 문제