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

 找回密码
 
查看: 9480|回复: 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 编辑 4 h# r% J, |+ W4 R2 [

3 G  h5 ^1 P; C) I2 @# l+ Y: @; U问题来源和解决:) |) W3 h. e- m% ?: J
# I9 Q* n( p& L% b( V
表格 能不能发送工资条到特定邮箱呢_最新WPS办公软件学习教程_免费企业办公软件下载_金山WPS Office官网论坛1 S) e$ \& u2 T' ?* s( u
http://bbs.wps.cn/thread-22421002-1-1.html
: L* l- J8 P9 }0 H" U- H" \. Q& o) H9 v" y7 B: y1 M
解决:4 s# j# [/ K  O- P5 z5 [
http://bbs.wps.cn/forum.php?mod= ... 615&fromuid=1478144
: v9 f4 d& f" ]
2 G# A6 ]4 _; o& }# D: E8 J本文不重复上帖中的内容,重点叙述编程思路。3 m5 ~+ D" W# j8 S' a0 P
( j/ L; f/ i; A7 f; c' Y
使用vbs脚本发送电子邮件,是关键问题。这个通过Google,然后简单修改一下,写了一个函数,在本程序用于发送电子邮件:
Const SMTP_Server = "smtp.qq.com"
7 x0 H9 @8 V  V4 _* IConst SMTP_Port = 25
$ L3 A2 f! o$ EConst SendUserName = "你的邮箱用户名"0 G: n/ P: G6 a* q
Const SendPassword = "你的邮箱密码"( O+ g8 i( E# U# R
Const EmailFrom = "回信地址@qq.com"$ L) Z* j4 S7 E1 l1 n. f/ L) K4 Y
) B  |& E0 o& C, H! s, n
Function Send_Email (Address, Caption, Text)1 N' u8 |# o8 _
        NameSpace = "http://schemas.microsoft.com/cdo/configuration/"
7 w1 K0 P# l7 W7 L' q        Set Email = CreateObject("CDO.Message")
5 c1 o/ a7 ?. ~" e        Email.From = EmailFrom            '自己的邮箱% Z/ H' \, k' @
        Email.To = Address                '要发送到的邮箱" @+ e8 e0 E) g* r! }( A
        Email.Subject = Caption            '邮件主题& K# P" b3 X" b$ k- m3 \- l
        Email.Textbody = Text                  '邮件内容0 i. _, E. O; b7 S/ W* f
        rem Email.AddAttachment "C:\file.zip"        '附件,没有由删除此句) i6 w. T9 O+ r; m8 V
        With Email.Configuration.Fields
0 r% X! D! R; Z# M            .Item(NameSpace&"sendusing") = 2' C% j- }1 m9 n* n- C; H: B7 U
            .Item(NameSpace&"smtpserver") = SMTP_Server          'SMTP服务器$ \9 G3 m' I! M# }
            .Item(NameSpace&"smtpserverport") = 25              '端口) _/ J& P  V; y( J1 F
            .Item(NameSpace&"smtpauthenticate") = 1
- S9 T4 d: Z* ^+ [- A% z" y8 E            .Item(NameSpace&"sendusername") = SendUserName        '用户名, P" i9 E: ^; u4 ?4 D
            .Item(NameSpace&"sendpassword") = SendPassword        '密码6 X" B9 {5 W: z0 T
            .Update
$ n# ?' _) z9 S/ p        End With
2 J% Y: u$ O% h1 N; g4 n* l        Email.Send$ e9 j6 O9 ^) u7 E3 L* b
End Function
函数Send_Email使用Const段中指定的邮箱等参数发送邮件。3 p' E+ b5 n  I0 I" q/ d' w& t

  B# j( ^$ B* y8 ~0 B+ E然后是主程序:
0 M) e5 O9 D# S. t9 B* W6 ]2 z% k3 O! Y- `/ i+ K; {6 s
分析一下工资条页面:0 O# N+ m4 h# Z# V

, v  c% Z* ?4 l& J
1 x" O0 d3 x. e- v首先估计一下数据区的范围,这样好用循环。9 i+ Z" R+ ]* W8 K9 `" T& U5 P2 \
下面是求有数据区域的最大行号和列号:
        Dim MaxRow, MaxCol7 E9 v( W! a' F
        MaxRow = et.ActiveSheet.UsedRange.Row + et.ActiveSheet.UsedRange.Rows.Count - 10 `) C3 s( v. W) S. i, q! w+ m0 a
        MaxCol = et.ActiveSheet.UsedRange.Column + et.ActiveSheet.UsedRange.Columns.Count - 1
