VBA如何使用字符串变量循环instr函数?

chr*_*lly 2 excel vba excel-vba

我刚刚开始学习VBA,我试图让if和loop函数一起工作.我基本上想要在A列中搜索@,如果有@ then = ok,如果不是="无效".我让它工作一行,但循环它为整个列.请提出建议.PS.请放纵我丑陋的第一个定时器代码.

先谢谢你,克里斯汀

Sub help()

    Dim email As String

    email = InStr(email, "@")

    Do While email = InStr(email, "@")
        Cells(email, 1).Value = email
        If email = 0 Then
            Cells(email, 1).Offset(, 1).Value = "Not valid"
        Else
            Cells(email, 1).Offset(, 1).Value = "ok"
        End If 
    Loop

End Sub
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

Bru*_*yne 6

您可以设置范围,然后遍历该范围:

Sub help()
Dim email As String
Dim rng As Range, cel As Range 'New
Dim lastRow as Long 'New

lastRow = Range("A"& rows.count).End(xlUp).Row
Set rng = Range("A2:A" & lastRow) 'Adjust as necessary

For Each cel In rng
    If InStr(1, cel.Value, "@") > 0 Then
        cel.Offset(0, 1).Value = "Ok"
    Else
        cel.Offset(0, 1).Value = "Not Valid"
    End If
   ' OR as @JohnyL points out, you can do the above in line. 
   ' Just comment out/remove the above `If` statement and uncomment below
   ' cel.Offset(0, 1) = IIf(InStr(1, cel.Value, "@") > 0, "Ok", "Not Valid")
Next cel

End Sub
Run Code Online (Sandbox Code Playgroud)

这是一个可能有效的超短宏,具体取决于数据的布局方式:

Sub t()
Dim rng As Range
Set rng = Range("A2:A" & Cells(Rows.Count, 1).End(xlUp).Row)
rng.Offset(0, 1).Formula = "=IF(ISERR(SEARCH(""@"",A2)),""Not Valid"",""Yes"")"
rng.Offset(0, 1).Value = rng.Offset(0, 1).Value
End Sub
Run Code Online (Sandbox Code Playgroud)

或者,您可以创建用户定义的函数.在工作簿模块中输入以下代码:

Function validate_email(cel As Range) As String
If InStr(1, cel.Value, "@") > 0 Then
    validate_email = "Valid"
Else
    validate_email = "Not Valid"
End If
End Function
Run Code Online (Sandbox Code Playgroud)

在单元格中,比方说B20,只是做=validate_email(A20),我会检查你.这样做的好处是可以在任何单元格上运行,而不必编辑宏的范围.

在此输入图像描述

另外,请注意,您不需要VBA,只需使用=IF(ISERR(SEARCH("@",A2)),"Not Valid","Yes")B列中的公式并向下拖动即可.

最后,正如我在评论中提到的,这并不能真正检查电子邮件的有效性.但是,对于你的问题,它是有效的.请参见本页面本一个,或者干脆寻找VBA电子邮件验证更多的方式来检查,如果电子邮件地址是正确的.

  • 你可以在`For..Each`中使用更短的代码:`cel.Offset(0,1)= IIf(InStr(1,cel.Value,"@")> 0,"Ok","Not Valid") (2认同)