VBAmacros代码

我想将两个macros代码集成到一个。 第一个macros代码用于查找特定列中的确切行数。 第二个macros代码用于在工作表中执行一组特定的更改。 我需要将第一个macros代码的结果自动插入到第二个macros代码中。 (基本上在范围被定义的地方)

macros代码1

Sub sbLastRowOfDColumn() 'Find the last Row with data in a Column 'In this example we are finding the last row of column D Dim lastRow As Long With ActiveSheet lastRow = .Cells(.Rows.Count, "D").End(xlUp).Row End With MsgBox lastRow End Sub 

macros代码2

 Sub test() Range("A1").Select ActiveCell.FormulaR1C1 = "variable1" Columns("A:A").Select Selection.ClearContents Range("A1").Select ActiveCell.FormulaR1C1 = "gdgs" Range("A2").Select ActiveCell.FormulaR1C1 = "6" Range("A2").Select Selection.AutoFill Destination:=Range("A2:A360"), Type:=xlFillDefault 'need the result of last row at the place of A360 Range("A2:A360").Select ActiveWindow.SmallScroll Down:=-1034 Range("B1").Select ActiveCell.FormulaR1C1 = "dgdgsg" Range("C1").Select ActiveCell.FormulaR1C1 = "gdsgsdgsd" Range("D1").Select ActiveCell.FormulaR1C1 = "sdgsdgsfh" Columns("E:E").Select Selection.Delete Shift:=xlToLeft Range("E1").Select ActiveCell.FormulaR1C1 = "dgsdgsgs" Range("F1").Select ActiveCell.FormulaR1C1 = "url" Range("G:G,H:H,I:I,J:J,K:K,L:L,M:M").Select Range("M1").Activate Selection.Delete Shift:=xlToLeft Columns("D:D").Select Selection.ClearContents Range("D1").Select ActiveCell.FormulaR1C1 = "dgdfggsdgh" Range("D2").Select ActiveCell.FormulaR1C1 = "dgsdgdshshdh" Range("D2").Select Selection.AutoFill Destination:=Range("D2:D360"), Type:=xlFillDefault 'need the result of last row at the place of D360 Range("D2:D360").Select ActiveWindow.SmallScroll Down:=-984 End Sub 

你需要把第一个子变成一个函数。 函数返回值,而subs只是运行过程。

 Function sbLastRowOfDColumn() 'Find the last Row with data in a Column 'In this example we are finding the last row of column D Dim lastRow As Long With ActiveSheet lastRow = .Cells(.Rows.Count, "D").End(xlUp).Row End With sbLastRowOfDColumn = lastrow 'this line sets the value that the function will return. End Function 

然后,在你的第二个macros的任何地方,你需要这个值,而不是数字,只要把sbLastRowOfDColumn 。 例如:

Selection.AutoFill Destination:=Range("D2:D" & sbLastRowOfDColumn)

真的不清楚你想完成什么。 你把一个值放到A1中,然后立即在整列上.ClearContents内容A.这个put-a-value-erase-a-value编码还有其他的例子。 我知道你logging了它,但你需要通过它,并删除无所事事的线路。 可能的话,重新组织您需要完成的步骤并重新logging。

这是我的清理你的代码的尝试。 我已经评论了几个看起来像麻烦的地方。

 Sub test() Dim lr As Long With ActiveSheet lr = .Cells(Rows.Count, "D").End(xlUp).Row .Columns("A:A").ClearContents .Range("A1") = "gdgs" .Range("A2").FormulaR1C1 = "6" .Range("A2:A" & lr).FillDown '<~~see how lr is used .Range("B1") = "dgdgsg" .Range("C1") = "gdsgsdgsd" .Range("D1") = "sdgsdgsfh" '<~~this gets cleared further down .Columns("E:E").Delete Shift:=xlToLeft .Range("E1") = "dgsdgsgs" .Range("F1") = "url" 'i'm not sure if these columns are correct as you deleted column E:E above 'and shifted everything left one column .Range("G:G,H:H,I:I,J:J,K:K,L:L,M:M").Delete Shift:=xlToLeft .Columns("D:D").ClearContents .Range("D1") = "dgdfggsdgh" .Range("D2").FormulaR1C1 = "dgsdgdshshdh" '<~~maybe use .Range("D2").Formula for regulat xlA1 style formulas .Range("D2:D" & lr).FillDown '<~~see how lr is used End With End Sub 

正如你所看到的,没有理由使用macroslogging器使用的.Select进程。 macroslogging器提供的代码是非常详细的,几乎总是可以减less到实际需要的代码。

请参阅如何避免使用Excel中的selectVBAmacros来获取更多的方法来摆脱依靠select和activate来实现您的目标。