VBA-将工作簿中的特定列复制并筛选到工作表中

VBA-将工作簿中的特定列复制并筛选到工作表中,vba,excel,Vba,Excel,我已经知道如何从其他工作簿复制特定列,但现在我还需要筛选特定列。我尝试过这段代码,但遇到了一个错误“下标超出范围” 我需要过滤包含“Mary”的列C并复制其相应的数据。 这是我的代码示例,我知道我的语法有问题,尤其是对C列使用自动筛选,复制不同的列并将其粘贴到另一个工作簿。请帮我纠正一下。谢谢 Sub RAWtransfertoTRUST() Dim MainWorkfile As Workbook Dim OtherWorkfile As Workbook Dim TrackerS

我已经知道如何从其他工作簿复制特定列,但现在我还需要筛选特定列。我尝试过这段代码,但遇到了一个错误“下标超出范围”

我需要过滤包含“Mary”的列C并复制其相应的数据。 这是我的代码示例,我知道我的语法有问题,尤其是对C列使用自动筛选,复制不同的列并将其粘贴到另一个工作簿。请帮我纠正一下。谢谢

    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过滤相应的数据。