Excel 编辑录制的宏以筛选三个变量

Excel 编辑录制的宏以筛选三个变量,excel,vba,Excel,Vba,我有一个初始过程,在这个过程中,我会根据条件(日期、货币组和度量)过滤数组中的值,然后粘贴到另一张表中。然后,我将运行代码,根据条件复制这些值,并粘贴到单独的工作表中 我想消除手动位,我过滤自己并粘贴到另一张纸上。我记录了我使用的手动过程,我的计划是插入一张同名的表,以便初始代码的其余部分正常工作 问题是,我想读取粘贴到的工作表上的日期,将其用作变量,然后过滤从中获取数据的工作表上的值并粘贴到另一个工作表中 以下是带有注释的代码: Sub Actual() Dim rw As Integer

我有一个初始过程,在这个过程中,我会根据条件(日期、货币组和度量)过滤数组中的值,然后粘贴到另一张表中。然后,我将运行代码,根据条件复制这些值,并粘贴到单独的工作表中

我想消除手动位,我过滤自己并粘贴到另一张纸上。我记录了我使用的手动过程,我的计划是插入一张同名的表,以便初始代码的其余部分正常工作

问题是,我想读取粘贴到的工作表上的日期,将其用作变量,然后过滤从中获取数据的工作表上的值并粘贴到另一个工作表中

以下是带有注释的代码:

Sub Actual()

Dim rw As Integer
Dim z As Integer
Dim i As Integer
Dim rpt_nm As String
Dim wb As Workbook: Set wb = ThisWorkbook
Dim wb2 As Workbook
Dim dt1, dt2, dt3 As Date
Dim ws As Worksheet
Dim TAmt, VAmt, UAmt, OAmt As Double

Worksheets("PAct").Range("G1").Activate

Let rw = ActiveCell
Let rpt_nm = Range("k1").Value
Let dt1 = Cells(rw, 1)
Let dt2 = Cells(rw + 1, 1)
Let dt3 = Cells(rw + 2, 1)

' Workbooks.Open Filename:=ThisWorkbook.Path & "\2. 2019 Legacy.xlsx"
Set wb2 = Workbooks.Open(Filename:=ThisWorkbook.Path & rpt_nm)
With wb2
    .Sheets.Add After:=.Sheets("Actual Input").Name = "VBA Input"
End With

'This is the macro I recorded in sheet I am trying to copy from
Sheets("Actual Input").Activate
Columns("E:E").Select
Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
Range("E2").Select
ActiveCell.FormulaR1C1 = _
                 "=IF(LEN(RC[-1])=9,DATE(RIGHT(RC[-1],4),LEFT(RC[-1],1),MID(RC[-1],3,2)),DATE(RIGHT(RC[-1],4),LEFT(RC[-1],2),MID(RC[-1],4,2)))"
Range("E2").Select         'Formatting on previous lines was my clumsy attempt to try and change text formats to dates using excel
Selection.AutoFill Destination:=Range("E2:E721")
Range("E2:E721").Select
Selection.Copy
Range("E2").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                 :=False, Transpose:=False
Range("D1").Select
Application.CutCopyMode = False
Selection.Copy
Range("E1").Select
ActiveSheet.Paste
Application.CutCopyMode = False
Columns("D:D").Select
Selection.Delete Shift:=xlToLeft
Range("A1").Select
Range(Selection, Selection.End(xlToRight)).Select
Selection.AutoFilter
ActiveSheet.Range("$A$1:$H$721").AutoFilter Field:=7, Criteria1:="Net"
****ActiveSheet.Range("$A$1:$H$721").AutoFilter Field:=4, Operator:= _
                 xlFilterValues, Criteria2:=Array(1, "7/31/2019", 1, "8/31/2019", 1, "9/30/2019") 'This is the place where I want to remove the specific dates selected and use variables
