Access交流中心

北京 | 上海 | 天津 | 重庆 | 广州 | 深圳 | 珠海 | 汕头 | 佛山 | 中山 | 东莞 | 南京 | 苏州 | 无锡 | 常州 | 南通 | 扬州 | 徐州 | 杭州 | 温州 | 宁波 | 台州 | 福州 | 厦门 | 泉州 | 龙岩 | 合肥 | 芜湖 | 成都 | 遂宁 | 长沙 | 株洲 | 湘潭 | 武汉 | 南昌 | 济南 | 青岛 | 烟台 | 潍坊 | 淄博 | 济宁 | 太原 | 郑州 | 石家庄 | 保定 | 唐山 | 西安 | 大连 | 沈阳 | 长春 | 昆明 | 兰州 | 哈尔滨 | 佳木斯 | 南宁 | 桂林 | 海口 | 贵阳 | 西宁 | 乌鲁木齐 | 包头 |

关于SendObject

chinasa  发表于:2015-05-28 10:55:15  
复制

 

我现在需要把明细表,以“村”为单位,发送给各自的村长。各村的村长及对应的邮件地址已经在另一张表中维护好了。

 

我自己尝试用SendObject来解决,但遇到两个问题:

1.如果区分明细表(TB1)有哪些村?我现在只会限制死A/B/C三个村查询,未来如果还有D/E/F...村怎么办。(说明:code_tb2肯定包含所有村,能用这个表判断?)

2.如何自动把上述区分的明细表发送邮件?每个村一个邮件,明细以EXCEL格式作为附件。

3.我现在的宏为什么不能显示我已经填写好的邮件地址?

 

 

test

 

tb1
ID 姓名 工分
4 A村 张三 15
5 A村 李四 11
6 B村 张三 2
7 C村 王五 3
8 B村 李六 4
9 B村 张七 4
10 C村 李八 5
11 B村 王九 6
12 C村 张一 6
13 A村 陈二 7

 

 

Top
煮江品茶 发表于:2015-05-28 11:00:59
1、select distinct 村 from tb1

2、3、参见:点击下载此附件

chinasa 发表于:2015-05-28 11:13:01

煮版,万分感谢。

我先学习下先,不懂的再继续请教。



chinasa 发表于:2015-05-28 11:16:34

煮版,您好!

问题1,我需要把明细表以村为单位拆分开(目的是以附件的形式附到邮件中)



煮江品茶 发表于:2015-05-28 11:18:38

用SendObject方法也可以,只需要动态生成明细查询。大体如下:

sub SendEmail()
    Dim rs As New ADODB.Recordset
    Dim ssql As String
    Dim i As Long
    
    ssql="select distinct 村 from tb1"
    rs.Open ssql, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
    for i=1 to rs.RecordCount
        ssql="select * from tb1 whhere 村='" & rs!村.value & "'"
        call UpdateQuery("邮件查询",ssql)
        docmd.sendobject acSendQuery,"邮件查询",acFormatXLS,rs!村.value & "@邮件服务器地址",,"报表","请填写后上报。"
        rs.movenext
    next
end sub


sub UpdateQuery(byval queryName as string,byval strSql as string)
    Dim Qdef As QueryDef
    if dcount("*","MSysObjects","type=5 and name='" & queryName & "'")=0 then
    Set Qdef = CurrentDb.CreateQueryDef(queryName)
    else
        Set Qdef = CurrentDb.QueryDefs(queryName)
    end if
    Qdef.SQL = strSql
    Set  Qdef=nothing
end sub





chinasa 发表于:2015-05-28 13:01:53
好的,我先测试下再汇报结果,先谢过。

chinasa 发表于:2015-05-28 13:25:33

煮版,您好!

   看起来已经很接近了,但还有几个问题还望给予指点!

1.收件人地址如何根据TB1的“村”,在CODE_TB2中查找邮件地址。本想在您的基础上自己研究下,但这一点对于我来说实在比较困难。

2.目前运行的结果收件人地址都是空白的,修改后的语句如下。

3.总共有3个村,但运行结果只有1个村的邮件,我尝试增加MSGBOX就可以得出三个村的邮件了,不知道是否有其它更好的办法?因为MSGBOX需要多次点确定。

 


Private Sub sendmail_Click()

    Dim rs As New ADODB.Recordset
    Dim ssql As String
    Dim i As Long
   
    ssql = "select distinct ´å from tb1"
    rs.Open ssql, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
   
    For i = 1 To rs.RecordCount
        ssql = "select * from tb1 where ´å='" & rs!´å.Value & "'"
        Call UpdateQuery("Óʼþ²éѯ", ssql)
        'DoCmd.SendObject acSendQuery, "Óʼþ²éѯ", acFormatXLS, rs!´å.Value & "@Óʼþ·þÎñÆ÷µØÖ·", , "±¨±í", "ÇëÌîдºóÉϱ¨¡£"
        DoCmd.SendObject acSendQuery, "Óʼþ²éѯ", acFormatXLS, rs!´å.Value & "87654321@qq.com", , "±¨±í", "ÇëÌîдºóÉϱ¨¡£"
        rs.MoveNext   

 'DoEvents   

