Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.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
VBA如何使用字符串变量循环instr函数?_Vba_Excel - Fatal编程技术网

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

VBA如何使用字符串变量循环instr函数?,vba,excel,Vba,Excel,我刚开始学习VBA,我正试图让if和loop函数一起工作。 我基本上想在A列中搜索@,如果有@,则=ok,if not=“not valid”。 我让它为一行工作,但为整个列循环它。请告知。 请宽容我丑陋的第一次代码 提前谢谢大家,, 克里斯汀 Sub help() Dim email As String email = InStr(email, "@") Do While email = InStr(email, "@") Cells(email,

我刚开始学习VBA,我正试图让if和loop函数一起工作。 我基本上想在A列中搜索@,如果有@,则=ok,if not=“not valid”。 我让它为一行工作,但为整个列循环它。请告知。 请宽容我丑陋的第一次代码

提前谢谢大家,, 克里斯汀

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

您可以设置一个范围,然后在该范围内循环:

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
下面是一个可能有效的超短宏,具体取决于数据的布局方式:

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
或者,您可以创建用户定义的函数。在工作簿模块中输入以下代码:

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
在手机里,比如说B20,只要验证电子邮件(A20),我就帮你查一下。这样做的优点是可以在任何单元格上运行,并且不必编辑宏的范围

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


最后,正如我在评论中提到的,这并不能真正检查电子邮件的有效性。然而,对于你的问题,它是有效的。请参阅,或,或只是搜索更多方法来检查电子邮件地址是否正确。

A19
开始向下,这是一种可能的解决方案:

Option Explicit

Sub help()

    Dim email       As String
    Dim rngCell     As Range

    Set rngCell = Range("A19")

    Do While rngCell <> vbNullString
        If InStr(rngCell, "@") Then
            rngCell.Offset(, 1) = "Ok"
        Else
            rngCell.Offset(, 1) = "Not valid"
        End If

        Set rngCell = rngCell.Offset(1, 0)

    Loop

End Sub
选项显式
辅助帮助()
将电子邮件设置为字符串
Dim rngCell As范围
设置rngCell=范围(“A19”)
在rngCell vbNullString时执行
如果仪表(rngCell,“@”),则
rngCell.Offset(,1)=“正常”
其他的
rngCell.Offset(,1)=“无效”
如果结束
设置rngCell=rngCell.Offset(1,0)
环
端接头

用稍微不同的方式做怎么样:

Sub foo()
Dim email As String
Dim lastrow As Long
lastrow = Sheet1.Cells(Rows.Count, "A").End(xlUp).Row 'change the Sheet1 to whatever
For i = 2 To lastrow 'loop through from row 2 to Last
    email = InStr(Sheet1.Cells(i, 1).Value, "@") 'do the Instr
    If email = 0 Then Sheet1.Cells(i, 2).Value = "Not Valid"
    If email > 0 Then Sheet1.Cells(i, 2).Value = "Ok"
Next i
End Sub

您需要的代码如下所示:

Option Explicit

Sub help()

Dim LastRow As Long, i As Long

LastRow = Cells(Rows.Count, "A").End(xlUp).Row ' get last row with data in column A

For i = 1 To LastRow
    If InStr(Range("A" & i).Value2, "@") > 0 Then
        Range("B" & i).Value2 = "ok"
    Else
        Range("B" & i).Value2 = "Not Valid"
    End If
Next i

End Sub

很好,只需将rng动态设置为数据的最后一行。您可以在
中为..每个
使用较短的代码:
cel.Offset(0,1)=IIf(InStr(1,cel.Value,“@”)>0,“Ok”,“Not Valid”)
@BruceWayne我认为,如果OP能够了解大量编写VBA的方法,这不会造成任何伤害,对吗?:)@BruceWayne和我想我们可以使用一个线性函数:
为范围内的每个cel(“A2:A”&Range(“A1”).CurrentRegion.Rows.Count)
:)因为这两个选项都是字符串文本,所以可以使用
IIf
-
验证电子邮件=IIf(InStr(1,cel.Value,“@”)>0,“有效”,“无效”)
将UDF作为一个赋值。这是
IIf
得到良好使用的一个完美例子。如果你读到这篇文章并想“哦,很好,我现在就开始为每个三元条件使用
IIf
”,只要知道
IIf
执行真部分和假部分,这就是为什么我说“因为两个选项都是字符串文本”-如果任何一个分支都有副作用,就不要使用
IIf
!仅供参考-您可以在不需要VBA的情况下执行此检查。我/我们仍然回答了这个问题,因此您可以帮助学习VBA(正如您看到的,有许多方法可以对单元格进行蒙皮),只是想让您知道还有一个简单的公式解决方案。条件格式也可以通过
=IFERROR(如果(搜索(“*”&“&“&“&“*”&“&“&“&“&”&“.com”,A1)、“正确格式”、“错误格式”)来解决这个问题。
(正如@Maldred的帖子所暗示的那样,请注意,对于您当前的公式,如果有
电子邮件的条目,这将返回为有效……即使您缺少
.com/edu/org/mil
)我需要更正我的公式实际上,它需要
”之前的某个地方有一个
,而且它还需要一个
“.com”
。更正的公式为:
=IFERROR(如果(搜索(“*”&“@”&“*”&“*”&“,”,A1),“正确格式”,),“错误格式”)
这将采取任何类似于
*@**.
@BruceWayne的方法。我意识到没有VBA很容易,但在我学习VBA的过程中,我需要知道如何使用VBA,因此我非常感谢您的建议!谢谢您,但代码没有运行,我收到一个错误“424”我的mac是法语的,所以翻译类似于“需要对象”“。不确定我遗漏了什么。您需要将Sheet1更改为Sheets(“工作表名称”)或甚至更改为ActiveSheet。。很好,现在它与ActiveSheet一起完美运行!我也尝试将您的解决方案标记为有效,但似乎我只能将一个标记为已接受(是的,我也是stackoverflow的新手!)