复制粘贴过滤后的数据无法正常工作

时间:2018-06-14 19:33:26

标签: excel vba excel-vba

首先要做的事情。我对VBA很新。 其次,我搜索了我的屁股,老实说,我没有深究它。主要是因为代码根据我的googleing(复制/粘贴代码)来适应我的需求。

对我的问题。我有一张表(原始数据),有很多列(A:AN)和许多行(160000),它们不时被更新。我想根据几列(A& B)中的标准过滤数据集,并从A列开始将数据复制/粘贴到另一张表(Scatter Raw)中。我也不想复制标题来自"原始数据"然后开始粘贴" Scatter Sheet"也在标题下面 - >在这种情况下有2行。

我现在有两个问题:

  1. 根据我的过滤器,我将获得17267行"原始数据"。如果我只是选择并复制,那么我只复制过滤后的数据。但是,当我以某种方式粘贴数据时,我突然得到18362行,即使它们是空的。我可以通过滚动条下降的事实看到这一点。我使用这种复制方式,因为有时我希望能够根据在不同单元格中设置的值附加复制的数据。我在这做错了什么,或者发生了什么?

  2. 我在工作簿中有更多工作表。如果我没有选择原始数据工作表,我会收到类似"应用程序定义或对象定义错误的错误"在"设置rng ="我不明白的路线。在其他测试中我也得到了不同的错误,但那是因为Range是基于活动表而不是我需要的。为什么会发生这种情况,因为过滤器设置正确?

  3. N列的值应该全部除以1000.我想我没办法使用临时复制列,在新列中除以1000,然后将新值复制/粘贴到我需要的位置在,对吗?

    最后一次提及,代码在模块中运行,稍后将分配给一个按钮。

    Sub Copy()
      Dim destTrSheet As Worksheet
      Dim sctrSheet As Worksheet
    
      Set destTrSheet = ThisWorkbook.Worksheets("Data Raw")
      Set sctrSheet = ThisWorkbook.Worksheets("Scatter Raw")
    
      With destTrSheet
        .Range("A:A").AutoFilter field:=1, Criteria1:="VF", Operator:=xlFilterValues
        .Range("B:B").AutoFilter field:=2, Criteria1:="CITY", Operator:=xlFilterValues
    
        Set Rng = .Range("N2").Resize(Cells(Rows.count, "N").End(xlUp).Row - 1)
        Rng.Copy
        sctrSheet.Range("A" & Rows.count).End(xlUp).Offset(1, 0).PasteSpecial (xlPasteValues)
    
        Set Rng = .Range("X2").Resize(Cells(Rows.count, "N").End(xlUp).Row - 1)
        Rng.Copy
        sctrSheet.Range("B" & Rows.count).End(xlUp).Offset(2, 0).PasteSpecial (xlPasteValues)
      End With
    
    End Sub
    

1 个答案:

答案 0 :(得分:0)

您提到的问题

  1. 手动复制和代码复制之间的差异可能是由使用的偏移引起的:
    • Col A .Offset(1, 0).PasteSpecial - 最后一次使用行
    • 下方的一行
    • Col B .Offset(2, 0).PasteSpecial - 最后一次使用行下面的2行
  2. 错误是由.Range("N2") vs (Cells(Rows.count, "N")引起的
      由于点( .Range("N2") ),
    • .已明确限定 - 请参阅"Data Raw"
    • Cells(Rows.count, "N")隐含地提及ActiveSheet(缺少 .
  3. 如果列N应除以1000
    • 是的,可以使用辅助列,如下面的代码
    • 另一种方法:将列复制到数组,除以每个值,然后将其粘贴回来
  4. 如果列N包含字符串,则除法将生成单元格错误:

    Option Explicit
    
    Public Sub CopyRawToScatter()
        Dim wsR As Worksheet:       Set wsR = ThisWorkbook.Worksheets("Data Raw")
        Dim wsS As Worksheet:       Set wsS = ThisWorkbook.Worksheets("Scatter Raw")
        Dim lrR As Long:            lrR = wsR.Cells(wsR.Rows.Count, "A").End(xlUp).Row
        Dim lrS As Long:            lrS = wsS.Cells(wsS.Rows.Count, "A").End(xlUp).Row + 1
        With wsR
            Dim fRng As Range:      Set fRng = .Range(.Cells(1, "A"), .Cells(lrR, "B"))
            Dim rngN As Range:      Set rngN = .Range(.Cells(2, "N"), .Cells(lrR, "N"))
            Dim rngX As Range:      Set rngX = .Range(.Cells(2, "X"), .Cells(lrR, "X"))
            Dim cRng As Range:      Set cRng = Union(rngN, rngX)
        End With
    
        Application.ScreenUpdating = False
        fRng.AutoFilter field:=1, Criteria1:="VF", Operator:=xlFilterValues
        fRng.AutoFilter field:=2, Criteria1:="CITY", Operator:=xlFilterValues
    
        If fRng.SpecialCells(xlCellTypeVisible).CountLarge > 2 Then
            cRng.Copy
            wsS.Cells(lrS, "A").PasteSpecial xlPasteValues
            With wsS
                Dim vis As Long:    vis = .Cells(.Rows.Count, "A").End(xlUp).Row
                Dim lcS As Long:    lcS = .Cells(lrS, "A").End(xlToRight).Column + 1
                Dim divA As Range:  Set divA = .Range(.Cells(lrS, "A"), .Cells(vis, "A"))
                Dim divX As Range:  Set divX = .Range(.Cells(lrS, lcS), .Cells(vis, lcS))
    
                divX.Formula = "=" & .Cells(lrS, 1).Address(RowAbsolute:=False) & " / 1000"
                divA.Value2 = divX.Value2
                divX.ClearContents
            End With
        End If
        wsR.UsedRange.AutoFilter
        Application.ScreenUpdating = False
    End Sub
    

    其他问题

    • 您的子名称(Copy())与内置Range.Copy方法
    • 之间可能存在冲突
    • 2个AutoFilter行无效
      • .Range("A:A").AutoFilter field:=1, Criteria1:="VF", Operator:=xlFilterValues
      • .Range("B:B").AutoFilter field:=2, Criteria1:="CITY", Operator:=xlFilterValues
      • 如果您的代码有效,您可能在发布问题时对其进行了修改;他们应该
      • .Range("A:B").AutoFilter field:=1, Criteria1:="VF", Operator:=xlFilterValues
      • .Range("A:B").AutoFilter field:=2, Criteria1:="CITY", Operator:=xlFilterValues
    • 您不需要.PasteSpecial (xlPasteValues)
    • 的括号