繁体   English   中英

编辑录制的宏的代码

[英]Editing the code for a recorded Macro

我是使用宏和代码的新手,并且遇到了一个小问题。 我有一张工作表,可以在其中连续更新值。 由于这些更新是过程的一部分,因此我希望excel在我的工作簿的下一张工作表中将行记录为一种历史记录。 我记录了一个宏,当我按cntrl + r时,它会复制数据表中的第一行,在历史记录页上插入一行,然后将数据复制到该新行上。 唯一的问题是我的数据表将包含多行数据,并且我希望宏能够复制我选择的行,而不仅仅是每次复制第一行。 我把代码放在下面。

谢谢!

Sub RecordTracker()
RecordTracker Macro
Records the updated row as a history row in Documentation Sheet
Keyboard Shortcut: Ctrl+r

    Sheets("Documentation").Select
    Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
    Sheets("Tracker").Select
    Range("A3:S3").Select
    Selection.Copy
    Sheets("Documentation").Select
    Range("A1").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=False
End Sub

抱歉,我的代码格式有些不对。 第一篇文章!

你的第一个前加入这一行.Select

r = ActiveCell.Row

然后您要更改此行:

Range("A3:S3").Select

对此:

Range("A" & Cstr(r) & ":S" & Cstr(r)).Select

我认为应该这样做。


注意:使用.Select速度很慢,并且存在一些其他可靠性/交互性问题,因此我们通常建议不要使用它。 但是,如果没有它,很难执行真正的复制操作,因此在这种情况下可能还可以。 但是 ,如果您确实不需要真正的副本(格式,公式等),而只想要该值,那么有一种更好的方法来做到这一点。


这是一个更好的方法,因为您只需要数据。 我将其分为几行,以便您看到它是如何完成的。

Sub RecordTracker()
'RecordTracker Macro
'Records the updated row as a history row in Documentation Sheet
'Keyboard Shortcut: Ctrl r

    ' get the worksheet objects
    Dim wsDoc As Worksheet, wsTrak As Worksheet
    Set wsDoc = Sheets("Documentation")
    Set wsTrak = Sheets("Tracker")

    ' get the source (current) row
    Dim r As Long
    r = ActiveCell.Row

    'Make the output row
    wsDoc.Range("A2").EntireRow.Insert shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove '.Range("A2:S2").Select

    ' get the source data
    Dim dat() As Variant
    dat = wsTrak.Range("A" & CStr(r) & ":S" & CStr(r))

    ' set the output range
    Dim outRng As Range
    Set outRng = wsDoc.Range("A2:S2")

    ' copy data to the output range
    outRng = dat
End Sub
  1. 将在( A2 )中的工作表Documentation上插入新行
  2. 复制您选择的行(从工作表Tracker ,范围A:S
  3. 将值粘贴到Documentation A2 (这是您新创建的行)上

这需要粘贴到工作表Tracker VBE中才能执行

请注意,通过避免使用.Select方法,可以大大减少代码(就行而言)。 您可以在这里找到一些有用的信息

Sub StoreChanges()

    Sheets("Documentation").Range("A2").EntireRow.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
    Sheets("Tracker").Range(Cells(ActiveCell.Row, "A"), Cells(ActiveCell.Row, "S")).Copy
    Sheets("Documentation").Range("A1").PasteSpecial Paste:=xlPasteValues

End Sub

我假设在数据表(跟踪器)中,您想要粘贴选定的范围/行,而不仅仅是第三行A3:S3

我记录了一个宏,当我按cntrl + r时,它会复制数据表的第一行,在历史记录页上插入一行,然后将数据复制到该新行上

尝试删除Range("A3:S3").Select代码行。 现在,当您在工作表跟踪器中手动选择一行时,该行应在代码Selection.Copy使用。

Sheets("Documentation").Select
Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
Sheets("Tracker").Select
## removed Range("a3:s3").select
Selection.Copy
Sheets("Documentation").Select

如果要从第二行开始添加新行,只需在代码Selection.Insert之前添加Sheets("Documentation").Rows("2:2").Select

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM