最新WPS办公软件学习教程_免费企业办公软件下载_金山WPS Office官网论坛

 找回密码
 
查看: 9050|回复: 30

[VBA/VBS教程] 使用vbs脚本批量发送wps表格中的工资条到相应的电子邮箱

[复制链接]

154

主题

27

听众

5095

积分

解答支持团员

Rank: 14Rank: 14Rank: 14Rank: 14

签到天数: 1 天

[LV.1]初来乍到

金币
2784
威望
11083
帖子
2618
精华
0

技术分享团 解答支持团 测试体验团 优秀会员奖 活跃会员奖 乐于助人奖 技巧教程分享达人

发表于 2014-4-19 15:39 |显示全部楼层
分享到: 新浪微博 腾讯微博
本帖最后由 quelea 于 2014-4-19 15:51 编辑
0 x. A. k- ^$ r2 V9 a: X2 @" Y; |0 v" l% W
问题来源和解决:9 W, R5 e' k8 S5 s1 `( x

4 d6 F1 t9 D) o! M表格 能不能发送工资条到特定邮箱呢_最新WPS办公软件学习教程_免费企业办公软件下载_金山WPS Office官网论坛' @/ S/ L- P- H) [0 v+ s
http://bbs.wps.cn/thread-22421002-1-1.html( r, W+ w8 w; e7 J
8 H, q& p! n( N0 W
解决:
% G% L! @6 Z" i: S5 Uhttp://bbs.wps.cn/forum.php?mod= ... 615&fromuid=14781441 e$ r9 ^0 `8 }/ G3 V. ?( c9 H, O) n1 q

- ~: M: |0 K8 k* S! U本文不重复上帖中的内容,重点叙述编程思路。
" Q1 ]5 ~5 w$ G8 D- z  O8 P; q& t9 j9 F" e: `9 @2 z
使用vbs脚本发送电子邮件,是关键问题。这个通过Google,然后简单修改一下,写了一个函数,在本程序用于发送电子邮件:
Const SMTP_Server = "smtp.qq.com"
/ I( Y( `8 Q/ b; LConst SMTP_Port = 25( a+ ?+ u) A, k# L+ ~& m
Const SendUserName = "你的邮箱用户名", c' T" n  |, a; T3 ^( m) V/ ?
Const SendPassword = "你的邮箱密码"
1 ?6 c, j4 [2 C" X: zConst EmailFrom = "回信地址@qq.com") y4 u. a+ Z  s( C% `/ C

! N6 y- N5 b# k/ DFunction Send_Email (Address, Caption, Text)* \! \! W2 h/ A/ j8 N9 Q) t
        NameSpace = "http://schemas.microsoft.com/cdo/configuration/"
0 |  m- F  X5 D; S7 M+ q( a+ j        Set Email = CreateObject("CDO.Message")
* j3 {4 y3 z' W8 g        Email.From = EmailFrom            '自己的邮箱2 k( C% R* e& i8 K  c& b# U
        Email.To = Address                '要发送到的邮箱
, i3 |* a( \, Z$ o        Email.Subject = Caption            '邮件主题
; G. p! G. W8 p* t        Email.Textbody = Text                  '邮件内容
3 b4 X! ?  o' d6 \        rem Email.AddAttachment "C:\file.zip"        '附件,没有由删除此句
  w: X" C& X8 a& P        With Email.Configuration.Fields
/ U& ^; j, l8 c$ J  G- p            .Item(NameSpace&"sendusing") = 2
( F2 E, [; M0 F' i% z            .Item(NameSpace&"smtpserver") = SMTP_Server          'SMTP服务器1 H, Q4 k# V, u. D  K: C) \4 \
            .Item(NameSpace&"smtpserverport") = 25              '端口8 E6 _- j" K' c9 }- B" R
            .Item(NameSpace&"smtpauthenticate") = 19 \2 F5 x4 L2 _+ `" ]
            .Item(NameSpace&"sendusername") = SendUserName        '用户名& C* ]* S3 C. b* |
            .Item(NameSpace&"sendpassword") = SendPassword        '密码+ r2 z1 t7 U  l) W3 M, j+ [
            .Update: U8 h* P: x: z- b) z# o
        End With" ?. g3 |) D: S- l. y" i% t
        Email.Send
7 g9 e! l' ~7 Y9 DEnd Function
函数Send_Email使用Const段中指定的邮箱等参数发送邮件。
* m+ R7 }- A/ a5 N; m
% R9 r; Y5 F; T2 V2 }# _3 ?. U然后是主程序:
. P3 Y  z5 s+ m( x, p$ P3 \4 j8 s* ~: \3 C0 }
分析一下工资条页面:' o6 k; ~* h: q. @" N0 m
8 r* T# j0 e' T! b9 E/ O' O" G$ ]
/ `5 q5 x$ D0 U/ q, J' z& X" C$ N
首先估计一下数据区的范围,这样好用循环。
0 @8 q3 B: L" G) M4 D$ b# G下面是求有数据区域的最大行号和列号:
        Dim MaxRow, MaxCol
' D+ P3 Z$ \7 o& u- U" N        MaxRow = et.ActiveSheet.UsedRange.Row + et.ActiveSheet.UsedRange.Rows.Count - 1
# w+ B9 Y* C. z' q; f        MaxCol = et.ActiveSheet.UsedRange.Column + et.ActiveSheet.UsedRange.Columns.Count - 1
然后,搜索第一列,找“编号”。找到一个“编号”,那么编号这行就是表头,下面这一行就是数据。; y1 S6 r  w8 M+ ?' j
所以最外层的循环是:
        For row = 2 To MaxRow
8 w, o( m& ]8 j, ?3 S" ~" B                If et.cells(row-1, 1) = "编号" Then '找到工资条行
$ j; X# Y- O& q+ R* J
找到数据行后,) o6 L- _, k6 o
从第一列到最后一列,把数据收集起来,作为邮件正文:
/ R, P. \: i( O3 Q' y2 }5 Y其中,如果发现表头是“邮箱”,就把地址放到Address变量中。
                        For col = 1 To MaxCol - 1
/ a/ v( E$ [3 g# D/ O0 D: e6 G                                If (Not et.Columns(col).hidden) And (et.cells(row-1, col) <> "")then
0 Y: [& y& O5 s. I& |                                        Text = Text & et.cells(row-1, col).Text & ":" & vbtab & et.cells(row, col).Text & vbCrLf
4 x* W5 _8 V$ S  }1 ^; o( [                                End If- Q+ R. w7 V, x/ {" X. c3 w
                                If et.cells(row-1, col) = "邮箱" Then Address = et.cells(row, col)        ; h; I. H9 M# _: R& r' a! ~
                        Next
2 Y9 P. C2 n/ P# b2 u

; G- S. ]% K4 Q继续,如果有电邮地址,并且邮件正文有内容,就发送。不然就跳过,并提示。
                        If (Address <> "") And (Text <> "") Then& R8 m! ]- G0 `# d# g
                                WScript.echo et.cells(row, 2) & "的工资条,发送邮件到" & Address & "..."                                                                                                - i5 D8 k( C/ x/ p4 c  R
                                Send_Email Address, _                                                                        1 I' u) s/ ^( y  i" s' y
                                        FormatDateTime(Now(), vbShortDate) & "工资条", _        
$ ~; |1 i( H& U' @- a/ {; \) G5 h/ R                                        Text
$ f9 `% S1 k% L/ @$ i3 L5 j                        Else
3 g/ t- ?3 h& V% Q/ E1 v9 q: ?4 F                                WScript.echo et.cells(row, 2) & "的工资条,表中未提供邮箱,跳过"
& [- Y- f- R- l6 o                        End If        
这样,主体程序已经写好了。
6 M3 K7 [8 P6 s9 y
( l: B  C' v1 _: l* ]一些细节:7 k% e- L) M2 V
上面的代码中,用了wscript.echo 来显示反馈信息
! o9 V" H7 t8 g6 a7 Y+ @正常情况下,vbs脚本宿主执行时,echo方法会跳出一个msgbox对话框。用户需要一个一个点ok。很麻烦。4 |5 f) g* c% Q- i- L. R
这时,可以指定用CSCRIPT来执行脚本。CSCRIPT是wsh的命令行版本。) `5 ?$ t% G( b. ~7 ?  m
需要一个技巧:判断自身是不SCSCRIPT解释的,这里定义一个函数:
' 判断当前是否在CScript解释器下运行。# V: S5 {: T+ b, D
' 在这个解释器下运行可以出现命令行界面,利用WScript.Echo显示一些进度信息。. J! T1 q# ]! ?. x$ S1 P( L
Function IsCScript()
5 u9 u* f# t. z- d1 i" _        ' Check whethe CScript.exe is the host.
& k; m! p6 r7 J2 Y6 W        If (InStr(UCase(WScript.FullName), "CSCRIPT") <> 0) Then
: @- t$ i8 t/ ]' A0 [6 H                IsCScript = True
1 W- u0 ?7 Y$ T        Else9 Y4 T8 i( V6 O- C9 g8 |& D, B8 ~
                IsCScript = False
8 |: c  s/ e5 g/ r8 s  Q1 T; Z        End If
4 J* J# i& b" r+ P; NEnd Function
在脚本开始执行时,判断一下是不是命令行,如果不是,就强制退出脚本,强制用cscript重新解释这个脚本:
/ E+ Q* f$ N2 Z2 }7 \所以,主程序骨架是这样的:
ForceInCScript3 p/ j! z& C, a" t1 u6 p0 D
Main' Q0 L6 W. ?4 F$ S
WScript.Quit
其中,ForceInCScript子程序定义如下:
% q' R$ ?8 I6 B+ I4 j
Sub ForceInCScript()" D9 k3 j2 N6 f7 P1 U& J$ R5 G
        Dim WshShell" n3 D5 o; ?. V* T( F4 Q$ t6 s
        Set WshShell = WScript.CreateObject("WScript.Shell")
% M: T" r3 P8 W0 F) R# g        ! C" K% a4 e% k* |; H
        If (Not IsCScript()) Then) Q* _8 K3 o3 |$ R# Y* t
                WshShell.Run "CScript.exe " & """" & WScript.ScriptFullName & """"
% }7 V; s. R- _$ z                WScript.Quit ' Terminate script.
/ C3 Y% y- e& ^6 b2 R        End If
% X. }: }# l0 \3 vEnd Sub

  W+ o, S2 H; \9 Y, J# [( l8 c9 @完整的代码附件。
$ K( w  d! L  t7 Y* E7 q. R+ z/ d* _) `( F; K3 U
完毕!
' d/ o7 b; p1 l9 [1 o/ q- T

本帖子中包含更多资源

您需要 登录 才可以下载或查看,

已有 3 人评分威望 收起 理由
翘尾的k + 10 WPS有你更精彩!
轩少 + 18 WPS有你更精彩!
松风水月 + 20 很给力!

总评分: 威望 + 48   查看全部评分

19

主题

104

听众

5338

积分

技术分享团长

Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20

签到天数: 5 天

[LV.2]偶尔看看I

金币
5316
威望
11825
帖子
2334
精华
1

WPS粉丝团 荣誉版主奖 活跃会员奖 技术分享团 解答支持团 重阳节勋章

发表于 2014-4-19 16:02 |显示全部楼层
太强大了!! d# e+ x" Z( F# P
我觉得这个脚本是一个发送邮件和读取结构化表格相关信息的范例,以后遇到这方面需求就可以参考这个脚本的写法。
回复

使用道具 举报

53

主题

59

听众

6715

积分

版主

Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20

签到天数: 126 天

[LV.7]常住居民III

金币
634
威望
13773
帖子
3973
精华
2

WPS粉丝团 技术分享团 乐于助人奖 技巧教程分享达人 优秀会员奖 活跃会员奖 测试体验团 版主勋章 勤奋版主奖 最佳教程奖 测试体验官 优秀模板奖

发表于 2014-4-19 16:09 |显示全部楼层
果然强大,楼主让我学习了很多!!

点击了解最新动态:【轩少】__实用教程索引(2015-9-6更新)
http://bbs.wps.cn/forum.php?mod= ... amp;fromuid=2404273
回复

使用道具 举报

0

主题

0

听众

6

积分

LV.1

Rank: 1

该用户从未签到

金币
1
威望
7
帖子
8
精华
0
发表于 2014-4-19 19:13 |显示全部楼层
希望可以更多的人去开发Mac和linux,开发这么慢,目测人手不够 顶
回复

使用道具 举报

3

主题

0

听众

29

积分

LV.1

Rank: 1

签到天数: 2 天

[LV.1]初来乍到

金币
1
威望
13
帖子
39
精华
0
发表于 2014-7-15 20:53 |显示全部楼层
" Q2 W$ ?: \# q1 i' g
来学习教程!支持!
回复

使用道具 举报

3

主题

0

听众

29

积分

LV.1

Rank: 1

签到天数: 2 天

[LV.1]初来乍到

金币
1
威望
13
帖子
39
精华
0
发表于 2014-7-15 20:53 |显示全部楼层
+ M8 n2 N7 B6 [0 P. T" e0 n
我是来打酱油的
回复

使用道具 举报

0

主题

0

听众

2

积分

LV.1

Rank: 1

该用户从未签到

金币
3
威望
4
帖子
1
精华
0
发表于 2014-10-24 14:03 |显示全部楼层
非常有用的资料,感谢楼主分享。
回复

使用道具 举报

15

主题

2

听众

9450

积分

LV.15

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

签到天数: 1107 天

[LV.10]以坛为家III

金币
1928
威望
26137
帖子
2509
精华
0
发表于 2014-10-26 01:01 |显示全部楼层
这个功能很强大               
回复

使用道具 举报

15

主题

26

听众

1万

积分

活动策划团员

Rank: 14Rank: 14Rank: 14Rank: 14

签到天数: 1134 天

[LV.10]以坛为家III

金币
3506
威望
39499
帖子
11135
精华
0

WPS粉丝团 活跃会员奖 活动策划团 测试体验团 重阳节勋章 优秀会员奖

发表于 2014-10-26 13:04 |显示全部楼层
/ O" }# D" t7 k* Y! Y
来学习教程!支持!
回复

使用道具 举报

1

主题

1

听众

2

积分

LV.1

Rank: 1

该用户从未签到

金币
3
威望
2
帖子
3
精华
0
发表于 2015-2-10 11:11 |显示全部楼层
大神呀,不过好复杂有点看不懂~
回复

使用道具 举报

*滑动验证:
您需要登录后才可以回帖 登录 | 更多账号登录:

快速回帖:

fastpost

WPS论坛更新日志|WPS Office官方论坛     

GMT+8, 2017-9-22 01:28

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部