5

VBA を使用して SQL クエリを実行し、結果を Excel ワークシートにコピーする際に問題が発生しています。

サブルーチンが実行されると、256 の倍数の行のみがコピーされます (したがって、行 256、512、768 などだけが Excel に入力されます)。データベースから他のフィールドをコピーするのに問題はありません。また、MySQL で同じクエリを実行すると、正常に動作します。SQL と VBA の両方にかなり慣れていないので、この特定のフィールドが問題を引き起こしている理由がわかりません。私が考えることができる唯一のことは、その内容が常にアンダースコアで始まる文字列であることです (そして、それが他のフィールドとの唯一の違いであるため、それについてのみ言及します)。

なぜこれが起こっているのかについて誰か考えがありますか?

乾杯、

リアム

編集: 問題のコードのスニペットを次に示します。正直なところ、他の状況でも問題なく機能するため、コードを見て違いが生じるかどうかはわかりませんが、それが私が初心者である理由です:)

        Dim con As ADODB.Connection
        Dim rst As ADODB.Recordset

        Set con = New ADODB.Connection
        Set rst = New ADODB.Recordset

        con.ConnectionString = "DRIVER={MySQL ODBC 5.1 Driver};SERVER=ipaddress;UID=userID;PWD=password;DATABASE=jiradb;OPTION=16427;"
        con.Open

        sql = "SELECT TEMPO_DATA FROM gssd_worklog WHERE WORK_DATE BETWEEN '2012-01-01' AND '2012-03-31'"

        'Open Recordset'
        rst.Open sql, con

        'Copy Data to Excel'
        Set ws = ActiveSheet

        ws.Range("A2").CopyFromRecordset rst
4

5 に答える 5

9

私は昨日非常によく似た問題に遭遇し、調査中にこのスレッドを見つけたので、他の誰かに役立つ場合に備えて私の「解決策」を追加したいと思いました。

問題の説明を絞り込むために、データセット内の1つの特定のフィールドに適用され、興味深いことに、クエリを並べ替えた場合は後続のすべてのフィールドに適用されることがわかりました。末尾のフィールドを追加したり、以前のフィールドを削除したりしても、問題の列に違いはありませんでした。

タイプをチェックすると、それが機能した他のフィールドのいくつかと同じタイプであることが明らかになったので、そこにも手がかりはありませんでした。

ただし、これは特定のフィールド(この場合はテキストフィールド)であったため、SQLクエリを変更して問題のフィールドをCASTに変更し、次のように変更することにしました。

SELECT Col1, Col2, Col3 FROM TableName

...に...

SELECT Col1, Col2, CAST(Col3 AS VARCHAR(8)) AS Col3 FROM TableName

...そして突然すべてのデータが表示されます(末尾の列を含む)。

于 2012-11-16T09:03:05.200 に答える
3

Lamakの助けのおかげで、解決策を見つけたと思います:

rst.Open sql, con

Dim iRows As Integer
For iCols = 0 To rst.Fields.Count - 1
    ws.Cells(1, iCols + 1).Select
    With Selection
        .Value = rst.Fields(iCols).Name
        .Font.Bold = True
        .EntireColumn.AutoFit
    End With
Next iCols

iRows = 2

While Not rst.EOF
    For iCols = 0 To rst.Fields.Count - 1
        ws.Cells(iRows, iCols + 1).Value = rst.Fields(iCols).Value
    Next iCols
    rst.MoveNext
    iRows = iRows + 1
Wend

問題は、レコード セットからすべてのフィールドを一度にコピーしようとしていたようです。レコード フィールドをフィールドごと、行ごとにコピーすると、問題が解決するようです。

于 2012-04-20T09:16:54.870 に答える
3

ワークシートのレコードをコピーしようとしているときに、最後の行に問題があると思います。次のようなものを試してください ( http://msdn.microsoft.com/en-us/library/aa223845(v=office.11 ​​).aspxから変更されたコード):

For iCols = 0 to rs.Fields.Count - 1
    ws.Cells(1, iCols + 1).Value = rst.Fields(iCols).Name
Next
ws.Range("A2").CopyFromRecordset rst
于 2012-04-19T13:12:16.653 に答える
1

レコードセットを使用して同様の問題が発生しました。一連の顧客結果が SQL クエリで問題なく返されますが、特定の顧客のワークシートに結果が貼り付けられません。

データをキャストするためのヒントに従って、クエリをさらに掘り下げたところ、結果セットに null 値が隠されていることに気付きました。レコードセットに null が表示されることから、その null 値 (その特定の列で並べられたもの) を超える結果はワークシートに貼り付けられません。

または擬似コードで:

SELECT DISTINCT a,b,e
FROM DATASET

ここで、列 c には null 値が含まれます。

だから私の解決策:Excelで使用する前に、SQLで結果セットの重複とnull値を削除してください。

于 2014-06-16T09:26:31.123 に答える