Что заставляет весь столбец ListBox быть пустым? - PullRequest
0 голосов
/ 24 января 2019

Я работаю над проектом Excel, где у меня есть пользовательская форма VBA с двумя элементами управления ListBox.Я загружаю их, присваивая массив свойству List.Появляются все ожидаемые данные, за исключением седьмого столбца, который является полностью пустым.

Почему весь этот столбец пуст?

Дополнительные сведения:
Theмассив содержит около 15 столбцов и 25 строк.
Седьмой столбец массива указан в Locals как тип Variant / Decimal.Он содержит UPC значений (до 14 цифр), хранящихся в базе данных как DECIMAL (14,0).
Ни одно из значений UPC не имеет значения NULL или пусто.Они действительно отображаются в массиве в окне Locals, и их можно получить из ListBox, просто не видно.
ListBox имеет ListStyle fmListStylePlain и MultiSelect fmMultiSelectMulti.
Хотя вы не можете Dim (объявить) переменную как Decimalможно преобразовать в десятичное число с помощью функции CDec: ?typename(CDec(4.5)) в окне Immediate.


Минимальный пример:
Создать пользовательскую форму с ListBox (Listbox1), двумя элементами управления TextBox (TextBox1 иTextBox2) и две кнопки команд (CommandButton1 и CommandButton2).
В модуле кода пользовательской формы вставьте следующий код:

Private Sub CommandButton1_Click()
    Dim x(0 To 0, 0 To 0)

    x(0, 0) = CDec(TextBox1.Text)
    ListBox1.List = x

    TextBox2.Text = ListBox1.List(0, 0)
End Sub

Private Sub CommandButton2_Click()
    Dim x(0 To 0, 0 To 0)

    x(0, 0) = CDbl(TextBox1.Text)
    ListBox1.List = x

    TextBox2.Text = ListBox1.List(0, 0)
End Sub

Annotated Screenshot

ЗапуститеUserForm, введите число (с десятичными знаками или без) в TextBox1, затем нажмите CommandButton1.ListBox1 остается пустым, но Textbox2 показывает значение.
Нажмите CommandButton2.ListBox1 и TextBox2 показывают значение.

1 Ответ

0 голосов
/ 24 января 2019

Очевидно, VBA ListBox не может обрабатывать значения Variant / Decimal.Мне не удалось найти авторитетный источник, чтобы объяснить это, но я обнаружил, что преобразование десятичных значений в текст с использованием функции Format было эффективным.

Dim vData as Variant
Dim lRow as Long

'fill vData array from database here
...

'convert seventh column to zero-padded 14-character string in this loop:
For lRow = LBound(vData,1) to UBound(vData,1)
    vData(lRow, 6) = Format(vData(lRow, 6), "00000000000000")
Next lRow
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...