2013-05-13 5 views
0

ADO (Provider = "Microsoft.Jet.OLEDB.4.0")를 사용하여 Excel 2003에서 Access 2003으로 스프레드 시트를 가져오고 있습니다. 그러나 날짜 필드에 일부 텍스트 항목이 있습니다. 예상대로 이러한 값은 #Num! 값으로 전달됩니다.#Num! Excel을 Access로 가져 오는 중 오류가 발생했습니다.

내가하고 싶은 것은 문제가되는 필드를 IIf(IsDate(FIELDNAME),FIELDNAME,#1/1/1900#)과 같이 감싸는 것입니다. 그러나 이는 여전히 #Num!입니다. 따라서 테스트는 IsDate(), IsDate(CVar()), IsError(), IsError(CDat())VBAFunctionThatReturns0GivenAnyValue(FIELDNAME)입니다.

누구나 사용할 수있는 랩퍼 기능에 대해 알고 있습니까? 내 재치가 끝나면 더 많든 적든?

참고 : 가져온 데이터를 제어 할 수 없으므로 원하는대로 스프레드 시트를 수정할 수 없습니다. 또한 가져 오기 기능 자체에서 특정 해커가 발생하지 않도록하고 싶습니다 (예 : 대신 TransferSpreadsheet 사용). 목표는 데이터를 가져 오는 데 동일한 접근 방식을 사용하는 것입니다. 작동하지 않는 비트는 무시하십시오.

또한 여기서 날짜가 아닌 값은 삭제하는 것이 적절하다는 점을 지적해야합니다. 텍스트로 가져 오기는 이상적으로 내가 피하고 싶습니다. 이후 모든 종류의 다른 오류가 체인 아래로 이어질 것이기 때문입니다.

EDIT : 2003 규정을 추가했습니다. 환경에 설치된 .Net 프레임 워크의 버전에 ACE.12.0 공급자가 포함되어 있지 않거나 포함되지 않는 것으로 나타납니다.

편집 2 : 요청에 따라 실행중인 SQL을 (약간 청소 한) 버전입니다. 그것은 정확한 쿼리 아니다주의,하지만 같은 스프레드 시트에서이 작업을 실행하면 같은 문제가 발생하십시오

SELECT 
    CStr(Nz([Notes], "")), 
    [ID], 
    [Date] 
INTO 
    [;DATABASE=C:\DatabaseTarget.Mdb].[tblImport] 
FROM 
    [Excel 8.0;Database=C:\ExcelSheet.xls].[sheet1$] 
WHERE 
    [ID] IS NOT NULL 

문제는 INTO 절을 복용하고 [Date]의 값을 보면 알 수있다. 그 중 하나는 그 후도 오히려 문제 : 그것은 작동해야처럼 IsNull()의 모양에 대한

SELECT 
    CStr(Nz([Notes], '')), 
    [ID], 
    CStr(Nz([Date],'')) As [Test1], 
    IsError([Date]) As [Test2], 
    IsDate([Date]) As [Test3], 
    IsNull([Date]) As [Test4], 
    IIf(True, 1, [Date]) As [Test5], 
FROM 
    [Excel 8.0;Database=C:\ExcelSheet.xls].[sheet1$] 
WHERE 
    [ID] IS NOT NULL 

답변

0

테스트를 보여줍니다 모든 Test1-5에 대한 #Num!의에서 다음과 같은 결과를하고 #Num!을 경우. 엑셀 데이터 ...

ID ActivityDescription ActivityDate 
1 activity_1   2013-05-12 
2 activity_2   2013-05-13 
3 activity_3   2013-05-14 
4 activity_4   2013-05-15 
5 activity_5   2013-05-16 
6 activity_6   2013-05-17 
7 activity_7   2013-05-18 
8 activity_8   2013-05-19 
9 activity_9   2013-05-20 
10 activity_10   2013-05-21 
11 activity_11   2013-05-22 
12 activity_12   2013-05-23 
13 activity_13   oops! 
14 activity_14   2013-05-25 
15 activity_15   2013-05-26 

... 다음 액세스 VBA 코드 ...

Sub adoTest() 
Dim con As ADODB.Connection, rst As ADODB.Recordset 
Set con = New ADODB.Connection 
con.Open _ 
     "Provider=Microsoft.JET.OLEDB.4.0;" & _ 
     "Data Source=C:\Users\Public\xlsTest.xls;" & _ 
     "Extended Properties=""Excel 8.0;HDR=YES"";" 
Set rst = New ADODB.Recordset 
rst.Open "SELECT * FROM [Sheet1$]", con 
Do While Not rst.EOF 
    Debug.Print _ 
      Format(rst("ID").Value, "00") & _ 
      " " & _ 
      IIf(IsNull(rst("ActivityDate").Value), "<NULL>", rst("ActivityDate").Value) 
    rst.MoveNext 
Loop 
rst.Close 
Set rst = Nothing 
con.Close 
Set con = Nothing 
End Sub 

들어 ...이 생성됩니다

01 2013-05-12 
02 2013-05-13 
03 2013-05-14 
04 2013-05-15 
05 2013-05-16 
06 2013-05-17 
07 2013-05-18 
08 2013-05-19 
09 2013-05-20 
10 2013-05-21 
11 2013-05-22 
12 2013-05-23 
13 <NULL> 
14 2013-05-25 
15 2013-05-26 

IsNull() 인식 것을 보여줍니다 "bad"날짜 값을 Null으로 바꾸고 대신 텍스트 <NULL>으로 대체하십시오.

문맥에 따라 Nz() 함수가 유용 할 수도 있습니다.

+0

ACE에서도 제대로 작동 할 수 있지만 불행히도 Office 2003과 같이 JET가 붙어 있습니다. 미안합니다. IsNull()을 사용했는지 확신 할 수 없습니다. Nz를 직접 테스트하거나 실행합니다. 상황에 따라 약간의 차이가 있습니다. 일부 텍스트 데이터가 올바르게 해석되지만 일부는 올바르게 해석되지 않기 때문입니다. – tobriand

+0

@tobriand 방금 Jet을 사용하여 코드를 테스트했으며 정확히 동일한 결과를 얻었습니다. (나는 나의 대답을 업데이트했다.) –

+0

나는 그것을 몇 분 후에 시험해보고 그것을 고쳐 주는지 보게 될 것이다. IsNull에서 데이터를 래핑하지 않으면 #Num도 생성됩니다. 오류? – tobriand

0

#Num! 쿼리에서 오류를 처리하는 데 사용할 수있는 대부분의 오류 접근 방식을 사용하기 전에 오류가 공급자에 의해 제기 된 것으로 보입니다. ADO를 고집하는 것은 실패하는 경향이 있습니다.

그러나, (단지 레코드를 생성하기 INTO 절없이) DAO 내 쿼리를 테스트하는 것은 올바른 SATA를 생산했다, 그래서 나는 DAO는 OLEDB의 레코드 원본에 쿼리를 처리 할 수있는 경우는 볼 가치가있을 수도 있습니다 생각. 그것이 될 수 있다고 밝혀졌습니다!

따라서 최종 코드는이 일을, 내 요구를 들어

On Error Resume Next 
cmdFirstTry.Execute '' Includes fields which are pulled through as #Num! errors 
Select Case Err.Number 
    Case 0 
     On Error Goto ErrorHandler 
    Case &H80040E14 
     '' Failed in this manner; Try with DAO 
     On Error Goto ErrorHandler 
     CurrentDb.Execute strSQL 
    Case Else 
     lngErrNum = Err.Number 
     strErrDesc = Err.Description 
     On Error Goto ErrorHandler 
     Err.Raise lngErrNum, , strErrDesc 
End Select 

같은 것을 보이지만, 아직 몇 일 동안 답변으로 수락하지 않습니다, 경우에 거기에 정말 우아한 방법입니다.

+0

실행중인 SQL 문은 무엇입니까? –

+0

위의 문제의 축소 버전을 추가했습니다. SQL 문은 Provider 등등에 대한 더 자세한 내용을 지정하지 않아도 DAO에서 잘 실행됩니다. 그러나 ADODB에 대한 비교 결과를 얻을 수 있습니다. – tobriand