ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 2069|回复: 7

[原创] 关于notre大神的邮件批量发送

[复制链接]

TA的精华主题

TA的得分主题

发表于 2015-10-31 11:09 | 显示全部楼层 |阅读模式
本帖最后由 johnwalk 于 2015-10-31 12:07 编辑

邮件批量发送
http://club.excelhome.net/thread-781973-1-1.html
(出处: ExcelHome技术论坛)

非常棒的一个东西,还无私的分享出源码
里面东西很有用 自己也正好在学习vba
想就学习notre的东西,分享一点自己的学习体会

  1. Dim myolapp As Object

  2. Sub Send_Mails()
  3.     'On Error Resume Next
  4.     Dim subject As String
  5.     Dim i As Integer
  6.     Dim l As Integer
  7.     Dim wst As Worksheet
  8.     Dim myitem
  9.     Dim y As Long
  10.     Dim z As String

  11.     Set wst = ThisWorkbook.ActiveSheet
  12.     subject = wst.Range("Subject").Value
  13.     Set myolapp = CreateObject("outlook.application")
  14.     i = wst.Range("Receiver").End(xlDown).Row - wst.Range("Receiver").Row
  15.     z = Len(wst.Range("Att").Offset(l, 0).Value)
  16.    
  17.     For l = 1 To i
  18.         Set myitem = myolapp.CreateItem(olMailItem)
  19.         With myitem
  20.             .subject = subject
  21.             .To = wst.Range("Receiver").Offset(l, 0)
  22.             .cc = wst.Range("CCer").Offset(l, 0)
  23.             .BodyFormat = 3
  24.             .Body = MailBody(l, wst)
  25.             '.display
  26.             
  27.             y = 1
  28.             Do
  29.                 x = InStr(y, wst.Range("Att").Offset(l, 0).Value, ";")
  30.                 If x = 0 And y <> 1 Then
  31.                     z = Mid(wst.Range("Att").Offset(l, 0).Value, y, Len(wst.Range("Att").Offset(l, 0).Value) - y + 1)
  32.                 ElseIf x = 0 And y = 1 Then
  33.                     z = wst.Range("Att").Offset(l, 0).Value
  34.                 Else
  35.                     z = Mid(wst.Range("Att").Offset(l, 0).Value, y, x - y)
  36.                 End If
  37.                 y = x + 1
  38.                 .Attachments.Add z
  39.             Loop Until x = 0
  40.                
  41.             .Send
  42.         End With
  43.     Next
  44.         
  45.     'myolapp.Quit
  46.     Set myolapp = Nothing
  47.     Set myitem = Nothing
  48.    
  49. End Sub

  50. Function MailBody(l As Integer, wst As Worksheet)
  51.     'On Error Resume Next
  52.    
  53.     Dim wapp As Object
  54.     Dim wb As Object
  55.     Dim k As Integer
  56.     Dim j As Integer
  57.    
  58.     Set wapp = CreateObject("word.application")
  59.     Set wb = wapp.Documents.Open(wst.Range("Content").Value)
  60.     k = wst.Range("replace").End(xlToRight).Column - wst.Range("replace").Column
  61.    
  62.     For j = 0 To k
  63.         wb.content.Find.Execute findText:=wst.Range("replace").Offset(0, j), Replacewith:=wst.Range("replace").Offset(l, j), Replace:=2
  64.     Next
  65.     MailBody = wb.content.Text
  66.    
  67.     wb.Close SaveChanges:=False
  68.     wapp.Quit
  69.    
  70.     Set wb = Nothing
  71.     Set wapp = Nothing
  72. End Function
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-10-31 11:43 | 显示全部楼层
本帖最后由 johnwalk 于 2015-10-31 11:44 编辑

复制代码
先表达对大神的敬仰之情。高手 必须的
好了 不说废话了
首先不说vba
先说表本身,大神在表中定义了6个名称。一是锚定,2是方便调用。真是一个好用的技巧
我们先看看 定义了那些名称
挺多的 用一下vba 获取一下把
  1. Sub nn()
  2. Set nms = ActiveWorkbook.Names
  3. Set wks = Worksheets(1)
  4. For i = 1 To nms.Count
  5.     wks.Cells(i + 18, 2).Value = nms(i).Name
  6.     wks.Cells(i + 18, 3).Value = nms(i).RefersToRange.Address
  7. Next


  8. End Sub
复制代码


TA的精华主题

TA的得分主题

 楼主| 发表于 2015-10-31 11:53 | 显示全部楼层
上述代码解释:
名称 对excel来说 有个集合 names
集合一出 哪个对象都跑不了
通过使用for循环 遍历通过集合的 索引 “引用”names中所有的元素

返回name的名称 和 引用位置

并把它赋值给cells
这里的cells是
Worksheet.Cells 属性

返回一个 Range 对象,因为 Item 属性是 Range 对象的默认属性 (默认属性:可以对控件设置的属性,以使每次新建该类型的控件时,这个属性的值都相同。),所以可以在 Cells 关键字后面紧接着指定行和列索引
运行上述代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-10-31 12:05 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
Att$D$13:$D$13
CCer$C$13:$C$13
Content$B$11:$B$11
Receiver$B$13:$B$13
Replace$E$13:$E$13
Subject$B$10:$B$10
我们得到了表中的全部名称的信息。大神初步打算依次代表附件地址、抄送人 、内容、收件人、邮件body中自定义部分、邮件主题
看看 大神构思  就是比小白强多了  (我会说我是跪着写完这些的么)