然后,搜索第一列,找“编号”。找到一个“编号”,那么编号这行就是表头,下面这一行就是数据。
5 {/ A- _  r- E. e所以最外层的循环是:
        For row = 2 To MaxRow3 z5 Y8 x2 g6 D+ o
                If et.cells(row-1, 1) = "编号" Then '找到工资条行
6 f4 m2 \$ g# ]' s& E
找到数据行后,
- {3 x) ]) K, r8 F从第一列到最后一列,把数据收集起来,作为邮件正文:. w( M/ ?+ u# r+ m1 V
其中,如果发现表头是“邮箱”,就把地址放到Address变量中。
                        For col = 1 To MaxCol - 1+ |3 ~' c; L) K- L
                                If (Not et.Columns(col).hidden) And (et.cells(row-1, col) <> "")then
0 Q6 u0 c6 T8 E& D$ B                                        Text = Text & et.cells(row-1, col).Text & ":" & vbtab & et.cells(row, col).Text & vbCrLf
7 K  E5 Z% @( I& P                                End If
* E8 U) b% }0 C; |$ ?' p6 i& q                                If et.cells(row-1, col) = "邮箱" Then Address = et.cells(row, col)        
/ k) s4 \7 F" j+ r9 ^% N1 d2 @# }                        Next
: X. U- @: S; h& `, ?' G) I; i2 f& H
" F3 p. d. Y# w  k8 q# d* c) z
继续,如果有电邮地址,并且邮件正文有内容,就发送。不然就跳过,并提示。
                        If (Address <> "") And (Text <> "") Then% K# W0 i) W# F3 M1 D5 T
                                WScript.echo et.cells(row, 2) & "的工资条,发送邮件到" & Address & "..."                                                                                                , ?9 |/ ^3 _/ u- E
                                Send_Email Address, _                                                                        # d+ i0 @6 @) v# w
                                        FormatDateTime(Now(), vbShortDate) & "工资条", _        
+ u% G+ P+ i& {" \; E4 Y                                        Text
0 P2 b- `' L- E" H4 P9 \3 ^                        Else3 W) S+ S9 g2 d) X
                                WScript.echo et.cells(row, 2) & "的工资条,表中未提供邮箱,跳过"- `/ B  ^4 d' D1 o7 f9 u. J
                        End If        
这样,主体程序已经写好了。
' n" _" m  L* p9 ~$ F, B% _
4 |8 T: @. K9 [+ m一些细节:8 P# _: c( z9 T+ s( D) [! b4 ?
上面的代码中,用了wscript.echo 来显示反馈信息
6 n# G1 z8 @8 h0 Q* X2 O正常情况下,vbs脚本宿主执行时,echo方法会跳出一个msgbox对话框。用户需要一个一个点ok。很麻烦。! ]% h9 m( ]$ O2 H6 I7 @4 s
这时,可以指定用CSCRIPT来执行脚本。CSCRIPT是wsh的命令行版本。" U% H+ U6 z+ q/ G" x# s* W" C" @
需要一个技巧:判断自身是不SCSCRIPT解释的,这里定义一个函数:
' 判断当前是否在CScript解释器下运行。! ^# N: z* l1 y: ~& {3 `: a; M
' 在这个解释器下运行可以出现命令行界面,利用WScript.Echo显示一些进度信息。
; T) F0 N: E7 |2 ]2 Z4 tFunction IsCScript()
0 G9 B8 c  p' D# e: K, F- ]. o        ' Check whethe CScript.exe is the host.# J' o  e& U2 `7 C- d9 \
        If (InStr(UCase(WScript.FullName), "CSCRIPT") <> 0) Then1 K4 p" ]' g# O  J. J
                IsCScript = True
) Y. f! y* n9 W# N& `( `3 I0 n        Else" |3 K7 h7 U" M/ {3 `( t
                IsCScript = False4 Z$ G8 [5 j5 Q" n7 [
        End If- ^1 x% @* \5 C& g
End Function
在脚本开始执行时,判断一下是不是命令行,如果不是,就强制退出脚本,强制用cscript重新解释这个脚本:2 Y5 L4 h% b! p; I2 p' Y6 Y
所以,主程序骨架是这样的:
ForceInCScript9 `$ ~& r% i' f; u% C1 Q
Main
# M0 h4 A6 D" }+ z, l* }WScript.Quit
其中,ForceInCScript子程序定义如下:
  I2 M3 Z9 q# X' U& P( U9 P5 B
Sub ForceInCScript()! D- `) I& A- F/ i$ T! S
        Dim WshShell- M; S3 L" V) B& \/ A0 B
        Set WshShell = WScript.CreateObject("WScript.Shell")) v+ T  \$ m# F- f! C" a, d* b5 I1 |
        6 R& j6 N: t0 e) O) \1 T& V
        If (Not IsCScript()) Then
4 C$ K+ v2 R) E4 ?4 F+ j                WshShell.Run "CScript.exe " & """" & WScript.ScriptFullName & """"8 L" T% w' b2 Q0 A
                WScript.Quit ' Terminate script.
3 \; e8 i% V) M  d        End If
$ Z& T" n. s9 z9 S6 zEnd Sub
, N# Z# u; V8 u6 a
完整的代码附件。8 q/ Q" B5 F! Z" ~& N+ U# X

, _& n# ^1 Y1 u( r- ~/ L完毕!
/ k1 o* `  z' d, X- q0 c

本帖子中包含更多资源

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

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

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

19

主题

106

听众

5338

积分

技术分享团长

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

签到天数: 5 天

[LV.2]偶尔看看I

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

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

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

使用道具 举报

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
威望
11
帖子
39
精华
0
发表于 2014-7-15 20:53 |显示全部楼层
2 O; c, d9 ^3 Y, @2 t% n* W
来学习教程!支持!
回复

使用道具 举报

3

主题

0

听众

29

积分

LV.1

Rank: 1

签到天数: 2 天

[LV.1]初来乍到

金币
1
威望
11
帖子
39
精华
0
发表于 2014-7-15 20:53 |显示全部楼层

+ f: h, F: j, G& ]我是来打酱油的
回复

使用道具 举报

0

主题

0

听众

2

积分

LV.1

Rank: 1

该用户从未签到

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

使用道具 举报

15

主题

2

听众

9666

积分

LV.15

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

签到天数: 1147 天

[LV.10]以坛为家III

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

使用道具 举报

15

主题

27

听众

1万

积分

活动策划团员

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

签到天数: 1184 天

[LV.10]以坛为家III

金币
3566
威望
40249
帖子
11229
精华
0

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

发表于 2014-10-26 13:04 |显示全部楼层
# U" P5 s9 J* ]7 A  U' C
来学习教程!支持!
回复

使用道具 举报

1

主题

1

听众

2

积分

LV.1

Rank: 1

该用户从未签到

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

使用道具 举报

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

快速回帖:

fastpost

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

GMT+8, 2017-11-18 14:23

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部