【问题标题】:Why is the ComboBox loading different data when I am on a different sheet?当我在不同的工作表上时,为什么 ComboBox 会加载不同的数据?
【发布时间】:2019-07-31 17:14:37
【问题描述】:

我不明白这里发生了什么...虽然我从工作表 (1) 运行代码处于活动状态时,用户窗体保管箱加载得很好,但是当我切换到工作表 (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

所以一天结束时,我需要它来识别我的数据列表,而与我所在的工作表无关。另外,如果您能解释一下为什么要这样做……我对此感到困惑!

【问题讨论】:

    标签: excel vba list combobox userform


    【解决方案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
    

    【讨论】:

    • With Sheet(1) >> With Sheets(1) ?
    • 语法和位置这样简单的东西...有时vba让我畏缩...大声笑非常感谢先生!那成功了,我从中吸取了教训!!!
    【解决方案2】:

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

    目前这对你有用,但是Sheets(index) 也不能安全使用,尤其是当人们不知道引用了什么时。
    我使用index 而不是1 是有原因的:Sheets(index) 在特定索引处引用ActiveWorkbookSheet 对象或使用该特定名称,例如Sheets("Sheet 1") 将引用工作簿的第一张表如果您没有更改其名称,并且最重要的是,索引是变量,因为每次在工作簿中移动工作表时它都会更改。
    将您的第二个工作表移动为第一个工作表将导致您的代码引用您不想被引用的工作表。

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

    总而言之,您应该始终使用ThisWorkbook,它引用运行代码的工作簿,而不是隐含的ActiveWorkbook
    并且您应该在适用的情况下使用表格的Codenames,如果我假设您使用英文 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 回答不同的问题。

    【讨论】:

    • 信息量超级大!!!快速提问,如果启动宏的控制按钮在活动工作簿中,那么指定 [ThisWorkbook] vrs 是否更好。隐含的活动工作簿?
    • @DanielRoy 如果它是一个长时间运行的宏,那么可以,因为用户可能打开了多个工作簿,并且如果您的宏在循环中包含“DoEvents”,则可能会在宏完成时切换到不同的工作簿,这可能会导致很大的痛苦
    【解决方案3】:

    我很确定 Range("K41") 用于构造您的 outer 范围的参数将使用 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.
    

    【讨论】:

      猜你喜欢
      • 2017-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-04
      • 2013-09-07
      • 1970-01-01
      • 1970-01-01
      • 2019-10-07
      相关资源
      最近更新 更多