这里再次感谢一下 大神notre
良好的习惯 怕vba代码我这种小白看不懂,(其实也怕时间久了 自己也忘了)
为何要麻烦的在表中定义这么多名称呢
1、代码好读一些
2、方便range调用
因为range可以识别工作簿中的名称

不过话说range到底特么的事对象还是属性???

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-10-31 16:18 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
好吧  说完表格本身 回到代码吧
大神的代码清晰  已读  我等小白都能看懂
简而言之 分为一个主过程sub和一个自定义的函数function
运用office对象 outlook和word等方法  等application级的对象 实现发邮件的过程
来 看看代码吧

01 Dim myolapp As Object  这里声明dim了一个对象object变量 我一般念 欧巴姐对象 大神是想干嘛呢 看看变量的名字 myolapp
噢,my=俺的ol=officelady app=爱pp  就是说相当于一个officelady回来帮你发邮件 幸福啊
接下来看看

Sub Send_Mails()
sub一个过程 叫发邮件 简单直白 点赞
    'On Error Resume Next
这里明显是个猪死了
    Dim subject As String
继续声明变量 大神还是很规范的 给了个字符串类型 是用来干嘛的呢?
哦 原来是为了存储邮件主题的说
    Dim i As Integer
来个整形  变量  其实改成mailnumber 更好理解
    Dim l As Integer
又来个整形
一般来整形变量的 都是用来计个数啊 控制个小循环啊 搞一个动态引用啊什么的
真的不骗你
    Dim wst As Worksheet
来一个表对象 起名叫wst 文森特 有个名字好叫 上面搞个i啊l啊什么的 多没有格调啊
这个wst后面会立功的 他将作为间谍 打入敌人的内部
    Dim myitem
又声明一个 。。。。。我去 这个是啥 不知道  其实系统也不知道 但最后会知道的
    Dim y As Long
来 来个龙型变量 龙嘛  一般都会长一点 好吧 其实龙的体积就等于2个integer
    Dim z As String
好的 又来一个字符串

变量定义完了 内存地址也都分配好了 ,其实我觉得大神这个啥写的还是很随意的,。能发出去就差不多了
变量的目的 就是要被赋值,往内存里面写点0101010101吧


    Set wst = ThisWorkbook.ActiveSheet
让文森特去代表这个希特对象。 对象一般都会吊一些 非要射它一下,下边的数值 只穿 都很nice的
    subject = wst.Range("Subject").Value
噢  色不接也被赋值了 被文森特的range使用表中的name调用了  话说value不是默认属性么
    Set myolapp = CreateObject("outlook.application")
哦 天啊  玛德西亚,无中生有出大招 一来就创建一个outlook对象  还是appliacat级的
我们的officelady要要进入状态了
byw,您的outlook部署好了么,库挂了么
    i = wst.Range("Receiver").End(xlDown).Row - wst.Range("Receiver").Row
这个不多说了前面有奖。关键是明白Range("Receiver").End(xlDown)
这是个方法 还是属性?麻蛋 不管了 vba就是这么蛋筒。我们只要知道结果也是一个range
但是这个让哥是个单元格 是 包含 receiver这个单元格的区域    的边缘 的位置
end 其实就是end捡 xl+上下左右有为你指明方向xlup xldown xltoleft xltoright
微软就是这么任性

对了 要小心空格  还要小心假空白
row肉 属性 单元格行号
vba水真深  我都不想学了  哎~~~

好吧 蒸腾半天  电脑终于知道要发的信的数量了
    z = Len(wst.Range("Att").Offset(l, 0).Value)
这里啊  数数附件有多长 楞 为啥  有用啊
来了个offset 这里啊 就不说了 非常重要的一个属性  最好百度一下
太长 就不说了 健儿研究就是返回一个range 哪里的rangge呢  offset给你坐标
这里是l,0  不是1,0  所以说啊特么坑人啊
L还没有赋值 一般系统给个默认值 0
好 现在知道了 坐标 0,0  额?特么还在原地啊
2个字儿。。。我们知道原地的情况 就是俩字儿 附件儿 (我是北京儿的 说话就这样儿)
其实 到这里 大家会发现 前面有个地方大神写的不太合适  不知道大家看出来没有
猜对有奖
好了 太累了 歇一下 88

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-10-31 16:22 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
累死了 写了半天 居然有敏感词  帮主帮我改改 别删@版主

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-11-1 21:06 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
到了关键的地方了,技术含量就要在这里体现了,
其实想画一个流程图的,无奈昨晚重装系统,驱动还没有装好呢。
好吧,不说废话了,
主要部分用了两个循环完成,ipqadmini打字好累

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-11-1 21:17 | 显示全部楼层
好了  iamback 上网 打痣 还是用笨笨的好 hp的 probook 还不错  就是重了点 好在不烫手  不烫腿 价钱便宜
还送免费正版的win导师 真不是在做广告
废话太多  我改我改
接下来:2个循环
一个就是for next
一个就是潜逃在里面的do loop until
外层循环主要解决了在outlook里面创建邮件项目的问题
内层do loop until 主要是解决多附件的问题
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-24 12:46 , Processed in 0.043000 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表