为什么当我在不同的 sheet 时 ComboBox 加载不同的数据?

Why is the ComboBox loading different data when I am on a different sheet?

我不明白这里发生了什么......当我 运行 来自 sheets(1) 的代码处于活动状态时,用户表单保管箱加载得很好,但是当我转移到sheets(2) 处于活动状态,它认为 shhet (1)- 第 4 行是我数据的结尾...(恰好是 sheet 代码设置为命令按钮...)

我很特别吗???

这是代码...

    Private Sub UserForm_Initialize()   'sets up combobox's

    PurchUnit.List = Sheets(1).Range("PurchasingSizes" & Range("K41").End(xlUp).Row).Value
    UoM.List = Sheets(1).Range("ConvAbv").Value

    End Sub

所以最终我需要它来识别我的数据列表,而不管我在哪个 sheet 上。另外,如果您能解释为什么要这样做……我对此感到很困惑!

我很确定 Range("K41") 用于构建 outer 范围的参数将使用 current sheet。表达式开头的 Sheets(1) 只会影响它 明确 绑定的范围,而不是括号内的所有范围。

如果您想在 sheet 1 上使用 K41,您可能应该改用 Sheets(1).Range("K41")。换句话说:

PurchUnit.List = Sheets(1).Range("PurchasingSizes" & _
    Sheets(1).Range("K41").End(xlUp).Row).Value
'   ^^^^^^^^^^
'   Added this bit.

像这样在每个范围引用中引用 Sheet(1)

Private Sub UserForm_Initialize()   'sets up combobox's
   PurchUnit.List = Sheets(1).Range("PurchasingSizes" & sheet(1).Range("K41").End(xlUp).Row).Value
   UoM.List = Sheets(1).Range("ConvAbv").Value
End Sub

或者更好

Private Sub UserForm_Initialize()   'sets up combobox's
  With Sheets(1)
     PurchUnit.List = .Range("PurchasingSizes" & .Range("K41").End(xlUp).Row).Value
     UoM.List = .Range("ConvAbv").Value
  End with
End Sub

正如其他人所指出的:Range() 引用了活动的 sheet。
你不想要的,所以你需要更好的参考,正如其他答案所指出的那样,一种方法是在每个 Range() 实例之前添加 Sheets(index) ,无论是添加 With Sheets(index) 在行之前并在每个 Range() 实例之前放置一个 . 或在它之前添加 Sheets(index) 本身。

目前,这对您有用,但是 Sheets(index) 使用起来也不安全,尤其是当您不知道所引用的内容时。
我使用 index 而不是 1 的原因是:Sheets(index) 在特定索引处或具有特定名称的 ActiveWorkbook 引用 Sheet 对象,比如说 Sheets("Sheet 1") 将引用工作簿的第一个 sheet 如果您没有更改它的名称,并且最重要的是,索引是 variable 因为它改变了每次将 Sheet 移动到工作簿中。
将您的第二个 Sheet 移动为第一个 Sheet 将导致您的代码引用您不希望被引用的 Sheet。

为了解决这个问题,您应该使用 sheet 的 Codename,它可以在 VBE 中查看和更改。然而,Codename 无法在 运行 时更改,这在您或您的用户手动移动 Sheet 或更改其名称时有很大帮助。这总是偶然发生的。

总而言之,您应该始终使用 ThisWorkbook,它引用代码为 运行 的工作簿,而不是隐含的 ActiveWorkbook.
你应该在适用的情况下使用 Codenames 或 Sheets,在你的情况下,如果我假设你使用英文 Excel 版本并且没有更改 Codename 它会看起来像这样:

Private Sub UserForm_Initialize()   'sets up combobox's
    PurchUnit.List = Sheet1.Range("PurchasingSizes" & Sheet1.Range("K41").End(xlUp).Row).Value
    UoM.List = Sheet1.Range("ConvAbv").Value
End Sub

为了进一步阅读 ActiveWorkbookActiveSheetSelect,我建议 this answer 回答另一个问题。