为什么当我在不同的 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
.
你应该在适用的情况下使用 Codename
s 或 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
为了进一步阅读 ActiveWorkbook
、ActiveSheet
和 Select
,我建议 this answer 回答另一个问题。
我不明白这里发生了什么......当我 运行 来自 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
.
你应该在适用的情况下使用 Codename
s 或 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
为了进一步阅读 ActiveWorkbook
、ActiveSheet
和 Select
,我建议 this answer 回答另一个问题。