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

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

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

[复制链接]

154

主题

28

听众

5098

积分

解答支持团员

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

签到天数: 1 天

[LV.1]初来乍到

金币
2784
威望
11087
帖子
2620
精华
0

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

发表于 2014-4-19 15:39 |显示全部楼层
分享到: 新浪微博 腾讯微博
本帖最后由 quelea 于 2014-4-19 15:51 编辑
3 A& v1 M: e% H7 V$ a
4 n6 W. H4 H3 h! Y* `. v问题来源和解决:
( h( u5 c. z: p& [+ F. M7 s' n  d  [1 J5 f" M4 O
表格 能不能发送工资条到特定邮箱呢_最新WPS办公软件学习教程_免费企业办公软件下载_金山WPS Office官网论坛
. u. a' n- d. J1 l8 x8 bhttp://bbs.wps.cn/thread-22421002-1-1.html) s- N; X  A, Q4 K8 l3 ]# ~2 n

# k# N% g; R  [/ c% @0 F9 e; R) _/ ?解决:6 c7 s0 C/ |0 l
http://bbs.wps.cn/forum.php?mod= ... 615&fromuid=1478144
' F' \% k( ~; i. y0 A- x- }- m$ y
本文不重复上帖中的内容,重点叙述编程思路。
) }5 a+ d& W) `4 j6 x; h( J
% S) Z% q$ [3 V8 i使用vbs脚本发送电子邮件,是关键问题。这个通过Google,然后简单修改一下,写了一个函数,在本程序用于发送电子邮件:
Const SMTP_Server = "smtp.qq.com"
5 h, {  v7 q1 b/ X; o$ f4 yConst SMTP_Port = 25% w7 h( b+ |! c* P7 X( N* ]- S/ {
Const SendUserName = "你的邮箱用户名"8 o  Y" O3 O9 J! N8 |5 ^9 X: i
Const SendPassword = "你的邮箱密码"
4 z3 A9 p, o% X. A( z$ q. KConst EmailFrom = "回信地址@qq.com"
, r& K5 x" V" d# `" s
2 I( e5 x5 o7 DFunction Send_Email (Address, Caption, Text)$ {8 L% @$ n0 N7 y, ^
        NameSpace = "http://schemas.microsoft.com/cdo/configuration/"
! K/ r7 U' @2 m        Set Email = CreateObject("CDO.Message")- b5 I# ?5 L; K0 x1 s) o$ x
        Email.From = EmailFrom            '自己的邮箱- s* `/ ]2 ]" Q' L; T, ?3 @- t7 Y
        Email.To = Address                '要发送到的邮箱
/ I" {. h! ^; p7 e! q$ i$ r! V        Email.Subject = Caption            '邮件主题% |1 k# |# b% x9 W
        Email.Textbody = Text                  '邮件内容9 ~' v; C( W  s$ Q) }! j% R" x
        rem Email.AddAttachment "C:\file.zip"        '附件,没有由删除此句  I) }5 ^8 `' R- h0 v
        With Email.Configuration.Fields) _" t; p5 e2 g9 x7 Z8 t5 U$ q! G
            .Item(NameSpace&"sendusing") = 2) F% f1 t3 Z/ B; E* d) ?
            .Item(NameSpace&"smtpserver") = SMTP_Server          'SMTP服务器+ Z2 h8 F, z5 j9 O3 o
            .Item(NameSpace&"smtpserverport") = 25              '端口; k& T% ~3 M# m0 G% c' x/ ]
            .Item(NameSpace&"smtpauthenticate") = 1, @% R; r$ F: `6 `$ {
            .Item(NameSpace&"sendusername") = SendUserName        '用户名
  Q5 z% q. K% ^            .Item(NameSpace&"sendpassword") = SendPassword        '密码
& c- E4 y+ N8 x0 a            .Update8 g/ K* x+ |4 o6 \5 j( J
        End With
) v2 [& v. e" K! o        Email.Send
: f' p- D: a% F9 I4 y: ~End Function
函数Send_Email使用Const段中指定的邮箱等参数发送邮件。
9 C1 @+ r3 `6 K: Q, T
( a( @! M  z% X9 N. }然后是主程序:% ~: _8 S; V6 k3 A& w

, Z  [1 y, F% X% U; C* W分析一下工资条页面:9 d+ b9 {' p  n  i/ {- E

% D1 o, f* ~# Z5 b' X2 \* v$ o* S# ^/ N9 Z0 s3 _
首先估计一下数据区的范围,这样好用循环。
* M5 H! M$ `7 }! J+ M: j下面是求有数据区域的最大行号和列号:
        Dim MaxRow, MaxCol
' T# O/ M8 T4 d( N7 U  i* C        MaxRow = et.ActiveSheet.UsedRange.Row + et.ActiveSheet.UsedRange.Rows.Count - 1. c$ x* v' U* n' B) p
        MaxCol = et.ActiveSheet.UsedRange.Column + et.ActiveSheet.UsedRange.Columns.Count - 1
然后,搜索第一列,找“编号”。找到一个“编号”,那么编号这行就是表头,下面这一行就是数据。' U1 M3 a3 t& Y
所以最外层的循环是:
        For row = 2 To MaxRow5 _0 w+ I3 A2 a8 W3 V% D
                If et.cells(row-1, 1) = "编号" Then '找到工资条行

% T5 d2 i# p% Y+ N, E找到数据行后,
. f; j2 S8 _/ {( h5 N  g3 H6 a从第一列到最后一列,把数据收集起来,作为邮件正文:: G& ~) a8 s# F' b8 {; U6 v
其中,如果发现表头是“邮箱”,就把地址放到Address变量中。
                        For col = 1 To MaxCol - 1
0 L3 E; V- b! V2 ?0 `' u                                If (Not et.Columns(col).hidden) And (et.cells(row-1, col) <> "")then  `6 j# e, M" S9 M$ a# U8 z
                                        Text = Text & et.cells(row-1, col).Text & ":" & vbtab & et.cells(row, col).Text & vbCrLf
- D9 |( j0 W, g$ q                                End If
6 p- \9 @& b/ V                                If et.cells(row-1, col) = "邮箱" Then Address = et.cells(row, col)        
) Y# V2 y3 Y- b" j/ S7 N- q                        Next

! ?9 ~, L* g6 V6 p) @0 d/ `8 g3 v7 Q6 d, W* A/ \
继续,如果有电邮地址,并且邮件正文有内容,就发送。不然就跳过,并提示。
                        If (Address <> "") And (Text <> "") Then
; i1 R8 p" ^4 c$ B' n: g5 e                                WScript.echo et.cells(row, 2) & "的工资条,发送邮件到" & Address & "..."                                                                                                
6 J, a$ h3 ]+ s& O4 R5 g                                Send_Email Address, _                                                                        0 S" Z& u% F7 ^' S( o9 Z6 P# a
                                        FormatDateTime(Now(), vbShortDate) & "工资条", _          u3 w+ a( p' `7 `; p+ I  H
                                        Text  Z# `7 V2 }# J5 g& p+ V- t
                        Else
3 N0 B- F6 @! D, P* M                                WScript.echo et.cells(row, 2) & "的工资条,表中未提供邮箱,跳过"
2 [5 P- ~* t& F" H, I; {* q                        End If        
这样,主体程序已经写好了。  u" q% M4 ^( t8 E# ?
6 W7 K1 d; P6 \- L& d2 b: U
一些细节:6 X; h/ D# j0 Q, k! U1 G+ D9 I' D) Y
上面的代码中,用了wscript.echo 来显示反馈信息2 S: K9 [$ G- A' K, C
正常情况下,vbs脚本宿主执行时,echo方法会跳出一个msgbox对话框。用户需要一个一个点ok。很麻烦。
6 j# O- _4 N5 m: `# D% c这时,可以指定用CSCRIPT来执行脚本。CSCRIPT是wsh的命令行版本。
( q5 i0 S* k" d需要一个技巧:判断自身是不SCSCRIPT解释的,这里定义一个函数:
' 判断当前是否在CScript解释器下运行。
  M* ^* K3 Z2 V( H5 v5 b6 A7 M' 在这个解释器下运行可以出现命令行界面,利用WScript.Echo显示一些进度信息。
. Z& n: n. ]% U$ F: V& Q% c0 oFunction IsCScript()
0 F7 ~! k$ q5 z5 A        ' Check whethe CScript.exe is the host.! O+ x% C7 Y! f/ F: A6 `% ?7 C( E# r
        If (InStr(UCase(WScript.FullName), "CSCRIPT") <> 0) Then7 h  p0 ^0 C6 k* Y3 Q
                IsCScript = True  q  I( s7 d0 p3 `
        Else
* p+ Y5 f5 l3 ]. ?; n8 O! y                IsCScript = False
  A; e( h8 h, q+ ], V        End If
- ^! a: v  N# ^6 P6 KEnd Function
在脚本开始执行时,判断一下是不是命令行,如果不是,就强制退出脚本,强制用cscript重新解释这个脚本:7 v' M6 _% l9 \9 g0 s$ V' l/ n, K
所以,主程序骨架是这样的:
ForceInCScript
: C! {, F' F# K7 {  c5 \6 j% E5 LMain
5 u* y/ C- s9 @" J# ^* l( GWScript.Quit
其中,ForceInCScript子程序定义如下:
) Z1 ?! d- q1 p1 d6 k+ e
Sub ForceInCScript()
7 F5 \& t1 f! D, y8 y8 l        Dim WshShell: t- {% S7 v: x) K9 b
        Set WshShell = WScript.CreateObject("WScript.Shell")$ K; G4 J) V  F7 U
        
  X3 b- j7 w3 g) _' v1 B+ \        If (Not IsCScript()) Then
4 t- P9 \0 E7 B* j- Q) ?* c  s                WshShell.Run "CScript.exe " & """" & WScript.ScriptFullName & """"
, d/ @- a* ]) Y* c! l' y  T                WScript.Quit ' Terminate script.
. Z+ [* _- ]- K) R1 r, j        End If& q( G$ y% t/ Z8 n: c! ]; {
End Sub
; x; @$ u& z, ?$ a) ^7 E8 T& N0 S
完整的代码附件。- X' |& r+ A* ^% |* E1 i
! j9 l. j% o- M9 c3 b) v
完毕!" S: R( B4 w7 y9 N

本帖子中包含更多资源

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

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

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

19

主题

111

听众

5338

积分

技术分享团长

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

签到天数: 5 天

[LV.2]偶尔看看I

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

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

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

使用道具 举报

53

主题

60

听众

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

听众

30

积分

LV.1

Rank: 1

签到天数: 2 天

[LV.1]初来乍到

金币
1
威望
12
帖子
40
精华
0
发表于 2014-7-15 20:53 |显示全部楼层
4 ~4 S6 S$ j2 ^' f: C, S! A* B
来学习教程!支持!
回复

使用道具 举报

3

主题

0

听众

30

积分

LV.1

Rank: 1

签到天数: 2 天

[LV.1]初来乍到

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

" q! r- I  N: |0 E# F我是来打酱油的
回复

使用道具 举报

0

主题

0

听众

2

积分

LV.1

Rank: 1

该用户从未签到

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

使用道具 举报

15

主题

4

听众

9950

积分

LV.15

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

签到天数: 1204 天

[LV.10]以坛为家III

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

使用道具 举报

15

主题

28

听众

1万

积分

活动策划团员

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

签到天数: 1244 天

[LV.10]以坛为家III

金币
3637
威望
41126
帖子
11338
精华
0

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

发表于 2014-10-26 13:04 |显示全部楼层
4 L7 C4 x' o: m# m+ V* X
来学习教程!支持!
回复

使用道具 举报

1

主题

1

听众

2

积分

LV.1

Rank: 1

该用户从未签到

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

使用道具 举报

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

快速回帖:

fastpost

WPS论坛更新日志|WPS Office官方论坛 ( 粤公网安备 44049102496073号 粤ICP备13015957号-1   

GMT+8, 2018-1-18 04:18

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部