簡體   English   中英

調用用戶表單並使用不同工作簿的范圍

[英]Call Userform and use range from different workbook

我試圖讓用戶窗體上的命令框填充從不同工作簿調用的命名范圍。 我有一個調用不同子程序和用戶表單代碼的主子程序。(代碼如下)

目前,用戶窗體加載但組合框是空的。 我認為問題在於調用主 Sub然后初始化 userform 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

任何幫助將不勝感激謝謝!

改變 :

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 從未設置過)

編輯:

確保您的Main Macro()子項中同時具有myRangeNameVendormyRangeNameVendorCode "visibile":yuy 可以將它們聲明為String類型的Public constant ,並在您的整個項目中使用它們

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

        ...

在上面@HTH 的幫助下對范圍名稱進行更改后,我仍然在填充組合框時遇到了問題。 從我發布的另一個帖子中,問題通過@HTH 和@CDP1802 答案的組合解決了。

鏈接:用戶表單組合框未填充外部數據范圍

需要更改的主要代碼

  • 將所有用戶表單子項和程序移至用戶表單代碼
  • 刪除了初始化代碼
  • 根據上面的@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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM