Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.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
Excel 如何使用vba从Word文档中提取电子邮件地址_Excel_Vba_Ms Word - Fatal编程技术网

Excel 如何使用vba从Word文档中提取电子邮件地址

Excel 如何使用vba从Word文档中提取电子邮件地址,excel,vba,ms-word,Excel,Vba,Ms Word,我的目标是从Word.ActiveDocument中提取所有电子邮件地址,并将它们放在Excel工作表的一个单元格中 代码是从Excel VBA编辑器运行的。它需要搜索电子邮件地址,从文档中提取电子邮件地址并填写Excel单元格Activesheet.Range(“C31”)。无论找到多少个电子邮件地址,只有一个单元格可用 找到的地址需要使用“”、“逗号和空格分隔 我试图通过在文档中查找@来实现这一点,然后向前和向后建立范围,使所有电子邮件地址都位于范围变量中。使用rng.MoveEndUnti

我的目标是从
Word.ActiveDocument
中提取所有电子邮件地址,并将它们放在Excel工作表的一个单元格中

代码是从Excel VBA编辑器运行的。它需要搜索电子邮件地址,从文档中提取电子邮件地址并填写Excel单元格
Activesheet.Range(“C31”)
。无论找到多少个电子邮件地址,只有一个单元格可用

找到的地址需要使用“
”、“
逗号和空格分隔

我试图通过在文档中查找
@
来实现这一点,然后向前和向后建立范围,使所有电子邮件地址都位于范围变量中。使用
rng.MoveEndUntil Cset:=“,”
在右侧构建地址非常简单,因为在我的文档中,电子邮件地址后面总是有一个昏迷

但是如何将缺少的电子邮件地址左侧放入范围变量?? 我已经使用了
rng.MoveStart Unit:=wdWord,Count:=-1
但是如果电子邮件是romek怎么办。zjelonek@wp.com或者格拉沃。best@yahoo.com这是行不通的

这就是我现在拥有的

Sub FindEmail035()         '[0-9;A-z;,._-]{1;}\@[0-9;A-z;._-]{1;}
                           '[0-9;A-z;,._-]{1;}\@[0-9;A-z;._-]{1;}
Dim WordApp As Word.Application
Dim WordDoc As Word.Document
Dim ExcelApp As Excel.Application

Dim rng As Word.Range
Dim emailAdr As String
Dim ws As Worksheet

Set WordApp = GetObject(, "Word.Application")
Set ExcelApp = GetObject(, "Excel.Application")
Set WordDoc = WordApp.ActiveDocument
Set rng = WordApp.ActiveDocument.Content
Set ws = ExcelApp.ActiveSheet

ExcelApp.Application.Visible = True

    With rng.Find
        .Text = "@"
        .Wrap = wdFindAsk
        .Forward = True
        .MatchWildcards = False
        .Execute

        Debug.Print rng.Text
        If .Found = True Then
            'rng.Expand (wdWord)
            'Debug.Print rng.Text
            rng.MoveStart Unit:=wdWord, Count:=-1
            Debug.Print rng.Text
            rng.MoveEndUntil Cset:=","
            'rng.MoveEnd Unit:=wdWord, Count:=1
            'rng.MoveEndUntil Cset:=" ", Count:=wdBackward
        End If
   End With     'how to create loop that will extract all the email addresses in the document??
   ws.Range("C31").Value = rng

End Sub
我应该使用什么循环来获取文档中存在的邮件数量,然后在文档中建立包含电子邮件地址的范围

这是文档中邮件地址所在的位置


你走在正确的轨道上。这里最简单的方法是使用
.MoveStartUntil Cset:=“Count:=wdBackward
移动范围的开头,这样您就可以向后移动整个范围,直到找到电子邮件地址之前的空格。当然,这是假设格式一致且没有任意空格

我也只需搜索
ActiveDocument.Content
,然后每次
都搜索
Set rng
。Found=True
,因为您不希望它覆盖您的范围(搜索范围时就是这样)。或者
Dim
一个新的范围
srchRng
或其他东西,然后将其设置为找到的结果

带rng.Find
.Text=“@”
.Wrap=wdFindAsk
.Forward=True
.MatchWildcards=False
.执行
调试.Print rng.Text
如果.Found=True,则
rng.MoveStartUntil Cset:=“”,Count:=wdBackward
rng.MoveEndUntil Cset:=“,”
如果结束

