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

问题描述 投票:0回答:1

只是想通过说我是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来说还是很新,所以如果您认为有更好的方法(特别是关于录制的宏),请告诉我,我自己可以解决。只是认为最好学习更多有关记录宏的知识。谢谢

excel vba
1个回答
0
投票

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

请逐步进行,不要感到不知所措。该录制的宏中有大量不必要的垃圾。

© www.soinside.com 2019 - 2024. All rights reserved.