Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 为什么当我在不同的工作表上时,组合框会加载不同的数据?_Excel_Vba_List_Combobox_Userform - Fatal编程技术网

Excel 为什么当我在不同的工作表上时,组合框会加载不同的数据?

Excel 为什么当我在不同的工作表上时,组合框会加载不同的数据?,excel,vba,list,combobox,userform,Excel,Vba,List,Combobox,Userform,我不明白这里发生了什么。。。当我从激活的工作表(1)运行代码时,userform dropbox加载得很好,但是当我切换到激活的工作表(2)时,它认为shhet(1)-第4行是我数据的结尾。。。(这恰好是代码设置为命令按钮的工作表…) 我只是特别吗 这是代码 Private Sub UserForm_Initialize() 'sets up combobox's PurchUnit.List = Sheets(1).Range("PurchasingSizes" &

我不明白这里发生了什么。。。当我从激活的工作表(1)运行代码时,userform dropbox加载得很好,但是当我切换到激活的工作表(2)时,它认为shhet(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


所以,一天结束时,我需要它来识别我的数据列表,而不依赖于我在哪张表上。另外,如果你能解释为什么它会这样做。。。我被它弄糊涂了

我非常确定,用于构造外部范围的参数的
范围(“K41”)
将使用当前工作表。表达式开头的
表(1)
只会影响它显式绑定到的范围,而不是括号内的所有范围

如果您想在第1页上使用
K41
,您可能应该使用
Sheets(1).Range(“K41”)
。换言之:

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

我非常确定,用于构造外部范围的参数的
范围(“K41”)
将使用当前工作表。表达式开头的
表(1)
只会影响它显式绑定到的范围,而不是括号内的所有范围

如果您想在第1页上使用
K41
,您可能应该使用
Sheets(1).Range(“K41”)
。换言之:

PurchUnit.List = Sheets(1).Range("PurchasingSizes" & _
    Sheets(1).Range("K41").End(xlUp).Row).Value
'   ^^^^^^^^^^
'   Added this bit.
在每个参考范围内参考表(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),如下所示

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()
引用活动工作表。
你不想要,所以你需要更好的参考,正如其他答案所指出的,一种方法是在每个
Range()
实例之前添加
Sheets(index)
,无论是在行之前添加
和Sheets(index)
并在每个
Range()之前添加
实例或在其前面添加
工作表(索引)
自身

目前,这对您是有效的,但是
工作表(索引)
也不安全,尤其是当您不知道引用了什么时。
我使用
index
而不是
1
的原因是:
Sheets(index)
引用
ActiveWorkbook的
Sheet
对象,该对象位于特定索引处或具有特定名称,比如说
Sheets(“sheet1”)
将引用工作簿的第一页,如果您没有更改其名称,并且,最重要的是,索引是可变的,因为每次工作表在工作簿中移动时,索引都会发生变化。
将第二张工作表移动到第一张工作表将导致代码引用不希望被引用的工作表

要解决这个问题,您应该使用工作表的
代码名
,它可以在VBE中查看和更改。但是,
Codename
不能在运行时更改,这在您或您的用户手动移动工作表或更改其名称时会有很大帮助。这总是偶然发生的

总之,您应该始终使用
ThisWorkbook
,它引用运行代码的工作簿,而不是隐含的
ActiveWorkbook

在适用的情况下,您应该使用
Codename
s的工作表,如果我假设您使用英文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
,通常我建议使用另一个问题。

正如其他人所指出的:
Range()
引用活动工作表。
你不想要,所以你需要更好的参考,正如其他答案所指出的,一种方法是在每个
Range()
实例之前添加
Sheets(index)
,无论是在行之前添加
和Sheets(index)
并在每个
Range()之前添加
实例或在其前面添加
工作表(索引)
自身

目前,这对您是有效的,但是
工作表(索引)
也不安全,尤其是当您不知道引用了什么时。
我使用
index
而不是
1
的原因是:
Sheets(index)
引用
ActiveWorkbook的
Sheet
对象,该对象位于特定索引处或具有特定名称,比如说
Sheets(“sheet1”)
将引用工作簿的第一页,如果您没有更改其名称,并且,最重要的是,索引是可变的,因为每次工作表在工作簿中移动时,索引都会发生变化。
将第二张工作表移动到第一张工作表将导致代码引用不希望被引用的工作表

要解决这个问题,您应该使用工作表的
代码名
,它可以在VBE中查看和更改。但是,
Codename
不能在运行时更改,这在您或您的用户手动移动工作表或更改其名称时会有很大帮助。这总是偶然发生的

总之,您应该始终使用
ThisWorkbook
,它引用运行代码的工作簿,而不是隐含的
ActiveWorkbook

在适用的情况下,您应该使用
Codename
s的工作表,如果我假设您使用英文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
选择
,通常我建议使用另一个问题。

带工作表(1)
>
带工作表(1)