【问题标题】:Data is saved in a Combobox instead of being actualised数据保存在组合框中,而不是被实现
【发布时间】:2016-07-21 07:53:31
【问题描述】:

希望你能帮我解决我的小问题..

我的文件包含 3 个工作表。 1.数据 2. 报告 3. 帮助工作表进行一些计算

当我打开文件时,我单击一个按钮来执行计算,这会启动一些请求。此请求首先将数据从工作表 1(数据)复制到工作表 3(帮助工作表)。在进一步请求之后,所有这些都在用户表单中完成,工作表 3 中的数据被过滤以获取请求的数据。用户表单从工作表 3 中获取数据,并通过脚本字典显示在组合框中。

问题来了:

我的数据包含在三个电子表格中。 如果我点击工作表 2 上的按钮,请求会在第一时间完成它们的工作。如果我想再做一次(再次点击按钮实现复制,过滤和计算),过滤器设置错误,计算也是如此。 但是,如果打开工作表 3(当前视图在工作表 3 上,而不是在按钮所在的工作表 2 上)并且我在编辑器窗口中手动启动请求和计算,则过滤器和计算总是正确的。

我认为错误是组合框生成字典时分别获取其数据并应用过滤器。过滤器始终是在第一个请求时设置的过滤器。随着进一步的请求,过滤器不会改变,它仍然是第一个请求的过滤器。 也许在请求和计算之后应该有某种重置?

我对用户窗体/组合框/脚本字典使用了以下代码:

 Sub UserForm_Initialize()

'Taking the data from the helping working sheet

    Dim objDic As Object
    Dim lngZ As Long
    Dim i As Integer

    Set objDic = CreateObject("Scripting.Dictionary")

    With Sheets("helpsheet")

    For i = 12 To Sheets("helpsheet").Cells(.Rows.Count, 3).End(xlUp).Row
    If Sheets("helpsheet").Rows(i).Hidden = False Then
    ComboBox2.AddItem .Cells(i, 3)
    objDic(.Cells(i, 3).Value) = 0
    End If

    Next

    End With

    Me.ComboBox2.List = objDic.keys

    With Me.ComboBox2
    .AddItem "all areas"
    End With

End Sub

我真的希望有人可以帮助我,因为我无法继续:(

谢谢

拉法

【问题讨论】:

    标签: excel vba combobox


    【解决方案1】:

    最好先激活/选择源工作表,然后再执行过滤器并在该工作表上/从该工作表复制数据。

    当然,人们说不应该在自己的代码中使用Sheets("SheetName").select,但只要它能解决我的错误,我就会这样做:)。

    因此,请尝试在执行代码之前输入 Sheets("YourSource").select。如果您想返回到工作表 2(按钮所在的位置),只需使用 Sheets("Sheet2Name").select。

    希望我能帮上忙!

    【讨论】:

      【解决方案2】:

      如果你总是使用全范围参考,你应该不会遇到任何问题

      我的猜测是,在您的其他(未显示)代码中,您是:

      • 进行一些工作表激活/选择,为第二次启动造成“糟糕的环境”

      • 使用未完全引用的范围变量

      您可能希望显示其他代码以帮助我们帮助您

      顺便说一句,您可以将UserForm_Initialize 代码重构如下:

      Option Explicit
      
      Sub UserForm_Initialize()
          Dim objDic As Object
          Dim i As Long
      
          Set objDic = CreateObject("Scripting.Dictionary")
      
          With Sheets("helpsheet")
              For i = 12 To .Cells(.Rows.Count, 3).End(xlUp).Row
                  If Not .Rows(i).Hidden Then objDic(.Cells(i, 3).Value) = 0
              Next
          End With
      
          With Me.ComboBox2
              .List = objDic.keys
              .AddItem "all areas"
          End With
      End Sub
      

      或者,再缩短一点:

      Sub UserForm_Initialize()
          Dim objDic As Object
          Dim cell As Range
      
          Set objDic = CreateObject("Scripting.Dictionary")
      
          For Each cell In Sheets("helpsheet").Columns(3).SpecialCells(xlCellTypeConstants).SpecialCells(xlCellTypeVisible)
              objDic(cell.Value) = 0
          Next cell
      
          With Me.ComboBox2
              .List = objDic.keys
              .AddItem "all areas"
          End With
      End Sub
      

      【讨论】:

        【解决方案3】:

        我找到了解决方案,而且超级简单..

        要重置组合框,您只需在 END SUB 之前添加 END。这样一来,一切都回到了初始状态,没有任何值或属性。

        我没有激活或选择工作表,因为我不希望任何人看到它背后的内容。不过还是谢谢:)

        【讨论】:

        • 强烈建议不要使用END!试试我的解决方案
        猜你喜欢
        • 2018-12-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-26
        • 2017-01-04
        • 2016-11-11
        • 2018-02-11
        相关资源
        最近更新 更多