Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.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 如何将sub扩展到多个单元格范围?_Excel_Vba_Function - Fatal编程技术网

Excel 如何将sub扩展到多个单元格范围?

Excel 如何将sub扩展到多个单元格范围?,excel,vba,function,Excel,Vba,Function,此代码的目的是在某个单元格的内容更改时更新单元格中的日期 因为这最初是在子单元中编码的,所以我现在需要将此代码扩展到多个单元的范围。也就是说,此时,代码只获取单元格D4并更新单元格L4,我希望能够向下拖动此函数,使其能够到达多个单元格范围;取D5并更新L5等 以下是我作为子系统的代码: Dim oldValue Public Sub Worksheet_SelectionChange(ByVal Target As Range) oldValue = Target.Worksheet.Rang

此代码的目的是在某个单元格的内容更改时更新单元格中的日期

因为这最初是在子单元中编码的,所以我现在需要将此代码扩展到多个单元的范围。也就是说,此时,代码只获取单元格D4并更新单元格L4,我希望能够向下拖动此函数,使其能够到达多个单元格范围;取D5并更新L5等

以下是我作为子系统的代码:

Dim oldValue

Public Sub Worksheet_SelectionChange(ByVal Target As Range)
oldValue = Target.Worksheet.Range("D4").Value
End Sub

Private Sub Worksheet_Change(ByVal Target As Range) 
  If Not Intersect(Target, Target.Worksheet.Range("D4")) Is Nothing Then
    If oldValue <> Target.Worksheet.Range("D4").Value Then
        Target.Worksheet.Range("L4").Value = Date
    End If
  End If
End Sub
Dim oldValue
公共子工作表\u选择更改(ByVal目标作为范围)
oldValue=Target.Worksheet.Range(“D4”).Value
端接头
私有子工作表_更改(ByVal目标作为范围)
如果不相交(Target、Target.Worksheet.Range(“D4”))则为空
如果为oldValue Target.sheet.Range(“D4”).Value,则
Target.Worksheet.Range(“L4”)。值=日期
如果结束
如果结束
端接头
这里的问题是,我不知道如何正确地扩展代码以匹配进一步选择的单元格。以下是我的尝试:

Dim oldValue

Public Sub Worksheet_SelectionChange(ByVal Target As Range)
oldValue = Target.Worksheet.Range("D4", "D21").Value
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Target.Worksheet.Range("D4", "D21")) Is Nothing Then
    If oldValue <> Target.Worksheet.Range("D4", "D21").Value Then
        Target.Worksheet.Range("L4", "L21").Value = Date
    End If
End If
End Sub
Dim oldValue
公共子工作表\u选择更改(ByVal目标作为范围)
oldValue=Target.Worksheet.Range(“D4”、“D21”).Value
端接头
私有子工作表_更改(ByVal目标作为范围)
如果不相交(Target、Target.sheet.Range(“D4”、“D21”))则为零
如果是oldValue Target.Worksheet.Range(“D4”、“D21”)。值,则
Target.Worksheet.Range(“L4”、“L21”)。值=日期
如果结束
如果结束
端接头
编辑:我写的sub只适用于一个单元格,我正在尝试找到一种方法,将其扩展到特定的单元格选择中。即D4:D12,相应地更新L4:L12中的日期


如果有人能帮助我,我将不胜感激

请尝试以下代码:

Dim oldValue()

Public Sub Worksheet_SelectionChange(ByVal Target As Range)
    oldValue = Me.Range("D4:D12").Value
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Me.Range("D4:D12")) Is Nothing Then
        Application.EnableEvents = False
        Dim c As Range
        For Each c In Intersect(Target, Me.Range("D4:D12"))
            'Check value against what is stored in "oldValue" (row 4 is in position 1, row 5 in position 2, etc)
            If oldValue(c.Row - 3, 1) <> c.Value Then
                'Update value in column L (8 columns to the right of column D)
                c.Offset(0, 8).Value = Date 'or possibly "= Now()" if you need the time of day that the cell was updated
            End If
        Next
        Application.EnableEvents = True
    End If
End Sub
Dim oldValue()
公共子工作表\u选择更改(ByVal目标作为范围)
oldValue=Me.范围(“D4:D12”).值
端接头
私有子工作表_更改(ByVal目标作为范围)
如果不相交(Target,Me.Range(“D4:D12”))则为零
Application.EnableEvents=False
调光范围
对于相交中的每个c(目标,Me.Range(“D4:D12”))
'对照“oldValue”中存储的内容检查值(第4行位于位置1,第5行位于位置2,等等)
如果oldValue(c.行-3,1)c.值,则
'更新L列中的值(D列右侧8列)
c、 偏移量(0,8)。Value=Date'或者如果需要更新单元格的时间,则可能“=Now()”
如果结束
下一个
Application.EnableEvents=True
如果结束
端接头

