数据保存在Combobox中而不是实现

时间:2016-07-21 07:53:32

标签: excel vba combobox

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

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

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

问题在于:

我的数据包含在三个电子表格中。 如果我点击工作表2上的按钮,请求将在第一次执行。如果我想再次执行此操作(再次单击该按钮以实现复制,过滤和计算),则过滤器设置错误,计算也是如此。 但是,如果打开工作表3(当前视图位于工作表3上,而不是工作表2,按钮所在的位置)并且我在编辑器窗口中手动启动请求和计算,则过滤器和计算始终是正确的。

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

我在userform / combobox / scritping词典中使用了以下代码:

 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

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

由于

拉​​法

3 个答案:

答案 0 :(得分:1)

最好在执行过滤器之前激活/选择源表,并在该表上复制数据。

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

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

希望我能帮忙!

答案 1 :(得分:0)

如果您始终使用全范围参考,则不应遇到任何问题

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

  • 制作一些表单激活/选择,为第二次启动造成“恶劣环境”

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

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

顺便说一句,您可以按如下方式重构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

答案 2 :(得分:0)

我找到了解决方案,它非常简单..

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

我没有激活或选择工作表,因为我不希望任何人看到它背后的东西。但无论如何,谢谢:)