ActiveSheet.Range("$A$1:$H$721").AutoFilter Field:=3, Criteria1:="5M="       ‘Everytime I try and replace these values with dt1, dt2 and dt3 the filter will not select anything and there is no data****
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
ActiveSheet.Next.Select
Range("A2").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                 :=False, Transpose:=False
Range("I3").Select
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = "=RC[-1]/1000000"
Range("I3").Select
Selection.AutoFill Destination:=Range("I3:I17")
Range("I3:I17").Select
ActiveSheet.Previous.Select
ActiveSheet.Range("$A$1:$H$721").AutoFilter Field:=3, Criteria1:="1M-4.99M"
Selection.Copy
ActiveSheet.Next.Select
Range("K2").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                 :=False, Transpose:=False
Range("S3").Select
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = "=RC[-1]/1000000"
Range("S3").Select
Selection.AutoFill Destination:=Range("S3:S17")
Range("S3:S17").Select
ActiveSheet.Previous.Select
ActiveSheet.Range("$A$1:$H$721").AutoFilter Field:=3, Criteria1:="1M<"
Selection.Copy
ActiveSheet.Next.Select
Range("U2").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
                 :=False, Transpose:=False
ActiveWindow.SmallScroll ToRight:=4
Range("AC3").Select
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = "=RC[-1]/1000000"
Range("AC3").Select
Selection.AutoFill Destination:=Range("AC3:AC17")
Range("AC3:AC17").Select
'This is where the macro recorder ends

For z = 0 To 2
    For i = 0 To 2

        wb2.Worksheets("VBA Input").Activate

        VAmt = Cells(3 + (i * 5), 9 + (z * 10))
        UAmt = Cells(4 + (i * 5), 9 + (z * 10)) + Cells(5 + (i * 5), 9 + (z * 10))
        TAmt = Cells(6 + (i * 5), 9 + (z * 10))
        OAmt = Cells(7 + (i * 5), 9 + (z * 10))

        wb.Worksheets("PAct").Activate
        Cells(rw + i, 16 + (z * 5)) = TAmt
        Cells(rw + i, 17 + (z * 5)) = VAmt
        Cells(rw + i, 18 + (z * 5)) = UAmt
        Cells(rw + i, 19 + (z * 5)) = OAmt

    Next
Next

