Excel VBA: динамический диапазон для значений ComboBox.Rowsource не отображается, когда пользовательская форма вызывается из командной кнопки

Название должно дать четкое представление о проблеме, но я запускаю динамический именованный диапазон для использования в поле со списком в пользовательской форме. Когда я запускаю форму, значения отображаются так, как предполагалось. Когда я вызываю подпрограмму модуля с помощью командной кнопки, значения не отображаются, и я понятия не имею, почему.

Я вставлю весь код и выделю оскорбительные фрагменты ниже:

Private Sub btnGetGAToken_Click()
'--------------------------------
'Obtain API Token from Google Analytics (GA), indicate to user that token has been obtained and populate Account combobox
'with a unique list of accounts, which will in turn populate the Profile combobox with the profiles associated with the chosen
'account
'--------------------------------

Dim txtEmailField As String
Dim txtPasswordField As String

'Values written to sheet for use in UDFToken and UDFGetGAAcctData array formulas
Range("FieldEmail").Value = Me.txtEmailField.Text
Range("FieldPassword").Value = Me.txtPasswordField.Text

Range("GAToken").Calculate

With Me.lblGATokenResponseField
    .Caption = Range("GAToken").Value
    .ForeColor = RGB(2, 80, 0)
End With

Call FindUniqueAccountNames

cboAccountNamesComboBox.RowSource = Sheet1.Range("ListUniqueAccountNames").Address

End Sub

Private Sub cboAccountNamesComboBox_Change()

'Value written to sheet for use in the 'ListProfileNames' dynamic, named range
Range("ChosenAccount").Value = Me.cboAccountNamesComboBox.Value

With Me.cboProfileNamesComboBox
    .Value = ""
    .RowSource = Sheets("CodeMetaData").Range("ListProfileNames").Address
End With

End Sub

Динамический диапазон был создан с помощью менеджера имен и представлен ниже:

Именованный диапазон: "ListUniqueAccountNames" = OFFSET(CodeMetaData!$J$5,0,0,COUNTA(CodeMetaData!$J$5:$J$5000))

и для простоты использования код, который я использую для его запуска, приведен ниже:

cboAccountNamesComboBox.RowSource = Sheets("CodeMetaData").Range("ListUniqueAccountNames").Address

Подпрограмма, вызывающая пользовательскую форму, находится здесь:

Public Sub ShowReportSpecsForm()

Load frmReportSpecs
frmReportSpecs.Show

End Sub

Простите меня за публикацию такого большого количества кода, но я не уверен, что именно вызывает проблему - я все еще очень новичок с формами.

Любая помощь будет оценена. Спасибо.


person Kurt    schedule 23.07.2011    source источник
comment
при отладке вы проверяли значения Sheets("CodeMetaData").Range("ListUniqueAccountNames").Address?   -  person JMax    schedule 25.07.2011


Ответы (2)


Если вы используете свойство rowsource и именованные диапазоны, я бы предложил установить свойство rowsource для поля со списком во время разработки. Затем для отладки, где требуется, используйте:

Debug.Print Range("ListUniqueAccountNames").Address

Это вернет именованный адрес диапазона в непосредственное окно, где вы можете проверить его правильность.

person Reafidy    schedule 25.07.2011

Помните, что свойство Address из именованного динамического диапазона возвращает обычный статический адрес.

Например, Range("ListUniqueAccountNames").Address может возвращать $J$5:$J$20.

Вам не нужно использовать адрес Excel в свойстве RowSource. Вы можете использовать имя Excel.

Кроме того, когда вы показываете пользовательскую форму, необходимо обновить свойство RowSource из элемента управления ComboBox или ListBox, чтобы обновить его значения. (Управление Excel не следит за изменением диапазона или данных)

Это обновление может быть выполнено внутри события Activate (оно запускается непосредственно перед формой Show и показано ниже) и в любой ситуации, когда данные или диапазон изменяются.

Private Sub UserForm_Activate()
  Me.cboAccountNamesComboBox.RowSource = ""
  Me.cboAccountNamesComboBox.RowSource = "ListUniqueAccountNames"
End Sub
person Paulo Buchsbaum    schedule 15.11.2012