我希望你能帮助我解决我的小问题..
我的文件包含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
我真的希望有人可以帮助我,因为我无法继续:(
由于
拉法
答案 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。这样一切都达到了初始状态,没有任何值或属性。
我没有激活或选择工作表,因为我不希望任何人看到它背后的东西。但无论如何,谢谢:)