Передайте ComboBox в качестве аргумента в Sub или Function - PullRequest
0 голосов
/ 26 июня 2019

У меня проблемы с передачей ComboBox в качестве аргумента в подпроцесс. Раньше я использовал подпроцесс для упорядочивания содержимого каждого ComboBox, и сейчас я пытаюсь уменьшить код.

Я объясняю: Форма содержит N ComboBox (1, 2, ... N), каждый из которых заполнен содержимым столбца таблицы. Например:

Set NColumn = TStaff.ListColumns("NameStaff").DataBodyRange
Me.ComboBox1.List = NColumn.value
SortComboBox1

Set IDColumn = TStaff.ListColumns("IDStaff").DataBodyRange
Me.ComboBox2.List = IDColumn.value
SortComboBox2

...

SortComboBoxN

Код, используемый для заказа содержимого каждого ComboBox, следующий:

Private Sub SortComboBox1()
Dim i As Long
Dim j As Long
Dim sTemp As String
Dim LbList As Variant

LbList = Me.ComboBox1.List

For i = LBound(LbList, 1) To UBound(LbList, 1) - 1
    For j = i + 1 To UBound(LbList, 1)
        If LbList(i, 0) > LbList(j, 0) Then

            sTemp = LbList(i, 0)
            LbList(i, 0) = LbList(j, 0)
            LbList(j, 0) = sTemp
        End If
    Next j
Next i

Me.ComboBox1.Clear

Me.ComboBox1.List = LbList
End Sub

Private Sub SortComboBox2()
...
End sub

...

Private Sub SortComboBoxN()
...
End sub

То, что я ищу, это подпроцесс, который получает в качестве аргумента любой ComboBox (или его содержимое) и избегает повторения одного и того же кода для упорядочения каждого ComboBox.

Мой первый подход был такой, но возникает «ошибка 424» (требуется объект):

Modulo1:

Public CBox As ComboBox

UserForm (код)

Private Sub UserForm_Initialize()
...
Me.ComboBox1.List = NColumn.value
SortCBox (Me.ComboBox1)
Me.ComboBox2.List = IDColumn.value
SortCBox (Me.ComboBox2)
End Sub

Private Sub SortCBox(ByRef CBox As MSForms.ComboBox)
Dim i As Long
Dim j As Long
Dim sTemp As String
Dim LbList As Variant

LbList = CBox.List 

For i = LBound(LbList, 1) To UBound(LbList, 1) - 1
    For j = i + 1 To UBound(LbList, 1)
        If LbList(i, 0) > LbList(j, 0) Then
            sTemp = LbList(i, 0)
            LbList(i, 0) = LbList(j, 0)
            LbList(j, 0) = sTemp
        End If
    Next j
Next i

CBox.Clear

CBox.List = LbList
End Sub

В чем проблема? * Если у кого-то есть другой подход, спасибо за предложения

1 Ответ

0 голосов
/ 26 июня 2019

Ваша проблема заключается в том, как вы вызываете подпрограмму

SortCBox (Me.ComboBox1) ' <-- Wrong!

, которая будет оценивать Me.ComboBox1 в зависимости от значения по умолчанию, поэтому, скорее всего, вызовет SortCBox со строковым параметром - это не то, чтоты хочешь.

Вы должны вызвать подпрограмму через

SortCBox Me.ComboBox1 ' <-- Right!

, которая пропустит ее, как предполагалось.

Простое объяснение предоставлено Microsoft (https://docs.microsoft.com/en-us/office/vba/language/concepts/getting-started/using-parentheses-in-code).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...