InStrRev()问题

时间:2012-03-02 16:29:29

标签: string vba

我正在尝试编写一个Do循环,该循环进入一个长字符串并返回空格的位置,然后返回电子邮件地址和空格的位置。使用InStr()我已经能够找到电子邮件地址的结尾。现在我需要找到开头然后使用Mid()来拉出地址。我看到InStrRev()应该从字符串的末尾开始然后搜索,但是看看实际的手册,它只是给出了第二个字符实例。例如:

我的字符串是:

请给我发电子邮件。我的电子邮箱:fake@gmail.com如果你不能打电话给我。

到目前为止,我所做的是返回@的位置,在这种情况下,如果是42.然后我使用InStr()返回@之后的第一个“”的位置。在这种情况下,52。我希望在@之前返回第一个“”的位置。在这种情况下它应该是37.我的计划是使用Mid(37,15)。十五是52&的差异37.我尝试使用InStrRev()返回37但无法使其工作。有什么建议?下面是我的代码。

x = 2

Do

Cells(x, 11).Select
Cells(x, 11).Value = (InStrRev(Cells(x, 9), Cells(x, 2), " "))

x = x + 1

On Error Resume Next

Loop Until Cells(x, 2).Value = ""

其中(x,9)是@的位置,而(x,2)是字符串。

3 个答案:

答案 0 :(得分:7)

或者如果你需要的只是电子邮件地址:

Function GetEmail(longstr As String) As String

GetEmail = Filter(Split(longstr, " "), "@")(0)

End Function

通常,在Excel中应该避免循环,因为它很慢,下面将执行代码在没有循环的情况下执行的操作:

Columns(12).Cells(1).Resize(Columns(11).Cells(2).End(xlDown).Row - 1, 1).Offset(1).Value = _
            Application.Transpose(Filter(Split(Join(Application.Transpose(Columns(11).Value), " "), " "), "@"))

答案 1 :(得分:3)

怎么样:

MyArray = Split(Mystring," ")

For i=0 To Ubound(MyArray)
   If Instr(MyArray(i)),"@")>0 Then
       ''Email
   End If
Next

答案 2 :(得分:3)

' Find the @ symbol
Dim atPosition As Integer
atPosition = InStr(cellValue, "@")
' check if found here

' Find the space after the @
Dim secondSpacePosition As Integer
secondSpacePosition = InStr(atPosition, cellValue, " ")
' check if found here

' Find the space before the @
Dim firstSpacePosition As Integer
firstSpacePosition = InstrRev(cellValue, " ", atPosition) '  beware, the arguments differ a little
' check if found here

Dim email As String
email = Mid(cellvalue, firstSpacePosition + 1, secondSpacePosition - firstSpacePosition - 1)