VBA如何使用字符串变量循环instr函数?
我刚开始学习VBA,我正试图让if和loop函数一起工作。 我基本上想在A列中搜索@,如果有@,则=ok,if not=“not valid”。 我让它为一行工作,但为整个列循环它。请告知。 请宽容我丑陋的第一次代码 提前谢谢大家,, 克里斯汀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,
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的新手!)