Excel 在专用子工作表中创建新工作簿\u选择更改

Excel 在专用子工作表中创建新工作簿\u选择更改,excel,vba,Excel,Vba,你好 我在使用专用sub添加新工作簿时遇到“运行时错误1004”问题。理想情况下,每当我在B2:B49999中选择任何单元格时,下面的代码都会运行宏。我必须将可视数据(过滤后)从A1复制到Z的最后一行,并将其粘贴到新工作簿中。请帮帮我 Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Not Intersect(Target, Range("B2:B49999")) Is Nothing Then srcLastRo

你好

我在使用专用sub添加新工作簿时遇到“运行时错误1004”问题。理想情况下,每当我在B2:B49999中选择任何单元格时,下面的代码都会运行宏。我必须将可视数据(过滤后)从A1复制到Z的最后一行,并将其粘贴到新工作簿中。请帮帮我

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

If Not Intersect(Target, Range("B2:B49999")) Is Nothing Then
srcLastRow = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
Dim Rng As Range
Set Rng = Range("A1:Z" & srcLastRow, Range("A65536").End(xlUp)).SpecialCells(xlCellTypeVisible)
Rng.Copy
End If
Workbooks.Add

End Sub

你无意中发现了我眼中的虫子

当工作表上的自动筛选处于活动状态时,
Target
返回错误的范围:实际上是所有已筛选的可见单元格(而不是预期的选定范围)。这似乎也只发生在

If Not Intersect(Target, ActiveSheet.Range("B2:B49999")) Is Nothing Then
存在于代码中!与
Intersect
命令结合使用,apears会导致堆栈外空间错误

作为一种解决方法,尝试重写测试以获得相同的结果。我试过了

With Target
    If .Column = 2 And .Row >= 2 And .Row <= 49999 Then
对我来说毫无意义

建议你试试

srcLastRow = Me.Cells(Me.Rows.Count, 1).End(xlUp).Row
Set Rng = Me.Range("A1:Z" & srcLastRow).SpecialCells(xlCellTypeVisible)
顺便说一句,您应该使用
Workbook
变量来引用已创建的新工作簿,而不是依赖它变为活动状态。并具体说明粘贴的位置,例如

Set wb = Workbooks.Add
Rng.Copy wb.Worksheets("Sheet1").Cells(1, 1)

[在Excel 2010中测试]

首先,如果您在开始时对变量进行
Dim
。我也不明白为什么每次单击不同的单元格时都要添加工作簿。。。但是您可能忘记了包含
工作簿。如果
中有
,请在
中添加
。现在,回答你的问题,你能更具体一点吗?你的代码“原样”对我有用。@Noldor130884嗨,Noldor!我应该在开始时添加哪些变量?每次单击单元格时,我都要添加工作簿,然后它会将所有可见单元格从A1区域复制到上次使用的区域,并复制到新工作簿。每个代码行都从If开始工作到If结束。每当我将“workbooks.add”放在if之间时,它都会发布运行时错误28,堆栈空间不足。还是把我引向一个错误。真正的问题是,如何添加新工作簿、复制所有可见数据(无论何时筛选)并粘贴到新工作簿中。我应该声明哪些变量您使用的所有变量!(特别是
srcLastRow
)我认为他通过隐藏他不想要的单元格进行过滤。另外,我不认为他需要一个工作簿变量,因为他只需要一个拷贝粘贴,其他什么都不需要。。。最后,当您创建新工作簿时,如果未指定“相交”目标范围,新工作簿也将触发该事件。@Noldor130884您明白我的意思了。每当我过滤所有数据,然后每当我在B列中选择一个过滤后的可见行时,宏就会运行。你差点就成功了!它将复制可见的过滤数据,但是,它不允许我在\u结束后添加其他代码。每当我在这之后添加代码时,它只会打开一个新工作簿,而不复制任何数据。@Noldor130884即使有您的修订,它也将始终跳过代码。奇怪的是,仅仅是一个简单的范围(“A1”)。Select将给代码一个错误,它将直接转到错误处理程序“the_End”。是否打开的新工作簿不是活动工作簿?Chris是对的,似乎有一个与目标相交的bug?当然,您可以使用他的代码的第一部分来防止bug,以防出现bug。对他来说没有意义,对我来说有意义,如果你用谷歌搜索这段代码,你会发现很多人都这么做。让我知道在Chris的最后一段代码之后,我添加了End if then End with来运行代码。他的和你的结果一样。问题发生在结束时。>以>''结束输入下面的代码无效!>范围(“A1”)。选择>范围(Selection,ActiveCell.SpecialCells(xlLastCell))。选择>Application.CutCopyMode=False>Selection.Cut>范围(“A6”)。选择>ActiveSheet.Paste感谢我的代码建议。这就是我所知道的,或者说我已经搜索过了。嘿,克里斯和诺尔多,我正试图用克里斯的代码添加一些东西。在他最后的代码之后,我添加了一些东西,并将Dim WB作为工作簿。如果以WB单元格结束,则结束。SpecialCells(xlCellTypeVisible)。剪切ActiveCell.PasteSpecial(xlPasteAll)以与代码Noldor相同的结果结束,即它得到错误1004 PasteMethod。我在这里想的是,私有子工作表\u selectionchange允许您创建新工作簿,但不允许您激活它?由于它不允许我粘贴到“ActiveCell”中。此“ActiveCell”是否指工作簿的ActiveCell,private sub的工作表?ActiveCell始终寻址激活工作表的ActiveCell。但是我以前对你的评论一点也不理解:“如果你认为selectionchange是个问题,那就使用一个标志吧!”!完成选择后-向上标记-创建工作簿-完成任务-向下标记-准备进行其他选择。如果您能发布最终代码,给出错误范围(“A1”)。选择范围(Selection,ActiveCell.SpecialCells(xlLastCell))。选择Application.CutCopyMode=False Selection。剪切范围(“A6”)。选择ActiveSheet.Paste为什么我的代码显示为注释而不是代码,即使我缩进了四个空格?(T.T)
srcLastRow = Me.Cells(Me.Rows.Count, 1).End(xlUp).Row
Set Rng = Me.Range("A1:Z" & srcLastRow).SpecialCells(xlCellTypeVisible)
Set wb = Workbooks.Add
Rng.Copy wb.Worksheets("Sheet1").Cells(1, 1)