当我在另一张纸上时,为什么ComboBox会加载不同的数据?

时间:2019-03-10 03:09:59

标签: excel vba list combobox userform

我不明白这里发生了什么...当我从sheets(1)运行代码时,用户窗体投递箱加载得很好,但是当我移到sheets(2)时,它却认为( 1)-第4行是我数据的结尾...(恰好是代码被设置为...上的命令按钮的工作表)

我只是特别吗?

这是代码...

    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

while im on sheets(2)

while im on sheets(1)

所以到今天结束时,我需要它来识别我的数据列表,而与我在哪张纸上无关。另外,如果您能解释为什么这样做的话...我对此感到很困惑!

3 个答案:

答案 0 :(得分:1)

像这样在每个范围参考中引用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

答案 1 :(得分:1)

正如其他人指出的那样:Range()引用了活动工作表。
您不希望这样做,因此需要更好的引用,这是其他答案所指出的一种方法是,在每个Sheets(index)实例之前添加Range(),无论是否通过添加{{1} },然后在每个With Sheets(index)实例之前放置.或在其之前添加Range()本身。

这暂时对您有效,但是 Sheets(index)也不安全,特别是当一个人不知道所引用的内容时。
我使用Sheets(index)而不是index是有原因的:1在特定索引或具有特定名称的情况下引用Sheets(index)的{​​{1}}对象,例如{ {1}}将引用工作簿的第一张表(如果您没有更改其名称的话),并且最重要的是,索引是 variable (可变的),因为每次将表移入内部时它都会更改工作簿。
将第二张工作表移动到第一张工作表将导致您的代码引用您不想被引用的工作表。

要解决此问题,您应该使用工作表的Sheet,可以在VBE内部对其进行查看和更改。但是ActiveWorkbook不能在运行时进行更改,这在您或您的用户手动移动表格或更改其名称时非常有用。总是会偶然发生的。

总结起来,您应该始终使用Sheets("Sheet 1"),而不是隐含的Codename,它引用了运行代码的工作簿。
而且,在您的情况下,您应该使用Codename份工作表,如果我假设您使用的是英文Excel版本并且未更改ThisWorkbook,则它看起来像这样:

ActiveWorkbook

为进一步阅读CodenameCodenamePrivate 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 ,我建议将this answer应用于另一个问题。

答案 2 :(得分:0)

我敢肯定,用于构造 outer 范围参数的Range("K41")将使用 current 工作表。表达式开头的Sheets(1)仅会影响它明确地绑定的范围,而不是所有带有括号的范围。

如果要在工作表1上使用K41,则应该改用Sheets(1).Range("K41")。换句话说:

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