MsgBox i
    Next

End Sub


Sub UpdateQuery(ByVal queryName As String, ByVal strSql As String)
    Dim Qdef As QueryDef
    If DCount("*", "MSysObjects", "type=5 and name='" & queryName & "'") = 0 Then
    Set Qdef = CurrentDb.CreateQueryDef(queryName)
    Else
        Set Qdef = CurrentDb.QueryDefs(queryName)
    End If
    Qdef.SQL = strSql
    Set Qdef = Nothing
End Sub


 

 



chinasa 发表于:2015-05-28 13:26:34


Private Sub sendmail_Click()

    Dim rs As New ADODB.Recordset
    Dim ssql As String
    Dim i As Long
   
    ssql = "select distinct 村 from tb1"
    rs.Open ssql, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
   
    For i = 1 To rs.RecordCount
        ssql = "select * from tb1 where 村='" & rs!村.Value & "'"
        Call UpdateQuery("邮件查询", ssql)
        'DoCmd.SendObject acSendQuery, "邮件查询", acFormatXLS, rs!村.Value & "@邮件服务器地址", , "报表", "请填写后上报。"
        DoCmd.SendObject acSendQuery, "邮件查询", acFormatXLS, rs!村.Value & "87654321@qq.com", , "报表", "请填写后上报。"
        rs.MoveNext
    'DoEvents
   ' MsgBox i
    Next

End Sub


Sub UpdateQuery(ByVal queryName As String, ByVal strSql As String)
    Dim Qdef As QueryDef
    If DCount("*", "MSysObjects", "type=5 and name='" & queryName & "'") = 0 Then
    Set Qdef = CurrentDb.CreateQueryDef(queryName)
    Else
        Set Qdef = CurrentDb.QueryDefs(queryName)
    End If
    Qdef.SQL = strSql
    Set Qdef = Nothing
End Sub


 



煮江品茶 发表于:2015-05-28 14:22:14
sub SendEmail()
    Dim rs As New ADODB.Recordset
    Dim ssql As String
    Dim i As Long
    
    ssql="select distinct 村,邮件地址 from CODE_TB2"
    rs.Open ssql, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
    for i=1 to rs.RecordCount
        ssql="select * from tb1 whhere 村='" & rs!村.value & "'"
        call UpdateQuery("邮件查询",ssql)
        docmd.sendobject acSendQuery,"邮件查询",acFormatXLS,rs!邮件地址.value ,,,"报表","请填写后上报。"
        rs.movenext
    next
end sub


chinasa 发表于:2015-05-28 14:53:03

 

邮件中的附件都是C村(三个邮件都是C村),A村与B村都没有。另外,收件人地址仍然是空白的。

 

Private Sub sendmail_Click()

    Dim rs As New ADODB.Recordset
    Dim ssql As String
    Dim i As Long
   
    ssql = "select distinct 村,邮箱 from CODE_TB2"
    rs.Open ssql, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
    For i = 1 To rs.RecordCount
        ssql = "select * from tb1 where 村='" & rs!村.Value & "'"
        Call UpdateQuery("邮件查询", ssql)
        DoCmd.SendObject acSendQuery, "邮件查询", acFormatXLS, rs!邮箱.Value, , , "报表", "请填写后上报。"
        rs.MoveNext
        MsgBox rs!邮箱.Value
    Next
End Sub

 



煮江品茶 发表于:2015-05-28 14:56:19

是都发给了C,还是发个三个不同村,但数据都是C村的。按照这两个不同的情况,分别调试一下即可。



chinasa 发表于:2015-05-28 15:06:39

首先把TB1里分A村、B村、C村三组,A村的发给A村邮件地址,B村发给B村邮件地址.......。您第一次的代码,附件是正确的,只是没有根据附件调取对应的邮件地址。

 

另外,关于收件人空白的问题,我百度查了很久,没看出代码有什么问题,理论上应该会自动填写收件人才对,但却没有,很奇怪。难道跟我用FOXMAIL有关?



煮江品茶 发表于:2015-05-28 16:32:28
msgbox rs!邮箱.Value

chinasa 发表于:2015-05-28 17:08:53
能够正常显示邮箱地址。很奇怪。网上很多人说SENDOBJECT使用OUTLOOK邮箱,而我使用的是FOXMAIL,难道是这个原因?

总记录:13篇  页次:1/1 9 1 :