Вызовите пользовательскую форму и используйте диапазон из другой рабочей книги - PullRequest
0 голосов
/ 02 апреля 2020

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

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

    Load FrmVendor
    FrmVendor.Show
Private Sub FrmVendor_Initialize(myNamedRangeDynamicVendorName As Range, myNamedRangeDynamicVendorCode As Range)

'add column of data from spreadsheet to userform ComboBox
    cboxVendorName.RowSource = myNamedRangeDynamicVendorName.Address(external:=True)
    cboxVendorCode.RowSource= myNamedRangeDynamicVendorCode.Address(external:=True)
    cboxVendorCode.ColumnCount = 2

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

Option Explicit
Private m_Cancelled As Boolean


Sub NamedRanges(wb As Workbook, wSh As Worksheet)
    Dim myNamedRangeDynamicVendor As Range
    Dim myNamedRangeDynamicVendorCode As Range

'declare variable to hold defined name
    Dim myRangeNameVendor As String
    Dim myRangeNameVendorCode As String

'specify defined name
    myRangeNameVendor = "namedRangeDynamicVendor"
    myRangeNameVendorCode = "namedRangeDynamicVendorCode"

'Vendor Name range
    With wSh.Cells

        'find last row of source data cell range
        myLastRow = .Find(What:="*", LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row

        'specify cell range
        Set myNamedRangeDynamicVendor = .Range(.Cells(myFirstRow, "A:A"), .Cells(myLastRow, "A:A"))

    End With

 'Vendor Code range
    With wSh.Cells

        'specify cell range
        Set myNamedRangeDynamicVendorCode = .Range(.Cells(myFirstRow, "B:B"), .Cells(myLastRow, "B:B"))

    End With

'create named ranges
    ThisWorkbook.Names.Add Name:=myRangeNameVendor, RefersTo:=myNamedRangeDynamicVendor
    ThisWorkbook.Names.Add Name:=myRangeNameVendorCode, RefersTo:=myNamedRangeDynamicVendorCode
End sub



' Returns the cancelled value to the calling procedure
Public Property Get Cancelled() As Boolean
    Cancelled = m_Cancelled
End Property

Private Sub buttonCancel_Click()
    ' Hide the Userform and set cancelled to true
    Hide
    m_Cancelled = True
End Sub

' Hide the UserForm when the user click Ok
Private Sub buttonOk_Click()
    Hide
End Sub

' Handle user clicking on the X button
Private Sub FrmVendor_QueryClose(Cancel As Integer, CloseMode As Integer)

    ' Prevent the form being unloaded
    If CloseMode = vbFormControlMenu Then Cancel = True

    ' Hide the Userform and set cancelled to true
    Hide
    m_Cancelled = True

End Sub

Private Sub FrmVendor_Initialize(myNamedRangeDynamicVendorName As Range, myNamedRangeDynamicVendorCode As Range)

'add column of data from spreadsheet to userform ComboBox
    cboxVendorName.RowSource = myNamedRangeDynamicVendorName.Address(external:=True)
    cboxVendorCode.RowSource= myNamedRangeDynamicVendorCode.Address(external:=True)
    cboxVendorCode.ColumnCount = 2

End Sub


Sub Main Macro
'
'
'
    Call NamedRanges(wb, wSh)

    ' Display the UserForm
    Load FrmVendor
    FrmVendor.Show


    ' Clean up
    Unload FrmVendor
    Set FrmVendor = Nothing

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

Ответы [ 2 ]

1 голос
/ 02 апреля 2020

измените:

Load FrmVendor
FrmVendor.Show

на:

With New FrmVendor
    .Tag = myRangeNameVendor & "|" & myRangeNameVendorCode
    .Show
End With

, и вы не можете изменить подпись события Initialize, которое останется без параметров

Private Sub FrmVendor_Initialize()

    'add column of data from spreadsheet to userform ComboBox
    With Me
        .cboxVendorName.RowSource = ThisWorkbook.Names(split(.Tag,"|")(0)).Address(external:=True)
        .cboxVendorCode.RowSource= ThisWorkbook.Names(split(.Tag,"|")(1)).Address(external:=True)
    End With
    cboxVendorCode.ColumnCount = 2
End Sub

И вам следует пересмотреть:

ThisWorkbook.Names.Add Name:=myRangeNameVendor, RefersTo:=myNamedRangeDynamicVendor
ThisWorkbook.Names.Add Name:=myRangeNameVendorCode, RefersTo:=myNamedRangeDynamicVendorCode

, чтобы использовать Range Address es вместо чистых Range s (Кстати, эти Range s никогда не устанавливаются)

edit:

убедитесь, что у вас есть myRangeNameVendor и myRangeNameVendorCode "visibile" в вашем Main Macro() sub: yuy может объявить их как Public constant s типа String и иметь они доступны по всему вашему проекту

Public Const myRangeNameVendor As String = "namedRangeDynamicVendor"
Public Const myRangeNameVendorCode As String = "namedRangeDynamicVendorCode"

Sub Main Macro
'
'
'
    Call NamedRanges(wb, wSh)

    With New FrmVendor
        .Tag = myRangeNameVendor & "|" & myRangeNameVendorCode
        .Show
   End With

   ...

И поэтому NamedRanges будет:

Sub NamedRanges(wb As Workbook, wSh As Worksheet)
    Dim myNamedRangeDynamicVendor As Range
    Dim myNamedRangeDynamicVendorCode As Range


    'Vendor Name range
    With wSh.Cells

        ...
0 голосов
/ 10 апреля 2020

С помощью справки из @HTH, приведенного выше, чтобы внести изменения в имена диапазонов, у меня все еще была проблема с заполнением поля со списком. Из другой ветки, которую я разместил, проблема была решена с помощью комбинации ответов @HTH и @ CDP1802.

Ссылка: Пользовательские списки, не заполненные диапазоном внешних данных

Main код, который необходимо изменить

  • Переместил все подпрограммы и процедуры пользовательской формы в код пользовательской формы
  • Удален код инициализации
  • Скорректированы именованные диапазоны в соответствии с ответом @HTH выше
  • Изменен код .tag для установки адресов комбинированного списка

Код .tag обычно работал, но вызывал проблемы для меня, поэтому пришлось изменить его на следующий (полный ответ и описание в приведенной выше ссылке, ответ по @ CDP1802)

    ' Display the UserForm
With New FrmVendor
    .cboxVendorName.RowSource = wb.Names(myRangeNameVendor).RefersToRange.Address(external:=True)
    .cboxVendorCode.RowSource = wb.Names(myRangeNameVendorCode).RefersToRange.Address(external:=True)
    .Show
    VendorName = .cboxVendorName.Value
    VendorCode = .cboxVendorCode.Value
End With
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...