1

mssqlデータベースの192個のテーブルに対応する192個のワークシートを含むワークブックがあります。データ接続ウィザードで特定のテーブルを設定すると、すべてのデータがワークシートに適切にダンプされます。ただし、以下のコードを実行すると、次のようになります。

ランタイムエラー'214767259(80004005)'自動化エラー不特定のエラー

テーブルの約半分は問題なく表示されます。大量のデータ(rtfテキスト)を含むフィールドに到達すると、エラーが発生することに気付きました。そのテキストを含むフィールドは私にとって重要ではないので、Excelがそれらを空白のままにして続行できれば、私は幸せです。その大きなフィールドは、各テーブルに応じて異なる列(場合によっては複数の列)にあるため、インポートしないように個々の列を取り除くために192個のテーブルすべてを調べる必要があるのは時間がかかります。

vbaで実行するとこのエラーが発生するのに、データ接続ウィザードに問題がないのはなぜですか?

Sub GetData()

Dim cnDump As ADODB.Connection
Set cnDump = New ADODB.Connection

' Provide the connection string.
Dim strConn As String

'Use the SQL Server OLE DB Provider.
strConn = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=True;Initial Catalog=XXXX;Data Source=XXXX\XXXX;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=XXXX;Use Encryption for Data=False;Tag with column collation when possible=False;"

'Now open the connection.
cnDump.Open strConn


' GET DATA
Dim ws As Worksheet
Dim tbl_name As String

Dim rsDump As ADODB.Recordset
Set rsDump = New ADODB.Recordset

For Each ws In Worksheets

tbl_name = ws.Name
ws.Rows.ClearContents

With rsDump

    .ActiveConnection = cnDump
    .Open "SELECT * FROM " & tbl_name

    For i = 1 To .Fields.Count
     ws.Cells(1, i) = .Fields(i - 1).Name
    Next i


    ws.Range("A2").CopyFromRecordset rsDump

End With


ws.Rows(1).Font.Bold = True


Next ws

cnDump.Close
Set rsDump = Nothing
Set cnDump = Nothing



End Sub
4

2 に答える 2

0

エラーをトリガーするこれらのフィールドが重要でない場合は、

On Error Resume Next

方法 ?

または、無視されるべきではないときに無視される別のエラーを回避したい場合は、次を追加してエラーをより正確に処理します。

Sub GetData()

On Error GoTo GetData_Error

[your code here]

On Error GoTo 0
Exit Sub

GetData_Error:

If Err.Number=214767259 Then''assuming this is the correct code, you might need to track it     before using Debug.Print Err.Number

Err.Clear
Resume Next

End If

End Sub

編集:

Resume Nextメソッドが指定されたテーブルのコピー全体を停止することに言及するときは、コメントを再確認してください。これは、レコードセット全体を一度にコピーするためです。フィールドをループした場合、エラーはフィールド自体に発生し、次のテーブルではなく次のフィールドに戻ります。仕事でそれを行うコードのサンプルが必要です。興味があれば明日投稿します。

于 2012-10-29T20:54:40.550 に答える
0

私は次の手順を使用して多次元レコードセットをスプレッドシートにインポートします。多分、見て、あなたのケースに適応してみてください。これにより、一度に1つのフィールドを処理し、エラーの原因となったフィールドのみをスキップできます。

Resume Next

コピーする前にフィールドの内容を確認するか

If Len(Rs.Fields(a,b))<500 Then MySheet.MyCell.Value=Rs.Fields(a,b)

手順は次のとおりです。

j = -1

Dim MyArray As Variant
ReDim MyArray(RS.RecordCount, RS.Fields.Count)

If RS.RecordCount = 0 Then

    ReDim MyArray(0, 0)
    MyArray(0, 0) = "No Data"

Else

    Do While Not (RS.EOF)

    j = j + 1

        For i = 0 To RS.Fields.Count - 1

            MyArray(j, i) = Trim(RS.Fields(i))

        Next i

        RS.MoveNext

    Loop

End If

お役に立てれば

于 2012-10-30T08:54:29.747 に答える