Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.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
Vba 将最近的工作表更改捕获为变量_Vba_Excel - Fatal编程技术网

Vba 将最近的工作表更改捕获为变量

Vba 将最近的工作表更改捕获为变量,vba,excel,Vba,Excel,对于这样的表: | B | C | D | E | F ---+------+--------+------+--------+------ 1 | Name | Number | Fab | Design | Hours ---+------+--------+------+--------+------ 2 | AAAA | 10 | 35 | 811 | 505 3 | BBBB | 11 | 541 |

对于这样的表:

   |  B   |   C    |  D   |   E    |   F
---+------+--------+------+--------+------
 1 | Name | Number | Fab  | Design | Hours
---+------+--------+------+--------+------
 2 | AAAA |   10   |   35 |  811   |  505
 3 | BBBB |   11   |  541 |   18   |  694
 4 | CCCC |   12   | 9622 |   81   |  181
 5 | DDDD |   13   |  626 |  848   |  111
 6 | EEEE |   14   |    6 |  821   | 6616
 7 | FFFF |   15   | 6262 |  862   |   60
 8 | GGGG |   16   |  306 |  941   | 6166
 9 | HHHH |   17   |  365 |  484   |    6
删除列
B
中的单元格后,“我的代码”会显示一个消息框,询问用户在删除整行之前是否确定

如何在删除单元格之前获取其值,并将其传递给另一个宏,该宏将根据该值删除另一个工作表中的单元格

代码如下:

Private Sub Worksheet_Change(ByVal Target As Range)
  ' If target column is B, is below the header row AND it's new value is blank then...
  If Target.Column = 2 And Target.Row > 1 And Target.Value = "" Then
    ' Clear contents of row
    ans = MsgBox("Are you sure you want to Delete......This cannot Be Undone !!!", vbYesNo)
    If ans = vbYes Then

'How do I select Column 2, Row active cell and copy the value?
'How do I make the value into variable YYY?

      Rows(ActiveCell.Row).EntireRow.Delete 
      Exit Sub
    End If
  End If
End Sub

获取已删除值的一种方法是使用“撤消”功能,尝试以下操作:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim ans As Integer
    Dim YYY As String

    If Target.Column = 2 And Target.Row > 1 And Target.Value = "" Then

    ans = MsgBox("Are you sure you want to Delete......This cannot Be Undone !!!", vbYesNo)
    If ans = vbYes Then

        With Application
            .EnableEvents = False ' freeze WorkSheetChange event since you're about to UNDO a change
            .Undo ' undo the change
            YYY = Target.Value ' assign the deleted-undone value in to YYY
            Rows(ActiveCell.Row).EntireRow.Delete ' delete that row
            .EnableEvents = True ' re-enable all events
        End With
        MsgBox YYY ' now you have that value in YYY
    Exit Sub
    End If

    End If

End Sub

听起来你想复制刚刚删除的值-但是你不能,因为你刚刚删除了它?是的,这就是问题所在。请参阅下面的答案-你可以冻结工作表更改事件,通过编程使用“撤消”将删除的值放回单元格,将值放入YYY,然后正常删除行。没问题!这有点“黑客”,我认为,使用撤销功能,我觉得它可能会在某个时候导致错误-我可能会重新发明人们可以删除行的方式-比如在指定的删除列中按“D”或其他。。。如果遇到问题,请告诉我。我在第一个“End if”语句之后调用了另一个宏TestDeleteRows,得到一个编译错误:Sub或Function未定义。尽管我知道它是定义的,但为什么它要这样做?除非我能看到完整的代码,否则我不确定-它是一个
Private
函数/sub吗?它与上面的代码相同,所以它仍然是一个Private sub。顺便问一下,你是如何格式化你的评论的?如果
TestDeleteRows
是一个
Private
例程,尝试将
Private
更改为
Public
,看看是否有效-取决于调用例程的位置、模块、表单、工作表对象或工作簿对象。。。这可能有点令人困惑。另外-我正在用“``倒勾(英国键盘上1号的左边)格式化注释中的
code
——只需将其放在
单词的任一侧即可。对于大问题格式,可以突出显示代码并按CTRL+K