Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.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 如果特定单元格发生更改,则自动执行代码_Excel_Vba - Fatal编程技术网

Excel 如果特定单元格发生更改,则自动执行代码

Excel 如果特定单元格发生更改,则自动执行代码,excel,vba,Excel,Vba,如果单元格H6更改为与拖拉机不同的内容,我想使用Excel 2013清除单元格H7。单元格H6的值通过下拉列表设置 如果我手动执行,下面的代码已经可以运行了。但是,我希望它在单元格H6更改时自动执行 Sub CheckIt1() If Range("b6") <> "Tractors" Then Range("h7").ClearContents End Sub Sub CheckIt2() If Range("b9") <> "Tractors" Then R

如果单元格
H6
更改为与
拖拉机不同的内容,我想使用Excel 2013清除单元格
H7
。单元格
H6
的值通过下拉列表设置

如果我手动执行,下面的代码已经可以运行了。但是,我希望它在单元格
H6
更改时自动执行

Sub CheckIt1()
  If Range("b6") <> "Tractors" Then Range("h7").ClearContents
End Sub

Sub CheckIt2()
  If Range("b9") <> "Tractors" Then Range("h10").ClearContents
End Sub
子检查1()
如果是范围(“b6”)“拖拉机”,则是范围(“h7”)。清除内容物
端接头
次级支票2()
如果是范围(“b9”)“拖拉机”,则是范围(“h10”)。清除内容物
端接头

我有一系列10对,当不满足条件时需要自动清除。

如果打开VB编辑器,您将在屏幕左侧看到如下内容:

-  VBAProject (xxxxxx.xlsm)
   -  Microsoft Excel Objects
      - Sheet1 (Sheet1)
      - Sheet2 (Sheet2)
      - Sheet3 (Sheet3)
      - ThisWorkbook
   -  Modules
        Module1 
        Module2
在屏幕上,负数将显示在小方框中。如果任何一个负数是正数,请单击它以展开项目内容的该部分

如果已重命名工作表,则第一个“Sheet1”、“Sheet2”等将保持不变,因为工作表有Excel的永久名称,但第二个副本将被您的名称替换。如果您已重命名模块,“Module1”等将被您的名称替换

单击“ThisWorkbook”,右侧的代码区域将被清除。您可以在此代码区域中放置任何代码,但它主要用于工作簿级别的事件例程

事件例程是在关联事件发生时Excel将执行的VBA代码。因此,打开工作簿时将执行子工作簿的打开操作

现在单击“SheetN(SheetN)”,其中SheetN是包含要监视的单元格的工作表。同样,您将得到一个空代码区。此代码区域与SheetN关联。您可以将其用于仅与SheetN关联的事件例程

将下面的代码复制到代码区域

我已经为您编写了一个
工作表\u Change
例程。每次SheetN中的单元格或区域或区域并集发生更改时,都会使用一个参数执行此例程,该参数为
范围
,列出所有已更改的单元格和/或区域。对于其他工作表中的更改,不执行此例程

此例程的核心是以下三个阵列:

CellsToMonitor = Array("B6", "B9", "B12", "B15")
ExpectedValue = Array("Tractors", "Tractors", "Tractors", "Tractors")
CellsToClear = Array("H7", "H10", "H13", "H16")
CellsToMonitor
列出要监视的单元格。你的问题列出了B6和B9。为了测试的目的,我又添加了几个单元格。您可以根据需要在此列表中添加或减去

您的问题意味着,在任何情况下,预期值都是“拖拉机”。我已经将期望值放置在一个数组中,以便您可以根据需要使用不同的值

CellsToClear
列出要清除的单元格

所有这些都将在事件例程中详细解释

我已经尝试测试了可能发生的每种类型的更改的例程。您将需要使用该例程来充分了解它是如何工作的,因此您可能会重复我的测试。如果有必要,带着问题回来,但是,你能为自己锻炼的越多,你的发展就会越快