你走对了方向。这里最简单的方法是使用
.MoveStartUntil Cset:=“Count:=wdBackward
移动范围的开头,这样您就可以向后移动整个范围,直到找到电子邮件地址之前的空格。当然,这是假设格式一致且没有任意空格

我也只需搜索
ActiveDocument.Content
,然后每次
都搜索
Set rng
。Found=True
,因为您不希望它覆盖您的范围(搜索范围时就是这样)。或者
Dim
一个新的范围
srchRng
或其他东西,然后将其设置为找到的结果

带rng.Find
.Text=“@”
.Wrap=wdFindAsk
.Forward=True
.MatchWildcards=False
.执行
调试.Print rng.Text
如果.Found=True,则
rng.MoveStartUntil Cset:=“”,Count:=wdBackward
rng.MoveEndUntil Cset:=“,”
如果结束

假设电子邮件地址是纯文本,您可以使用Word VBA代码,如:

Sub Demo()
Dim StrOut As String
With ActiveDocument.Range
  With .Find
    .ClearFormatting
    .Replacement.ClearFormatting
    .Text = "<[0-9A-ÿ.\-]{1,}\@[0-9A-ÿ\-.]{1,}([^13 -/\:-\@\\-`\{-¿])"
    .Replacement.Text = ""
    .Forward = True
    .Format = False
    .Wrap = wdFindStop
    .MatchWildcards = True
    .Execute
  End With
  Do While .Find.Found
    StrOut = StrOut & Trim(.Text) & " "
    .Collapse wdCollapseEnd
    .Find.Execute
  Loop
End With
StrOut = Replace(Trim(StrOut), " ", "; ")
MsgBox StrOut
End Sub
子演示()
像弦一样的暗弦
使用ActiveDocument.Range
和…一起找
.ClearFormatting
.Replacement.ClearFormatting

.Text=“假设电子邮件地址为纯文本,您可以使用Word VBA代码,如:

Sub Demo()
Dim StrOut As String
With ActiveDocument.Range
  With .Find
    .ClearFormatting
    .Replacement.ClearFormatting
    .Text = "<[0-9A-ÿ.\-]{1,}\@[0-9A-ÿ\-.]{1,}([^13 -/\:-\@\\-`\{-¿])"
    .Replacement.Text = ""
    .Forward = True
    .Format = False
    .Wrap = wdFindStop
    .MatchWildcards = True
    .Execute
  End With
  Do While .Find.Found
    StrOut = StrOut & Trim(.Text) & " "
    .Collapse wdCollapseEnd
    .Find.Execute
  Loop
End With
StrOut = Replace(Trim(StrOut), " ", "; ")
MsgBox StrOut
End Sub
子演示()
像弦一样的暗弦
使用ActiveDocument.Range
和…一起找
.ClearFormatting
.Replacement.ClearFormatting

.Text=“旁注-有关Microsoft word的问题,请使用“ms word”标记,并避免使用“word”标记,谢谢!您是否考虑过在附注之前寻找第一个空格?请使用“ms word”标记来回答有关Microsoft word的问题,并避免使用“word”标记,谢谢!您是否考虑过在@之前寻找第一个空间?已接受。是的,我们可以依赖一致的格式。电子邮件前面有空格,后面有昏迷。您能告诉我应该使用什么循环来遍历文档中找到的所有
@
。请编辑我的答案以包含代码。如果您正在谈论如何操作/存储所有电子邮件地址,那么有很多方法可以做到这一点。您可以在线操作它们,可以将它们添加到数组中并稍后循环,也可以连接包含所有电子邮件地址的字符串。这完全取决于你以后对他们做什么。可能最普遍接受/安全的方法是将它们添加到数组中,因为如果最终结果或过程发生更改,那么更改对数组的操作要比重写循环容易得多。我仍然不明白您提供的代码何时(使用哪一行)开始查找第二个(或第三个)电子邮件地址。我选择了“连接包含所有电子邮件地址的字符串”方法,因为结果是我得到一个字符串,然后我可以将其粘贴到我的目标单元格中。这是一个查找,因此它将继续查找,直到没有更多的
@
。但是,我建议您将
.Wrap=wdFindAsk
更改为
.Wrap=wdFindContinue
,这样它将贯穿整个文档。在
If
语句的内部,添加要连接的字符串。Accepted。是的,我们可以依赖一致的格式。电子邮件前面有空格,后面有昏迷。您能告诉我应该使用什么循环来遍历文档中找到的所有
@
。请编辑我的答案以包含代码。如果您正在谈论如何操作/存储所有电子邮件地址,那么有很多方法可以做到这一点。你可以