首先要做的事情。我对VBA很新。 其次,我搜索了我的屁股,老实说,我没有深究它。主要是因为代码根据我的googleing(复制/粘贴代码)来适应我的需求。
对我的问题。我有一张表(原始数据),有很多列(A:AN)和许多行(160000),它们不时被更新。我想根据几列(A& B)中的标准过滤数据集,并从A列开始将数据复制/粘贴到另一张表(Scatter Raw)中。我也不想复制标题来自"原始数据"然后开始粘贴" Scatter Sheet"也在标题下面 - >在这种情况下有2行。
我现在有两个问题:
根据我的过滤器,我将获得17267行"原始数据"。如果我只是选择并复制,那么我只复制过滤后的数据。但是,当我以某种方式粘贴数据时,我突然得到18362行,即使它们是空的。我可以通过滚动条下降的事实看到这一点。我使用这种复制方式,因为有时我希望能够根据在不同单元格中设置的值附加复制的数据。我在这做错了什么,或者发生了什么?
我在工作簿中有更多工作表。如果我没有选择原始数据工作表,我会收到类似"应用程序定义或对象定义错误的错误"在"设置rng ="我不明白的路线。在其他测试中我也得到了不同的错误,但那是因为Range是基于活动表而不是我需要的。为什么会发生这种情况,因为过滤器设置正确?
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
答案 0 :(得分:0)
您提到的问题
.Offset(1, 0).PasteSpecial
- 最后一次使用行.Offset(2, 0).PasteSpecial
- 最后一次使用行下面的2行.Range("N2")
vs (Cells(Rows.count, "N")
引起的
.Range("N2")
),.
已明确限定 - 请参阅"Data Raw"
Cells(Rows.count, "N")
隐含地提及ActiveSheet
(缺少 .
)如果列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
方法.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)