Private Sub Worksheet_Change(ByVal Target As Range)

  ' Target can be:
  '  * a single cell such as A1
  '  * a range such as A1:B2
  '  * a union of cells and ranges such as A1:B2, C3, D5

  ' Every cell in the range Target has been changed by the user or a macro.

  ' Stop the clearing of a cell from calling this routine
  Application.EnableEvents = False

  Dim CellsToMonitor As Variant
  Dim ExpectedValue As Variant
  Dim CellsToClear As Variant

  CellsToMonitor = Array("B6", "B9", "B12", "B15")
  ExpectedValue = Array("Tractors", "Tractors", "Tractors", "Tractors")
  CellsToClear = Array("H7", "H10", "H13", "H16")

  ' * CellsToMonitor is a list of cells within the worksheet that are to be monitored.
  '   The value of cells not in this list are not of interest.  The code assumes the
  '   column codes in this array are uppercase; so "B6" not "b6".
  ' * ExpectedValue is a list of the expected values for the cells to monitor. In the
  '   question all these values are the same.  This array allows the expected values
  '   to be different.
  ' * CellsToClear identifies the cell to be cleared if a monitored cell does not
  '   have the expected values.
  ' * The three arrays must have the same number of elements. If CellsToMonitor(N)
  '   is one of the cells in Target and if Range(CellsToMonitor(N)).Value is not
  '   equal to ExpectedValue(N) then Range(CellsToClear(N)) is cleared

  Dim ColCrnt As Long
  Dim InxMon As Long
  Dim InxTA As Long
  Dim RngCrnt As Range
  Dim RowCrnt As Long
  Dim TgtAddrPart() As String
  Dim TgtCellAddr As String
  Dim WshtTgt As Worksheet

  ' The cells within Target could have been changed by a macro so ActiveSheet
  ' does not have to be the worksheet being monitored.
  Set WshtTgt = Target.Worksheet

  TgtAddrPart = Split(Target.Address, ",")

  For InxTA = LBound(TgtAddrPart) To UBound(TgtAddrPart)

    Set RngCrnt = WshtTgt.Range(TgtAddrPart(InxTarget))

    ' RngCrnt.Row is the first row in the range
    ' RngCrnt.Rows.Count is the number of rows in the range.
    ' ColCrnt.Column and RngCrnt.Columns.Count are the same but for columns

    For RowCrnt = RngCrnt.Row To RngCrnt.Row + RngCrnt.Rows.Count - 1
      For ColCrnt = RngCrnt.Column To RngCrnt.Column + RngCrnt.Columns.Count - 1
        ' Debug.Print "Target cell = Cells(" & RowCrnt & ", " & ColCrnt & ")"

        ' Create A1 format address for current target cell
        TgtCellAddr = ColNumToCode(ColCrnt) & RowCrnt

        For InxMon = LBound(CellsToMonitor) To UBound(CellsToMonitor)
          If TgtCellAddr = CellsToMonitor(InxMon) Then
            ' Have match on address
            If WshtTgt.Cells(RowCrnt, ColCrnt).Value <> ExpectedValue(InxMon) Then
              ' Do not have match on expected value so clear linked cell
              WshtTgt.Range(CellsToClear(InxMon)).ClearContents
            End If
            Exit For
          End If
        Next  ' For each cell to monitor

      Next  ' For each column within Range within Target
    Next  ' For each row within Range within Target

  Next  ' For each Range within Target

  Application.EnableEvents = True

End Sub
Function ColNumToCode(ByVal ColNum As Long) As String

  Dim ColCode As String
  Dim PartNum As Long

  ' Last updated 3 Feb 12.  Adapted to handle three character codes.
  If ColNum = 0 Then
    ColNumToCode = "0"
  Else
    ColCode = ""
    Do While ColNum > 0
      PartNum = (ColNum - 1) Mod 26
      ColCode = Chr(65 + PartNum) & ColCode
      ColNum = (ColNum - PartNum - 1) \ 26
    Loop
  End If

  ColNumToCode = ColCode

End Function
Private子工作表\u更改(ByVal目标作为范围)
“目标可以是:
“*单个单元格,如A1
“*范围,如A1:B2
'*A1:B2、C3、D5等单元格和范围的并集
'范围目标中的每个单元格都已被用户或宏更改。
'停止清除调用此例程的单元格
Application.EnableEvents=False
Dim CellsToMonitor作为变体
Dim ExpectedValue作为变量
暗淡的细胞变为透明的
CellsToMonitor=阵列(“B6”、“B9”、“B12”、“B15”)
ExpectedValue=数组(“拖拉机”、“拖拉机”、“拖拉机”、“拖拉机”)
CellsToClear=阵列(“H7”、“H10”、“H13”、“H16”)
“*CellsToMonitor是工作表中要监视的单元格列表。
'不在此列表中的单元格的值不重要。代码假定
'此数组中的列代码为大写;所以“B6”不是“B6”。
“*ExpectedValue是要监视的单元格的预期值列表。在
质疑所有这些值都是一样的。此数组允许使用预期值
“要与众不同。
'*CellsToClear标识受监控单元格未被清除时要清除的单元格
'具有预期的值。
'*三个数组必须具有相同数量的元素。如果是CellsToMonitor(N)
'是目标和if范围(CellsToMonitor(N))中的一个单元格。值不是
'等于预期值(N),则清除范围(CellsToClear(N))
暗冷如长
暗淡的因克斯蒙一样长
黯淡如长
Dim RngCrnt As范围
长得一样暗
将TgtAddrPart()设置为字符串
将TgtCellAddr设置为字符串
将WshtTgt设置为工作表
'目标中的单元格可能已被宏更改,因此ActiveSheet
'不必是正在监视的工作表。
设置WshtTgt=Target.Worksheet
TgtAddrPart=Split(Target.Address,“”)
对于InxTA=LBound(TgtAddrPart)到UBound(TgtAddrPart)
设置RngCrnt=WshtTgt.Range(TgtAddrPart(InxTarget))
'RngCrnt.Row是范围中的第一行
'RngCrnt.Rows.Count是范围内的行数。
'ColCrnt.Column和RngCrnt.Columns.Count相同,但用于列
对于RowCrnt=RngCrnt.Row到RngCrnt.Row+RngCrnt.Rows.Count-1
对于ColCrnt=RngCrnt.Column到RngCrnt.Column+RngCrnt.Columns.Count-1
'Debug.Print“目标单元格=单元格(“&RowCrnt&”,“&ColCrnt&”)
'为当前目标单元格创建A1格式地址
TgtCellAddr=ColNumToCode(ColCrnt)和rowcrn
对于InxMon=LBound(CellsToMonitor)到UBound(CellsToMonitor)
如果tgtcelladrr=CellsToMonitor(InxMon),则
'地址匹配
如果WshtTgt.Cells(RowCrnt、ColCrnt).Value ExpectedValue(InxMon),则
'预期值不匹配,因此清除链接单元格
WshtTgt.Range(CellsToClear(InxMon)).ClearContents