我的子例程通过在我的msgbox中显示一个空字符串来规范我的if条件

时间:2018-12-25 23:56:11

标签: excel-vba

我动态更新A和B列中的单元格,并使用&将每行的两个值连接在一起,并将这些值放在c列中。

我的目的是通过在输入firstName(ColumnA值)和LastName(columnB值)两次时检测重复的名称来实现的。但是,在测试过程中,我意识到,当我删除重复的名称后再出现第一个匹配项时,总是弹出一个空值(显示msgbox时会观察到)。

有时这是一个问题,尤其是因为有时msgbox不会消失...。例如,代码崩溃。

有人可以帮助我防止显示空值或msgBox表单吗?我怀疑我的if语句出了什么问题。

非常感谢。

这是我放置在工作表中的vba代码

// javascript sdk
firebase.firestore().settings({
   /* other settings */
   timestampsInSnapshots: true
})

// admin sdk
admin.firestore().settings({
   /* other settings */
   timestampsInSnapshots: true
})

1 个答案:

答案 0 :(得分:1)

如果我想创建一张纸

-2        -1       0
ColA      ColB     ColC
First1    Last1    First1Last1
First2    Last2    First2Last2
First3    Last3    First3Last3
First4    Last4

我个人将首先使用条件格式设置ColC来标记什么是重复项,以防万一出现问题而绕过消息框。

如果我确实需要一个消息框,我将进行类似于您的设置:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Intersect(Target, Columns(3)) Is Nothing Then Exit Sub
    If Target.Count > 1 Then Exit Sub
    If Application.CountIfs(Range("C1:C12"),Target.Value) > 1 Then 'checks for first/last name
        MsgBox("The name " & Target.Offset(0,-2).Value & " " & Target.Offset(0,-1).Value & " already exists." & vbNewLine & "Please enter a new name.")
    End If
End Sub

编辑1:

鉴于colA和colB的数据输入,这会更合适吗?我利用了目标的行,因此负偏移量不必担心,因为您知道colA是名字,而colB是姓氏。

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Count > 1 Then Exit Sub
    Dim r as long
    r = target.row
    If isempty(cells(r,1)) or isempty(cells(r,2)) then exitsub
    If Application.CountIfs(Range("B1:B12"),cells(r,2).Value,Range("A1:A12"),cells(r,1).Value) > 1 Then 'checks for first/last name
        MsgBox("The name " & cells(r,1).Value & " " & cells(r,2).Value & " already exists." & vbNewLine & "Please enter a new name.")
    End If
End Sub

编辑2:

在验证是否使用任何值和某些值时,此宏一直在进行我的测试(我添加了清晰的内容和.select,因此您已重新上线,应该添加数据);我还添加了一个与相交有关的范围规范,以防您将诸如first / last的值添加到a1:b12之外的随机位置:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Count > 1 Then Exit Sub
    If Intersect(Target, Range(Cells(1, 1), Cells(12, 2))) Is Nothing Then Exit Sub
    Dim r As Long
    r = Target.Row
    If IsEmpty(Cells(r, 1)) Or IsEmpty(Cells(r, 2)) Then Exit Sub
    If Application.CountIfs(Range("B1:B12"), Cells(r, 2).Value, Range("A1:A12"), Cells(r, 1).Value) > 1 Then 'checks for first/last name
        MsgBox ("The name " & Cells(r, 1).Value & " " & Cells(r, 2).Value & " already exists." & vbNewLine & "Please enter a new name.")
        Cells(r, 1).ClearContents
        Cells(r, 2).ClearContents
        Cells(r, 1).Select
    End If
End Sub