1

ADO ( ) を使用して Excel 2003 から Access 2003 にスプレッドシートをインポートしていますProvider = "Microsoft.Jet.OLEDB.4.0"。ただし、日付フィールドにいくつかのテキスト エントリがあります。ご想像のとおり、これらは#Num!値として表示されます。

私がやりたいのは、問題のあるフィールドを次のようにラップすることですIIf(IsDate(FIELDNAME),FIELDNAME,#1/1/1900#)。ただし、これでも#Num!. IsDate()IsDate(CVar())IsError()IsError(CDat())、およびのテストも同様VBAFunctionThatReturns0GivenAnyValue(FIELDNAME)です。

誰でも私が使用できるラッパー関数のアイデアを持っていますか? 私は多かれ少なかれ私の機知に富んでいますか?

注: インポートされたデータを制御できないため、スプレッドシートを修正することはできません。また、インポート関数自体で特定のハッカーを回避したいと思います (たとえば、代わりに TransferSpreadsheet を使用します)。目標は、データを取り込むために同じアプローチを使用することです。機能しないビットは無視してください。

また、ここで日付以外の値を破棄することが適切であることも指摘する必要があります。テキストとしてインポートすることは、理想的には避けたいものです。これは、チェーンのさらに下にある他のあらゆる種類のエラーを引き起こすためです。

編集: 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]。それらのいずれかが#Num!次の結果である場合でも#Num!、すべての Test1-5 に対して s が発生し、むしろ問題を示しています。

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
4

2 に答える 2

0

#ナンバー!エラーは、クエリでのエラー処理に使用できるほとんどのエラー アプローチに到達する前に、プロバイダーによって発生したように見えます。ADO に固執すると、失敗する傾向があるようです。

ただし、DAO でクエリをテストすると (INTOレコードセットを生成するだけの句なしで)、有効な 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

私のニーズでは、これでうまくいきますが、本当にエレガントなアプローチがある場合に備えて、まだ数日間は答えとして受け入れません.

于 2013-05-13T15:43:54.443 に答える