编辑录制的宏以过滤3个变量

时间:2019-11-22 16:22:49

标签: excel vba

我想通过说我对VBA还很陌生并且愿意接受更好的方法来对此代码进行开头。我有一个初始过程,在该过程中,我将根据条件(日期,货币组和度量)过滤数组中的值,然后粘贴到另一张纸上。然后,我将运行代码以根据条件复制这些值并粘贴到单独的工作表中。

我现在要消除手动过滤器,在那里我自己过滤材料并粘贴到另一张纸上。我试图在我使用的手动过程中记录一个宏,我的计划是插入一张同名的表,以便其余初始代码可以正常使用。问题是我想读取日期我要粘贴的工作表中,将它们用作变量,然后在要从中获取数据并将其粘贴到另一个工作表中的工作表上过滤值。这是带注释的代码:

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

对于VBA来说还是个新手,所以如果您认为有更好的方法(尤其是关于录制的宏),请告诉我,我自己就可以解决。只是认为最好学习更多有关记录宏的知识。谢谢

2 个答案:

答案 0 :(得分:1)

因此,通常,您将希望使用记录的宏来了解将使用哪些函数来执行某些操作。录制的宏确实不适用于生成动态代码。若要读取要粘贴的工作簿的日期,请使用WorkSheets(“ SheetName”)。Range(“ A1”)。Value。然后,您可以使用该日期来过滤要复制的代码。

一步一步走,不要被淹没。该录制的宏中有大量不必要的垃圾。

答案 1 :(得分:1)

需要注意的几件事:

  • 选择并激活方法:您要避免使用选择/激活方法。通常,在进行宏录制时会自动生成它们,但是在Excel中编写VBA程序时,最好避免使用它们,因为这会使代码库不必要地变大并影响性能。您可以使用Ranges来引用特定的单元格/范围,并以其为参考运行程序。
  • 变量和对象声明:最好向您声明最接近使用变量/对象的位置,以使读者可以轻松地查看其用途和用途。当变量使用在代码库下几行时,很难读取巨大的声明代码块。
  • 复制/粘贴方法:避免使用复制和粘贴。请参考特定的范围/单元格值。例如,假设您要将值从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
  • 工作表引用:我更喜欢使用工作表代码名称,而不是用户可以轻松更改并破坏VBA过程的工作表名称。除了查看这里的详细信息外,还可以随时查看The Spreadsheet Guru site列出了引用工作表的几种方法。

欢迎来到VBA的世界!这是一门很棒的编程语言,尤其是对于那些在Excel中花费大量时间的知识工作者而言。当您发现自己迷失了旅途时,网络上会提供大量支持。

祝你好运!

相关问题