请尝试以下代码:

Dim oldValue()

Public Sub Worksheet_SelectionChange(ByVal Target As Range)
    oldValue = Me.Range("D4:D12").Value
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Me.Range("D4:D12")) Is Nothing Then
        Application.EnableEvents = False
        Dim c As Range
        For Each c In Intersect(Target, Me.Range("D4:D12"))
            'Check value against what is stored in "oldValue" (row 4 is in position 1, row 5 in position 2, etc)
            If oldValue(c.Row - 3, 1) <> c.Value Then
                'Update value in column L (8 columns to the right of column D)
                c.Offset(0, 8).Value = Date 'or possibly "= Now()" if you need the time of day that the cell was updated
            End If
        Next
        Application.EnableEvents = True
    End If
End Sub
Dim oldValue()
公共子工作表\u选择更改(ByVal目标作为范围)
oldValue=Me.范围(“D4:D12”).值
端接头
私有子工作表_更改(ByVal目标作为范围)
如果不相交(Target,Me.Range(“D4:D12”))则为零
Application.EnableEvents=False
调光范围
对于相交中的每个c(目标,Me.Range(“D4:D12”))
'对照“oldValue”中存储的内容检查值(第4行位于位置1,第5行位于位置2,等等)
如果oldValue(c.行-3,1)c.值,则
'更新L列中的值(D列右侧8列)
c、 偏移量(0,8)。Value=Date'或者如果需要更新单元格的时间,则可能“=Now()”
如果结束
下一个
Application.EnableEvents=True
如果结束
端接头

设置隐藏表以保存旧值




工作表\u Change
事件处理程序中,您将检查与要监视的范围相交的
目标
单元格。如果存在差异,则更新时间戳和隐藏工作表上与更改单元格对应的单元格


Private子工作表\u更改(ByVal目标作为范围)
Application.EnableEvents=False
Application.ScreenUpdating=False
变暗单元格作为范围,拖动单元格作为范围
设置DRange=范围(“D4:D10、D12、D14:D20”)
如果不相交(DRange,Target),则什么都不是
对于Intersect中的每个单元格(DRange、Target)
如果cell.Value工作表(“MirrorValues”).Range(cell.Address),则
cell.EntireRow.Cells(1,“L”).Value=Now
工作表(“镜像值”).Range(cell.Address)=cell.Value
如果结束
下一个
如果结束
Application.EnableEvents=True
Application.ScreenUpdating=False
端接头

设置隐藏表以保存旧值




工作表\u Change
事件处理程序中,您将检查与要监视的范围相交的
目标
单元格。如果存在差异,则更新时间戳和隐藏工作表上与更改单元格对应的单元格


Private子工作表\u更改(ByVal目标作为范围)
Application.EnableEvents=False
Application.ScreenUpdating=False
变暗单元格作为范围,拖动单元格作为范围
设置DRange=范围(“D4:D10、D12、D14:D20”)
如果不相交(DRange,Target),则什么都不是
对于Intersect中的每个单元格(DRange、Target)
如果cell.Value工作表(“MirrorValues”).Range(cell.Address),则
cell.EntireRow.Cells(1,“L”).Value=Now
工作表(“镜像值”).Range(cell.Address)=cell.Value
如果结束
下一个
如果结束
Application.EnableEvents=True
Application.ScreenUpdating=False
端接头

工作表\u Change
是一个事件处理程序,因此它必须是一个子
才能起作用。“我现在需要将此代码扩展到多个单元格范围”的确切含义是什么?除了Comintern的评论外,我认为您真正的问题在于确定原因:“以前,在刷新工作簿时,它更新了日期,现在不更新,并且仅在单元格内的值发生更改时更新”,如果我没有弄错的话。你是:)一个子程序可以很容易地在一个范围o上运行
Private Sub Worksheet_Change(ByVal Target As Range)
    Application.EnableEvents = False
    Application.ScreenUpdating = False

    Dim cell As Range, DRange As Range
    Set DRange = Range("D4:D10,D12,D14:D20")
    If Not Intersect(DRange, Target) Is Nothing Then
        For Each cell In Intersect(DRange, Target)

            If cell.Value <> Worksheets("MirrorValues").Range(cell.Address) Then
                cell.EntireRow.Cells(1, "L").Value = Now
                Worksheets("MirrorValues").Range(cell.Address) = cell.Value
            End If

        Next
    End If

    Application.EnableEvents = True
    Application.ScreenUpdating = False

End Sub