0

因此,我一直在努力尝试自动化电子表格上的某些功能,并且在大多数情况下,我编写的 VBA 代码的行为符合预期。但让我抓狂的是自动填充应用程序用户名。所以我将它作为一个子运行,因为我有几个不同的函数在运行,这里是代码。

Private Sub Worksheet_Change(ByVal Target As Range)
     If Not Intersect(Target, Range("A4:A198")) Is Nothing Then
        Call AutoName
     End If
End Sub
Sub AutoName()
    Dim myCells As Range
    Set myCells = Selection
    If myCells = (myCells.Value) Then
         With myCells(1, 6)
        .Value = Application.UserName
        .EntireColumn.AutoFit
        End With
        With myCells(1, 5)
        .Value = Date
        End With
    Else
        With myCells(1, 6)
        .Value = Null
        End With
        With myCells
        .Value = Null
        End With
    End If
End Sub

当我在第一个单元格中输入信息时,它会自动将日期和用户名输入到正确的单元格中,就像它应该的那样,但是问题是双重的,首先是当我删除第一个单元格中的输入时,就会发生这种情况。

电子表格图片 用户名保留在 TM 列中,然后填充到日期列中,然后日期填充到案例列中!我尝试添加 .ClearContents, Range.Delete 但无论如何它仍然会发生。我对此束手无策。这不是世界末日,它在大多数情况下都按预期运行,这只是一件令人讨厌的事情。第二个问题再次令人讨厌,如果我在第一个单元格中点击删除,它会自动填充日期单元格中的名称和案例单元格中的日期。同样不是世界末日,只是烦人。任何帮助将不胜感激我哪里出错了。如果不是很明显我是 VBA 的新手

4

1 回答 1

2

如果我理解你想要做什么,你可能想像这样重写,Offset用来明确你正在使用哪些列,并将范围传递给AutoName而不是依赖于Selection. 此外,如果您一次更改多个单元格,您当前的代码将失败。最好循环遍历Intersect特定范围和离子中的每个单元格Target

Private Sub Worksheet_Change(ByVal Target As Range)
     If Not Intersect(Target, Me.Range("A4:A198")) Is Nothing Then
        AutoName rng:=Intersect(Target, Me.Range("A4:A198"))
     End If
End Sub

Sub AutoName(ByVal rng As Range)
    Dim cell As Range

    For Each cell In rng
        If Not IsEmpty(cell.Value) Then
            With cell.Offset(, 6)
                .Value = Application.UserName
                .EntireColumn.AutoFit
            End With
            With cell.Offset(, 5)
                .Value = Date
            End With
        Else
            With cell.Offset(, 5).Resize(, 2)
                .ClearContents
            End With
        End If
    Next
End Sub
于 2019-11-07T17:46:36.410 回答