Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA宏复制特定行并将其删除_Excel_Excel Formula_Vba - Fatal编程技术网

Excel VBA宏复制特定行并将其删除

Excel VBA宏复制特定行并将其删除,excel,excel-formula,vba,Excel,Excel Formula,Vba,下面是我想做的: 我有两张工作表,名为待定和记录 “待定”工作表中的列:A:日期,B:送达,C:送达办公室,D:送达经理,E:主题,F:日期和G:信函编号 “记录”工作表中的列:A:日期,B:字母编号,C:主题 在“待定”工作表的G单元格(字母编号)中输入数字后,以下单元格将复制到“记录”工作表中的指定单元格 “待定”工作表中的E(主题)位于“记录”工作表的C(主题)中 F(日期)在“待定”工作表中,位于“记录”工作表的(日期)中 “待定”工作表中的G(字母编号)位于“记录”工作表的B(字母编

下面是我想做的:

  • 我有两张工作表,名为待定和记录
  • “待定”工作表中的列:A:日期,B:送达,C:送达办公室,D:送达经理,E:主题,F:日期和G:信函编号
  • “记录”工作表中的列:A:日期,B:字母编号,C:主题
  • 在“待定”工作表的G单元格(字母编号)中输入数字后,以下单元格将复制到“记录”工作表中的指定单元格
  • “待定”工作表中的E(主题)位于“记录”工作表的C(主题)中
  • F(日期)在“待定”工作表中,位于“记录”工作表的(日期)中
  • “待定”工作表中的G(字母编号)位于“记录”工作表的B(字母编号)中
  • 删除在“待定”工作表中复制的行
  • 根据字母编号(C列)对“记录”工作表中的行进行排序
这是我为我想做的事情(工作不好)编写的代码和一些屏幕截图:

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Column = 6 Then
    If Len(Target.Value) > 0 Then
        Dim r As Range
        Dim a As String
        Dim b As String

        b = "sheet3!A" & Sheet1.Cells(1, 9) + 3 & ":C" & Sheet1.Cells(1, 9) + 3
        a = "E" & Target.Row & ":G" & Target.Row
        Dim r1, r2 As Range
        r1 = Sheet1.Range(a)
        Sheet2.Range(b).Value = r1
        Sheet1.Range(a).EntireRow.Delete
    End If
End If

End Sub

将下面的代码放在“待定”工作表模块的
工作表\u Change
事件下

首先,您应该学会享受
Target
变量的好处

例如,如果要从列“G”(您的
目标
)的同一行的列“F”复制值,可以使用
目标.Offset(,-1).copy

如果要在复制后删除目标的整行,只需使用
Target.EntireRow.delete

另一件事,根据你的屏幕截图(以及你文章的第一部分),“信号”位于“记录”表的“B”栏。因此,
排序是根据列“B”完成的

代码

Option Explicit

Private Sub Worksheet_Change(ByVal Target As range)

Dim RecSht      As Worksheet
Dim NextRow     As Long

Application.ScreenUpdating = False
Application.EnableEvents = False

If Target.Column = 7 Then ' Column "G"
    If Target.Value <> "" Then
        Set RecSht = Worksheets("Records")
        NextRow = RecSht.Cells(RecSht.Rows.Count, "A").End(xlUp).Row + 1 ' <-- get next empty row at Column A in "Records" sheet

        RecSht.Range("B" & NextRow).Value = Target.Value ' column "G"
        RecSht.Range("A" & NextRow).Value = Target.Offset(, -1).Value ' column "F"
        RecSht.Range("C" & NextRow).Value = Target.Offset(, -2).Value ' column "E"

        Target.EntireRow.Delete ' <-- Delete entire row that was copied

        '--- Sort Section ---
        RecSht.Range("A2:C" & NextRow).Sort key1:=RecSht.Range("B2:B" & NextRow), _
                                         order1:=xlAscending, Header:=xlYes
    End If
End If

Application.EnableEvents = True
Application.ScreenUpdating = True

End Sub
选项显式
私有子工作表_更改(ByVal目标作为范围)
Dim RecSht As工作表
暗淡的下一步一样长
Application.ScreenUpdating=False
Application.EnableEvents=False
如果Target.Column=7,则“G”列
如果Target.Value为“”,则
Set RecSht=工作表(“记录”)

NextRow=RecSht.Cells(RecSht.Rows.Count,“A”).End(xlUp).Row+1'根据您的帖子,您希望在“G”列中的值发生更改时运行此代码,但在您的代码中查找的是
Target.column=6
-这是“F”列,而不是“G”列,非常感谢