Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.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_Events - Fatal编程技术网

Excel 在单元格中输入值后编辑单元格的触发代码

Excel 在单元格中输入值后编辑单元格的触发代码,excel,vba,events,Excel,Vba,Events,我编写了一个宏来检查某些单元格中输入的值 如果输入值高于8,则多余值将写入另一个单元格,并将输入值更改为8。如果输入值小于8,则缺失的量将写入第三个单元格 Private Sub Worksheet_SelectionChange(ByVal Target As Range) TA = Target.Address: R = Target.Row: C = Target.Column If C = 2 Or C = 7 Then If (R < 19 And R > 11) Or

我编写了一个宏来检查某些单元格中输入的值

如果输入值高于8,则多余值将写入另一个单元格,并将输入值更改为8。如果输入值小于8,则缺失的量将写入第三个单元格

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
TA = Target.Address: R = Target.Row: C = Target.Column
If C = 2 Or C = 7 Then
  If (R < 19 And R > 11) Or (R < 33 And R > 25) Then
    Hours = Cells(R, C).Value
    If Hours <> 0 Then
      If Hours > 8 Then
        Cells(R, C) = 8
        Cells(R, C + 1) = Hours - 8
      End If
      If Hours < 8 Then
        Cells(R, C + 2) = 8 - Hours
      End If
    End If
  End If
End If
End Sub
Private子工作表\u selection更改(ByVal目标作为范围)
TA=目标。地址:R=目标。行:C=目标。列
如果C=2或C=7,则
如果(R<19和R>11)或(R<33和R>25),则
小时=单元格(R,C).值
如果是0小时,那么
如果小时数>8,则
单元(R,C)=8
电池(R,C+1)=小时-8
如果结束
如果小时数小于8,则
电池(R,C+2)=8小时
如果结束
如果结束
如果结束
如果结束
端接头

问题是,当我输入输入时,宏不会执行,只有当我再次选择单元格时才会执行。

您的函数
工作表\u SelectionChange
仅当所选单元格发生更改时才会触发。您应该改用
工作表\u Change
。有关更多详细信息,请参见此部分。

您的函数
工作表\u selection change
仅在所选单元格更改时触发。您应该改用
工作表\u Change
。有关详细信息,请参见此图。

首先将触发事件从工作表\u选择更改更改为工作表\u更改

其次,您可以优化代码,因为您可以读取
目标
属性,所以您可以在代码中保存几行

第三,我修改了检查行的测试条件,通过切换到
selectcase
,您现在可以轻松地向该条件添加更多行

使用
Target.offset
将结果插入相邻单元格

我添加了
Exit Sub
,因此在您更改此处的值后,它不会额外运行一段时间

如果需要,还可以删除
Hours
,因为不需要它(除非您有一个全局变量以某种方式读取此值)

如果目标值为0,则可以使用
等)

Private子工作表\u更改(ByVal目标作为范围)
'检查目标是否在B列或G列中
如果Target.Column=2或Target.Column=7,则
选择案例目标。行
案例12至18,26至32'检查目标行是否为12至18(包括)ir介于26至32(包括)之间
小时=目标值
如果是0小时,那么
如果小时数>8,则
目标值=8
目标偏移量(0,1)。值=小时-8
出口接头
其他的
如果小时数小于8,则
Target.Offset(0,2).Value=8小时
如果结束
出口接头
如果结束
如果结束
结束选择
如果结束
端接头

首先将触发事件从工作表选择更改更改为工作表更改

其次,您可以优化代码,因为您可以读取
目标
属性,所以您可以在代码中保存几行

第三,我修改了检查行的测试条件,通过切换到
selectcase
,您现在可以轻松地向该条件添加更多行

使用
Target.offset
将结果插入相邻单元格

我添加了
Exit Sub
,因此在您更改此处的值后,它不会额外运行一段时间

如果需要,还可以删除
Hours
,因为不需要它(除非您有一个全局变量以某种方式读取此值)

如果目标值为0,则可以使用
等)

Private子工作表\u更改(ByVal目标作为范围)
'检查目标是否在B列或G列中
如果Target.Column=2或Target.Column=7,则
选择案例目标。行
案例12至18,26至32'检查目标行是否为12至18(包括)ir介于26至32(包括)之间
小时=目标值
如果是0小时,那么
如果小时数>8,则
目标值=8
目标偏移量(0,1)。值=小时-8
出口接头
其他的
如果小时数小于8,则
Target.Offset(0,2).Value=8小时
如果结束
出口接头
如果结束
如果结束
结束选择
如果结束
端接头
Private Sub Worksheet_Change(ByVal Target As Range)

' check if target is in Column B or Column G
If Target.Column = 2 Or Target.Column = 7 Then

    Select Case Target.Row
        Case 12 To 18, 26 To 32  ' check if target row is 12 to 18 (including) ir between 26 to 32 (including)

            Hours = Target.Value
            If Hours <> 0 Then
                If Hours > 8 Then
                    Target.Value = 8
                    Target.Offset(0, 1).Value = Hours - 8
                    Exit Sub
                Else
                    If Hours < 8 Then
                        Target.Offset(0, 2).Value = 8 - Hours
                    End If
                    Exit Sub
                End If
            End If
    End Select
End If

End Sub