0

私はすでにこの問題に数回遭遇しており、今まで回避できました。また、万能の検索エンジンも役に立ちませんでした。

問題は、ADODB レコードセットからリストボックスまたはコンボボックスを作成したときに、たとえば次のように、すべての Decimal データ要素がボックスに表示されないことです (conn は ADODB 接続です)。

Private Sub GetFilteredRecords()
    Dim strSQL As String
    Dim arr As Variant

    'create the SQL
    strSQL = "SELECT * FROM vwStandard_Fee2"

    'execute the SQL and fill the rs ( rsFiltered )
    Set rsFiltered = conn.Execute(strSQL)

    'Apply recordset to the listbox on the form
    If Not (rsFiltered.EOF = True And rsFiltered.BOF = True) Then
        arr = rsFiltered.GetRows()
        With lbDeeper
            .ColumnCount = rsFiltered.Fields.Count
            .List = TransposeArray(arr)
        End With
        With cbDeeper
            .ColumnCount = rsFiltered.Fields.Count
            .List = TransposeArray(arr)
        End With
    End If

End Sub

上記には 6 列の Id が含まれており (すべて Type = Variant/Decimal と表示されます)、そのうちの含まれている値はすべて何らかの奇妙な理由で「表示」されていません。通常、文字列と日付の列のみが表示されます。小数は表示されますが、空です!

ここにいくつかのスニペットがあります:

arrの一般的なレイアウト

文字列を表示、小数を表示しない

EUR が表示され、その隣の小数フィールドが表示されていないことを確認してください。

コンボボックスの場合、そのリストアイテムを選択したときにその列が BoundColumn の場合に表示される 1 つの列の値を取得できますが、コンボボックスの値でのみ表示されます (まだリストにはありません)。

私の最初の回避策は、リストボックス/コンボボックスに追加する前にそれらを文字列値に変換することでしたが、この場合、詳細を確認せずにクエリ結果を Box.List に直接リンクしたいと考えています。したがって、回避策ではなく解決策を探しています。

要するに、私の数値フィールド項目は、何らかの奇妙な理由でデフォルトで非表示になっています。回避策は、項目を文字列値にすることでした。代わりに、このバグ/問題の解決策を探しています:

  1. これは何が原因ですか?
  2. それを解決する方法は?
4

2 に答える 2

1

OK after going through various possible causes it seems to be the case that:

VBA has no Decimal Variant Type of its own. VBA can handle Decimal from within a variable declared as Variant (thus becoming a Variant/Decimal) This normally doesn't stop your program from working, but in Controls like Listbox and Combobox the Type Variant/Decimal is not interpretable and thus wont draw that specific entry.

For example populate a listbox called lbHigher with this:

Private Sub ListBoxProblem()

    Dim tempArray(2, 2) As Variant

    tempArray(0, 0) = "A"
    tempArray(0, 1) = 1
    tempArray(0, 2) = 1.1
    tempArray(1, 0) = "B"
    tempArray(1, 1) = CStr(CDec(5.2))
    tempArray(1, 2) = 2.3
    tempArray(2, 0) = "C"
    tempArray(2, 1) = DateSerial(2012, 12, 13)
    tempArray(2, 2) = 100
    tempArray(3, 0) = "D"
    tempArray(3, 1) = -1
    tempArray(3, 2) = CDec(5.2)

    lbHigher.ColumnCount = 3
    lbHigher.List = tempArray
End Sub

Everything works fine except for the CDec(5.2). The CStr(CDec(5.2)) works fine as well as VBA will first have converted the Decimal to String before the Listbox gets to get it.

So either: Dont let the SQL generate any Decimal output OR convert any Decimal output to Single/Double/String/Integer/Long in VBA before handing it to the Listbox.

于 2012-12-13T10:06:35.877 に答える
1

すべての文字列データが表示されていますか? で、数字しか出てこない?

次に、数値を文字列に変換して、リストやコンボ ボックスに渡すことができます。あなたがすでに行ったことに気づきました。

何らかの理由で、行の最大数と配列/レコーダーの長さが一致しない場合、問題が発生する可能性もあります。ただし、レコードセットの行数を使用してコンボボックスの行を設定しているようです。配列を使用する代わりに、レコードセットを反復処理してコンボボックスに入力することはできますか? はい、これはパフォーマンスに優しくありません。最適化する前に、バグなしで動作するために必要なものを推測して購入してください。;-)

コンボボックスをレコードセットにバインドしましたか? 配列が 1 次元で、ボックスにフィードするデータがあるかどうかを確認できますか?

問題が解決しない場合は、DB に保存されたクエリを使用してリストボックスに入力してみてください。 ただし、SQL ステートメントに基づくリスト ボックスとコンボ ボックスは、保存されたクエリに基づくリスト ボックスとコンボ ボックスよりも低速です。

rowsourceプロパティを設定するために次のことを試すことができますか?number 列と test 列の両方で必ずテストしてください。古いコンボボックスと新しいコンボボックスだけでなく。

Rowsource->build query->
sqlview copy to rowsource property box-> 
delete or don't save that above built query since you already have SQL statement.

問題を絞り込む可能性を試してみたかっただけです。


最も考えられる問題と解決策で回答を更新する

私のコメントによると、彼らは主に、リストボックス/コンボボックスの作成に問題があると仮定して与えました

非常に重要なことを聞​​くのを忘れていました.2D配列をダンプしている場合に配列の列の値の1つが失われないようにするために、Option Base 1を宣言しましたか...? リストボックスにデータをダンプするために使用している配列の明示的な宣言がないため........ :)

リストボックスが複数列のデータを表示できるようになっていることを確認してください。

*つまり、3つの選択肢があります*

  • オプションベース1

  • 配列を ReDim し、ループして埋めて .list にダンプします。

  • ReDim 配列はとにかくループする必要があるため、recorset 自体を使用してデータを追加することもできます。

宣言されていないが、レコードセットからリストボックス/コンボボックスに転置された配列に次元の問題があるようです。したがって、宣言されていない配列は、複数列を適切に設定していません。それが、配列を適切に宣言すると機能する理由かもしれません.......

実際、あなたがそう言ったあなたのコメントで、

コードで配列を作成し、それをコードに入力すると (エントリごとに)、問題なく表示されます – K_B 14 分前

于 2012-12-13T03:51:34.860 に答える