【问题标题】:Cannot copy to the last cell in the range无法复制到范围内的最后一个单元格
【发布时间】:2018-04-25 04:29:30
【问题描述】:

我编写了一个代码来循环遍历单元格范围并复制列中的某些数据。但每次我运行代码时,它只会复制最后一条记录,而不是全部。问题出在目标代码行中的某个地方,它找不到最后一个未使用的单元格。任何帮助将不胜感激。非常感谢。

Sub ImmoScout()

    Dim MyRange As Range, Mycell As Range, Mycell2 As String

    Set MyRange = Application.Selection
    'Application.ScreenUpdating = False
    For Each Mycell In MyRange
        Mycell2 = Mycell.Value
        Worksheets("Sheet1").Activate
        Worksheets("Sheet1").AutoFilterMode = False
        Range("A1:BB34470").AutoFilter Field:=54, Criteria1:=Mycell2
        Range("AM1").Select
        Range(Selection, Selection.End(xlDown)).Select
            If Selection.Cells.Count < 1048576 Then
                Selection.Copy Destination:=Range("BP1048576").End(xlUp).Offset(1, 0)
                Range("AU1").Activate
                Range(Selection, Selection.End(xlDown)).Select
                Selection.Copy Destination:=Range("BQ1048576").End(xlUp).Offset(1, 0)
            End If

    Next Mycell
   ' Application.ScreenUpdating = True
End Sub

【问题讨论】:

  • 尝试通过代码Step来定位问题。见this link
  • 嗨 Ashleedawg,代码运行没有任何错误。我尝试使用本地窗口,但它没有帮助为什么它找不到 col BP 和 BQ 中的最后一个单元格。
  • 逐步遍历代码并检查变量的值,以及在每个步骤中选择的范围应该有助于确定准确的位置问题是。这也是我会做的帮助 - 除了我不知道哪些单元格有数据而哪些没有,所以我不知道像 End 这样的函数在你的情况下正在做什么。要找出的一个例子是,这条线实际上选择是什么? Range(Selection, Selection.End(xlDown)).Select我不是说这是问题所在,这只是一个谎言来检查“所有”他们
  • 所以 Range(Selection, Selection.End(xlDown)).Select 正在根据我的自动过滤条件选择过滤的单元格。我检查了一下,它正在选择正确的东西。现在我想将此选择粘贴到 BP 列的第一个可用空白单元格中。所以我使用代码 Selection.Copy Destination:=Range("BP1048576").End(xlUp).Offset(1, 0) 将选择粘贴到底部的第一个空单元格中。但它只记得最后过滤的选择。
  • 正如我所说,这只是(随机选择的)示例。 - 无论如何,如果它只是复制过滤的单元格,而您希望它复制所有单元格,那么合乎逻辑的解决方案是...关闭过滤器?

标签: excel vba


【解决方案1】:

您可以使用高级过滤器:

    Sheets("Emps").Range("A1:D8").AdvancedFilter Action:=xlFilterCopy, _
    CriteriaRange:=Sheets("Emps").Range("F5:F6"), CopyToRange:=Range("A1:B1"), _
    Unique:=False

选择性复制的数据源:

复制的数据目标:

参考这个 YouTube 短视频;您还可以录制宏以帮助自己使用代码

https://www.youtube.com/watch?v=bGUKjXmEi2E

完整的教程可以在这里找到:

http://www.contextures.com/xladvfilter01.html

本教程展示了如何从 Excel 外部获取源数据

https://www.extendoffice.com/documents/excel/4189-excel-dynamic-filter-to-new-sheet.html

本教程展示了如何将基于列的数据值拆分到不同的工作表(水果列;苹果表、梨表等):

https://www.extendoffice.com/documents/excel/2884-excel-save-filtered-data-new-sheet-workbook.html

旁注:您的条件需要您查询的标题,就像输出需要标题才能知道将信息放在哪里一样。如果不正确匹配,Excel 将不知道您的意思。 别忘了更新范围名称!

之前的版本:

之后的版本:

在这种情况下,您的代码是:

    Sub yourFilter()
        Range("Source").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range( _
        "Sheet2!Criteria"), CopyToRange:=Range("Sheet1!Extract"), Unique:=False
    End Sub

【讨论】:

  • 嗨,这看起来很有趣。我试过使用它,但它给出了一个错误。整个代码只有 2 行,太棒了! Worksheets("Sheet1").Range("A1:BB34470").AdvancedFilter Action:=xlFilterCopy, _ CriteriaRange:=Sheets("Sheet2").Range("AB2:AB12"), CopyToRange:=Range("BP1: BQ1"), _ Unique:=False
  • 是的,这是一种更简洁的处理方式。它显示什么错误?无法修复未知数。请显示一些相同的数据或您拥有的(源数据)和您想要的屏幕截图。您甚至可以在 Dropbox 中链接文件。
  • 它显示运行时错误 1004:提取范围的文件名丢失或无效。如果这可行,那么我的整个代码可以压缩成 3 行,这非常棒。我以前没有使用过保管箱。但是会看看我是否可以在此处附加文件或屏幕截图。
  • 您是否通过将其记录为宏来获得该代码?您是否通过将它本身放在宏中来测试那行代码?那是你得到错误的时候吗?如果是这样,那么请研究“彻底的教程”,如果不是,那么错误就在代码的另一部分。如果您“手动”逐步完成高级过滤并且没有收到错误,那么您知道它有效,您必须在其他地方找到错误。在没有看到您的数据的情况下,这只是猜测工作。谷歌“如何在 stackoverflow 上共享 Dropbox 中的文件”,你会找到答案。那我可以帮你更多。
  • 你确定那是“无效的文件名”而不是字段名?我可以获取 3 个范围的屏幕截图吗?
【解决方案2】:

避免使用自动筛选或复制范围时不需要的SelectActivate。而是声明一些范围变量,正确设置并使用它。

应用自动过滤器后,您可能对复制可见单元格感兴趣。更改复制范围的行如下...

Range("AM1:AM34470").SpecialCells(xlCellTypeVisible).Copy
Range("AU1:AU34470").SpecialCells(xlCellTypeVisible).Copy

另外Selection.End(xlDown)也不是很可靠,一旦在列的最后一个单元格之前找到一个空单元格,它就会停止。

【讨论】:

  • 您好,仅复制可见单元格非常有用。我只是遇到了 Selection.Copy Destination:=Range("BQ1048576").End(xlUp).Offset(1, 0) 代码行的问题。每次复制一个新范围时它只是重叠
  • 该行似乎没有任何问题。顺便说一句,试试这个Destination:=Range("BQ" &amp; Rows.Count).End(3)(2) 看看是否可行。
  • 它仍然提供与原始代码相同的输出。
猜你喜欢
  • 1970-01-01
  • 2019-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多