所有
先谢谢你,你们都是一个巨大的资源!!!
我有几张表格受保护的电子表格,但用户仍然可以使用过滤器。我正在自动处理大部分工作表,但我需要做的是向用户提供需要过滤的工作表,然后让他们选择“完成”类型按钮或工具栏条目,我已经拥有。 / p>
我需要做的是将这张纸张打开,如果可能的话,暂停宏,同时进行更改(最多可以在纸张准备好之前选择5个过滤器。
然后,仅将可见单元格复制到特定工作表,然后恢复宏。
我认为工作表更改事件不会这样做。
我正在考虑更多关于在备用工作表上设置标记,启动下一个宏然后查看是否可以找到原始宏并选择标记位置的方法?
我想到了一个无模式用户表单,用户可以单击“确定”,然后调用下一个宏,但这不起作用。
主叫代码是:
UserForm3.Show
CopyToDisplay "AEP"
LastPos = LastPos + 1
其中AEP是要从中复制过滤行的工作表名称。
显示Userform,但单击“确定”不会执行任何操作,当然,宏会继续运行。
任何建议都将不胜感激!
谢谢,
杰夫
答案 0 :(得分:2)
杰夫试试吧。您当前的代码:
UserForm3.Show
CopyToDisplay "AEP"
LastPos = LastPos + 1
当我们显示UserForm时,默认行为是vbModal
,它实际上冻结了应用程序,用户无法与任何但 UserForm进行交互,这不是您想要的。你需要的是一种显示表单的方法,然后等待用户发出他/她完成输入的信号。
所以我们需要修改一些内容:
UserForm需要有效地“暂停”,同时还允许用户与工作表进行交互。 vbModal
表单不能执行此操作(暂停,没有交互),并且vbModeless
实际上也不能(它继续执行并允许交互)。
难题?不。我们可以使用vbModeless
形式模拟暂停,并保留用户与工作表交互的能力。这两个世界中最好的!!
我们将使用可选的vbModeless
显示表单,这允许用户与Application / worksheets / etc的其余部分进行交互。由于无模式表单继续执行代码,我们需要模拟暂停,我们可以使用Loop
执行此操作。循环将无限期地运行,并且只有在UserForm关闭后才会中断,此时其余代码将继续执行。
UserForm3.Show vbModeless
Do While UserForm3.Visible
DoEvents
Loop
LastPos = LastPos + 1
'You MAY need to reset some variables, if the Filter/Autofilter has affected these/etc.
以设计为目标,为您的表单提供一个Label
控件,并以一些有用/有用的方式设置其.Caption
属性(以及表单的.Caption
属性)。您可以添加一个命令按钮,但这似乎是不必要的,因为所有按钮都会调用Terminate
事件(总是可以用红色“X”完成)
针对您的复制问题(明显无法粘贴),请尝试更改此内容:
Sheets("AEP").Select
With ActiveSheet
.UsedRange.SpecialCells(xlCellTypeVisible).Copy _
Destination:=Sheets("Display").range("A" & LastPos)
.AutoFilterMode = False
Application.CutCopyMode = False
End With
对此:
With ActiveSheet
.UsedRange.SpecialCells(xlCellTypeVisible).Copy
Sheets("Display").range("A" & LastPos).PasteSpecial
.AutoFilterMode = False
Application.CutCopyMode = False
End With