End Sub
Sub-Actual()
作为整数的Dim rw
将z调整为整数
作为整数的Dim i
尺寸rpt_nm作为字符串
将wb设置为工作簿:设置wb=ThisWorkbook
将wb2设置为工作簿
尺寸dt1、dt2、dt3作为日期
将ws设置为工作表
Dim TAmt、VAmt、UAmt、OAmt为双色
工作表(“PAct”).范围(“G1”).激活
设rw=ActiveCell
设rpt_nm=范围(“k1”).值
设dt1=单元(rw,1)
设dt2=单元(rw+1,1)
设dt3=单元(rw+2,1)
'工作簿.Open文件名:=ThisWorkbook.Path&“\2.2019 Legacy.xlsx”
设置wb2=Workbooks.Open(文件名:=thiswoolk.Path&rpt\u nm)
使用wb2
.Sheets.Add After:=.Sheets(“实际输入”).Name=“VBA输入”
以
'这是我在工作表中记录的宏,我正试图从中复制
工作表(“实际输入”)。激活
列(“E:E”)。选择
选择。插入Shift:=xlToRight,CopyOrigin:=xlFormatFromLeftOrAbove
范围(“E2”)。选择
ActiveCell.FormulaR1C1=_
“=如果(LEN(RC[-1])=9,日期(右(RC[-1,4),左(RC[-1,1),中(RC[-1,3,2)),日期(右(RC[-1,4),左(RC[-1,2),中(RC[-1,4,2))”
范围(“E2”)。我笨拙地尝试使用excel将文本格式更改为日期,但选择了前几行的格式
Selection.AutoFill目标:=范围(“E2:E721”)
范围(“E2:E721”)。选择
选择,复制
范围(“E2”)。选择
Selection.Paste特殊粘贴:=xlPasteValues,操作:=xlNone,SkipBlank_
:=假,转置:=假
范围(“D1”)。选择
Application.CutCopyMode=False
选择,复制
范围(“E1”)。选择
活动表。粘贴
Application.CutCopyMode=False
列(“D:D”)。选择
选择。删除移位:=xlToLeft
范围(“A1”)。选择
范围(选择,选择。结束(xlToRight))。选择
自动筛选
ActiveSheet.Range(“$A$1:$H$721”)。自动筛选字段:=7,标准1:=“净”
****ActiveSheet.Range(“$A$1:$H$721”)。自动筛选字段:=4,运算符:=_
xlFilterValues,Criteria2:=数组(1,“2019年7月31日”,1,“2019年8月31日”,1,“2019年9月30日”)'这是我想要删除所选特定日期并使用变量的地方
ActiveSheet.Range(“$A$1:$H$721”)。自动筛选字段:=3,准则1:=“5M=“”每次我尝试用dt1、dt2和dt3替换这些值时,筛选将不选择任何内容,并且没有数据****
范围(选择,选择。结束(xlDown))。选择
选择,复制
ActiveSheet.Next.Select
范围(“A2”)。选择
Selection.Paste特殊粘贴:=xlPasteValues,操作:=xlNone,SkipBlank_
:=假,转置:=假
范围(“I3”)。选择
Application.CutCopyMode=False
ActiveCell.FormulaR1C1=“=RC[-1]/1000000”
范围(“I3”)。选择
Selection.AutoFill目标:=范围(“I3:I17”)
范围(“I3:I17”)。选择
ActiveSheet.Previous.Select
ActiveSheet.Range(“$A$1:$H$721”)。自动筛选字段:=3,标准1:=“1M-4.99M”
选择,复制
ActiveSheet.Next.Select
范围(“K2”)。选择
Selection.Paste特殊粘贴:=xlPasteValues,操作:=xlNone,SkipBlank_
:=假,转置:=假
范围(“S3”)。选择
Application.CutCopyMode=False
ActiveCell.FormulaR1C1=“=RC[-1]/1000000”
范围(“S3”)。选择
Selection.AutoFill目的地:=范围(“S3:S17”)
范围(“S3:S17”)。选择
ActiveSheet.Previous.Select

ActiveSheet.Range($A$1:$H$721”).AutoFilter字段:=3,Criteria1:=“1M因此,通常情况下,您需要使用录制的宏来了解将使用哪些函数来执行某些操作。录制的宏对于生成动态代码来说并不太好。要读取粘贴到的工作簿的日期,请使用工作表(“SheetName”).Range(“A1”).Value。然后可以使用该日期筛选要复制的代码


循序渐进,不要不知所措。录制的宏中有大量不必要的垃圾。

因此,一般来说,您需要使用录制的宏来了解您将使用哪些函数来执行某些操作。录制的宏对于生成动态代码来说并不太好。要读取粘贴到的工作簿的日期,例如,使用工作表(“SheetName”).Range(“A1”).Value。然后可以使用该日期筛选要复制的代码


一步一步走,不要不知所措。录制的宏中有大量不必要的垃圾。

需要注意的几点:

  • 选择和激活方法:您希望避免使用选择/激活方法。通常在进行宏录制时,这些方法会自动生成。但是,在Excel中编写VBA程序时,最好避免使用这些方法,因为这会使代码库变得不必要的大,并影响性能。您可以避免引用特定的单元/范围使用并运行其以外的程序作为参考
  • 变量和对象声明:最好声明最接近其使用位置的变量/对象,因为读卡器可以很容易地看到该项的使用位置和用途。当变量使用代码库中的几行时,很难读取大量的声明代码块
  • 复制/粘贴方法:避免使用复制和粘贴。请参考特定的范围/单元格值。例如,假设您要将值从Sheet1单元格A1复制到Sheet2单元格A2。您可能会遇到以下情况:
  • 工作表引用:我更喜欢
        Dim src As Range, dest As Range
    
        Set src = Sheet1.Range("A1")
        Set dest = Sheet2.Range("A2")
    
        dest.Value2 = src.Value2