VBA-将工作簿中的特定列复制并筛选到工作表中
我已经知道如何从其他工作簿复制特定列,但现在我还需要筛选特定列。我尝试过这段代码,但遇到了一个错误“下标超出范围” 我需要过滤包含“Mary”的列C并复制其相应的数据。 这是我的代码示例,我知道我的语法有问题,尤其是对C列使用自动筛选,复制不同的列并将其粘贴到另一个工作簿。请帮我纠正一下。谢谢VBA-将工作簿中的特定列复制并筛选到工作表中,vba,excel,Vba,Excel,我已经知道如何从其他工作簿复制特定列,但现在我还需要筛选特定列。我尝试过这段代码,但遇到了一个错误“下标超出范围” 我需要过滤包含“Mary”的列C并复制其相应的数据。 这是我的代码示例,我知道我的语法有问题,尤其是对C列使用自动筛选,复制不同的列并将其粘贴到另一个工作簿。请帮我纠正一下。谢谢 Sub RAWtransfertoTRUST() Dim MainWorkfile As Workbook Dim OtherWorkfile As Workbook Dim TrackerS
Sub RAWtransfertoTRUST()
Dim MainWorkfile As Workbook
Dim OtherWorkfile As Workbook
Dim TrackerSht As Worksheet
Dim FilterSht As Worksheet
Dim lRow As Long, lRw As Long
Application.ScreenUpdating = False
Application.DisplayAlerts = False
' set workbook object
Set MainWorkfile = ActiveWorkbook
' set the worksheet object
Set TrackerSht = MainWorkfile.Sheets("Trust Activities Raw")
With TrackerSht
lRow = .Cells(.Rows.Count, "B").End(xlUp).Row
End With
Application.AskToUpdateLinks = False
' set the 2nd workbook object
Set OtherWorkfile = Workbooks.Open(Filename:=Application.GetOpenFilename)
' set the 2nd worksheet object
Set FilterSht = OtherWorkfile.Sheets("Raw Data")
With FilterSht
.AutoFilterMode = False
.Range("B2:F").AutoFilter Field:=3, Criteria1:="Mary"
lRw = .Cells(.Rows.Count, "B").End(xlUp).Row
End With
' paste
TrackerSht.Range("B" & lRow).PasteSpecial Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:=False, Transpose:=False
With FilterSht
If .FilterMode Or .AutoFilterMode Then .AutoFilterMode = False
lRw = .Cells(.Rows.Count, "C").End(xlUp).Row
.Range("J1:J" & lRw).Copy ' copy your range
End With
' paste
TrackerSht.Range("G" & lRow).PasteSpecial Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:=False, Transpose:=False
With FilterSht
If .FilterMode Or .AutoFilterMode Then .AutoFilterMode = False
lRw = .Cells(.Rows.Count, "C").End(xlUp).Row ' last row with data in column "C"
.Range("N1:Q" & lRw).Copy ' copy your range
End With
' paste
TrackerSht.Range("H" & lRow).PasteSpecial Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:=False, Transpose:=False
With FilterSht
If .FilterMode Or .AutoFilterMode Then .AutoFilterMode = False
lRw = .Cells(.Rows.Count, "C").End(xlUp).Row ' last row with data in column "C"
.Range("T1:W" & lRw).Copy ' copy your range
End With
' paste
TrackerSht.Range("L" & lRow).PasteSpecial Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:=False, Transpose:=False
With FilterSht
If .FilterMode Or .AutoFilterMode Then .AutoFilterMode = False
lRw = .Cells(.Rows.Count, "C").End(xlUp).Row ' last row with data in column "C"
.Range("Y1:Z" & lRw).Copy ' copy your range
End With
' paste
TrackerSht.Range("P" & lRow).PasteSpecial Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:=False, Transpose:=False
With FilterSht
If .FilterMode Or .AutoFilterMode Then .AutoFilterMode = False
lRw = .Cells(.Rows.Count, "C").End(xlUp).Row ' last row with data in column "C"
.Range("AB1:AC" & lRw).Copy ' copy your range
End With
' paste
TrackerSht.Range("R" & lRow).PasteSpecial Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:=False, Transpose:=False
End Sub
所以,这里有几个问题
在此代码块中:
With FilterSht
.AutoFilterMode = False
.Range("B2:F").AutoFilter Field:=3, Criteria1:="Mary"
lRw = .Cells(.Rows.Count, "B").End(xlUp).Row
End With
您缺少范围B2:F
内的一个数字。如果要过滤整个列,则两者都应该从B2
中排除数字“2”。我假设您想要使用下一行的lRw
,因此这需要超出您的范围线,然后您需要通过添加&lRw
将其包含在B2:F
中
这条线现在应该是这样的:
.Range("B2:F" & lRw).AutoFilter Field:=2, Criteria1:="Mary"
另外,请记住,此不包括自动筛选中的第2行。我假设您想要筛选第2行,因此如果是这样,您需要将其更改为B1:
下一个问题是复制/粘贴方法。您没有粘贴任何内容,因为您从未复制过它。在与block相同的中,可以添加以下行:
.AutoFilter.Range.Copy
以下是您的最终结果:
Sub RAWtransfertoTRUST()
Dim MainWorkfile As Workbook, OtherWorkfile As Workbook
Dim TrackerSht As Worksheet, FilterSht As Worksheet
Dim lRow As Long, lRw As Long
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Set MainWorkfile = ActiveWorkbook
Set TrackerSht = MainWorkfile.Sheets("Trust Activities Raw")
With TrackerSht
lRow = .Cells(.Rows.Count, "B").End(xlUp).Row
End With
Application.AskToUpdateLinks = False
Set OtherWorkfile = Workbooks.Open(Filename:=Application.GetOpenFilename)
Set FilterSht = OtherWorkfile.Sheets("Raw Data")
With FilterSht
.AutoFilterMode = False
lRw = .Cells(.Rows.Count, "B").End(xlUp).Row
.Range("B1:F" & lRw).AutoFilter Field:=3, Criteria1:="Mary"
.AutoFilter.Range.Copy
End With
' paste
TrackerSht.Range("B" & lRow).PasteSpecial Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:=False, Transpose:=False
With FilterSht
If .FilterMode Or .AutoFilterMode Then .AutoFilterMode = False
lRw = .Cells(.Rows.Count, "C").End(xlUp).Row
.Range("J1:J" & lRw).Copy ' copy your range
End With
' paste
TrackerSht.Range("G" & lRow).PasteSpecial Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:=False, Transpose:=False
With FilterSht
If .FilterMode Or .AutoFilterMode Then .AutoFilterMode = False
lRw = .Cells(.Rows.Count, "C").End(xlUp).Row ' last row with data in column "C"
.Range("N1:Q" & lRw).Copy ' copy your range
End With
' paste
TrackerSht.Range("H" & lRow).PasteSpecial Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:=False, Transpose:=False
With FilterSht
If .FilterMode Or .AutoFilterMode Then .AutoFilterMode = False
lRw = .Cells(.Rows.Count, "C").End(xlUp).Row ' last row with data in column "C"
.Range("T1:W" & lRw).Copy ' copy your range
End With
' paste
TrackerSht.Range("L" & lRow).PasteSpecial Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:=False, Transpose:=False
With FilterSht
If .FilterMode Or .AutoFilterMode Then .AutoFilterMode = False
lRw = .Cells(.Rows.Count, "C").End(xlUp).Row ' last row with data in column "C"
.Range("Y1:Z" & lRw).Copy ' copy your range
End With
' paste
TrackerSht.Range("P" & lRow).PasteSpecial Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:=False, Transpose:=False
With FilterSht
If .FilterMode Or .AutoFilterMode Then .AutoFilterMode = False
lRw = .Cells(.Rows.Count, "C").End(xlUp).Row ' last row with data in column "C"
.Range("AB1:AC" & lRw).Copy ' copy your range
End With
' paste
TrackerSht.Range("R" & lRow).PasteSpecial Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:=False, Transpose:=False
End Sub
哦,我稍微整理了一下你的代码格式:D谢谢你的帮助,我已经解决了我的问题。我只是过滤所有列,然后删除我不需要的列。这是我的示例代码
Sub RAWtransfertoTRUST()
Dim MainWorkfile As Workbook, OtherWorkfile As Workbook
Dim TrackerSht As Worksheet, FilterSht As Worksheet
Dim lRow As Long, lRw As Long
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Set MainWorkfile = ActiveWorkbook
Set TrackerSht = MainWorkfile.Sheets("Trust Activities Raw")
With TrackerSht
lRow = .Cells(.Rows.Count, "C").End(xlUp).Row
End With
Application.AskToUpdateLinks = False
Set OtherWorkfile = Workbooks.Open(Filename:=Application.GetOpenFilename)
Set FilterSht = OtherWorkfile.Sheets("Raw Data")
With FilterSht
.AutoFilterMode = False
lRw = .Cells(.Rows.Count, "C").End(xlUp).Row
.Range("B1:W" & lRw).AutoFilter Field:=2, Criteria1:="Mary"
.AutoFilter.Range.Copy
End With
TrackerSht.Range("B" & lRow).PasteSpecial Paste:=xlPasteValues, _
Operation:=xlNone, SkipBlanks:=False, Transpose:=False
With TrackerSht
.Range("G:I,K:M,R:S,X:AD").DELETE Shift:=xlToLeft
.Range("E:E").Copy
.Range("G:O").PasteSpecial Paste:=xlPasteFormats
.Range("G2", "G1000").NumberFormat = "dd/mm/yyyy"
.Range("M2", "M1000").Interior.ColorIndex = 41
.Range("J2", "J1000").Interior.ColorIndex = 6
End With
End Sub
哪一行导致错误?使用FilterST.AutoFilterMode=False.Range(“B2:F”)。AutoFilter字段:=3,准则1:=“Mary”lRw=.Cells(.Rows.Count,“B”)。End(xlUp)。Row End With我试图添加该代码,以便能够筛选列C,但由于该错误,它将无法继续运行。如果您得到的下标超出范围错误,您能否尝试在
Set filterst=OtherWorkFile.Sheets(“原始数据”)
之后添加以下行:Msgbox(filterst.Name)
仍然出现相同的错误,我认为我的语法在过滤特定列时不正确。你能告诉我如何纠正我的语法吗?thanksThanks@K.DAVIS我试过代码,但自动过滤器不起作用,也没有从B1:F复制数据。其他列只复制“原始数据”中的全部数据。我需要复制的是指定给“Mary”的数据@aicirtap是D列中的“Mary”?因为这就是你的字段:=3
的意思。。。开始栏的第三栏,不是A栏。编辑我刚刚重温了你的问题,Mary在C栏。所以你需要将字段改为2。谢谢@K.Davis,但每当我试图运行代码栏(J1:J,N1:Q,T1:W,Y1:Z,AB1:AC)时,我都会遇到这个问题,只是从(“原始数据”)复制了所有数据它不会为Mary过滤相应的数据。