ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

一个邮件合并域可不可将其分开

[复制链接]

TA的精华主题

TA的得分主题

发表于 2006-9-9 21:15 | 显示全部楼层 |阅读模式

1.比如合并邮件域中有个日期,插到Word中合并显示为2006-05-03,而实际上要将这个日期放在三个地方,2006一个,05是一个,03是一个

2.如果是一段文字呢?

如果总数为奇,则分成二份,前半为偶数,后半为奇数

如果总数为偶,则平均分成二份.

VBA中可以通过len长度来判断及取哪些字比较好办些,但域中怎么办呀?

[此贴子已经被作者于2006-9-9 21:17:18编辑过]

TA的精华主题

TA的得分主题

发表于 2006-9-10 06:01 | 显示全部楼层
QUOTE:
以下是引用c81在2006-9-9 21:15:59的发言:

1.比如合并邮件域中有个日期,插到Word中合并显示为2006-05-03,而实际上要将这个日期放在三个地方,2006一个,05是一个,03是一个

2.如果是一段文字呢?

如果总数为奇,则分成二份,前半为偶数,后半为奇数

如果总数为偶,则平均分成二份.

VBA中可以通过len长度来判断及取哪些字比较好办些,但域中怎么办呀?


第一个问题,比较好解决,直接在WORD的域中使用日期图片开关“\@”即可。

第二个问题,必须结合数据源(如EXCEL),借用辅助列,进行判断,再根据Word合并域进行判断。

我做了一个示例,所有EXCEL公式、域代码等供参考:

TRvMYt4r.rar (5.75 KB, 下载次数: 87)

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-9-10 12:46 | 显示全部楼层

多谢版主。

现在问题1解决了,问题2解决方案是可行的。

但实际上要求sql数据库直接和Word相连,而不用Excel在中间作中介,这样要简洁和方便些。

即然问题2不能在域上想办法,好象用VBA好些,我初步设想

当邮件合并事件完成时,将合并成的新文档中的表格内目标单元格内容分割一下(域代码事先是放在表格内的)。

TA的精华主题

TA的得分主题

发表于 2006-9-11 06:14 | 显示全部楼层
QUOTE:
以下是引用c81在2006-9-10 12:46:53的发言:

多谢版主。

现在问题1解决了,问题2解决方案是可行的。

但实际上要求sql数据库直接和Word相连,而不用Excel在中间作中介,这样要简洁和方便些。

即然问题2不能在域上想办法,好象用VBA好些,我初步设想

当邮件合并事件完成时,将合并成的新文档中的表格内目标单元格内容分割一下(域代码事先是放在表格内的)。

我用VBA做了一个,请C81兄测试一下。

以下代码供参考:

'* +++++++++++++++++++++++++++++
'* Created By SHOUROU@ExcelHome 2006-9-11 6:12:47
'
仅测试于System: Windows NT Word: 11.0 Language: 2052
'
0071^The Code CopyIn [ThisDocument-ThisDocument]^'
'*
-----------------------------

Option Explicit
Public WithEvents wdApp As Word.Application
Private Sub Document_Open()
    Set wdApp = Word.Application
End Sub
'----------------------
Private Sub wdApp_MailMergeBeforeRecordMerge(ByVal Doc As Document, Cancel As Boolean)
   Dim lngLenth As Long, myCell1 As Cell, myCell2 As Cell, myString As String
    Set myCell1 = Doc.Tables(1).Cell(6, 2)
    Set myCell2 = Doc.Tables(1).Cell(6, 3)
    With Doc.MailMerge.DataSource
        myString = .DataFields(2).Value
        lngLenth = VBA.Len(myString)
        If lngLenth Mod 2 = 0 Then
            myCell1.Range.Text = VBA.Left(myString, lngLenth / 2)
            myCell2.Range.Text = VBA.Right(myString, lngLenth / 2)
        Else
            myCell1.Range.Text = VBA.Left(myString, (lngLenth + 1) / 2)
            myCell2.Range.Text = VBA.Right(myString, (lngLenth - 1) / 2)
        End If
    End With
End Sub
'----------------------

JqOqQrov.rar (8.67 KB, 下载次数: 38)

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-9-11 09:30 | 显示全部楼层

狂谢老守先生。

我也写了几行MailMergeBeforeRecordMerge事件代码,就是不能执行,原来前面还有一Option Explicit,这是什么东东呀?

另外,如果只点“查看合并数据”命令来临时看一下合并结果,也要执行上面的动作,怎么办?

TA的精华主题

TA的得分主题

发表于 2006-9-11 10:55 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

TO C81

为你的进步感到高兴。

Option Explicit 是模块级别中处于通用声明段(所有过程之前)的语句,意为显式声明变量。

显式声明变量编程学习者的一个良好习惯,可以避免在键入已有变量时出错,在变量的范围不是很清楚的代码中使用该语句可以避免混乱,如果使用了未声明的变量名在编译时间会出现错误。

举个例子:

'Option Explicit

Sub Example()

    aTest = "123456"

    MsgBox aTset + 1

End Sub

示例中,实际上出现了两个变量,一个是aTest,一个是aTset(录入错误造成),如果未使用显示变量声明,则程序运行结果并非为预期结果,程序自动声明了一个Variant类型的aTset变量。

至于“查看合并结果“操作,请注明你的Word版本,应该不会触发MailMergeBeforeRecordMerge事件。

关于你不能正确触发此事件,在于你没有成功声明Application对象事件,有关Application对象事件的声明,可查看帮助文件,分为三步,论坛中也有很多,可自行理解,有问题,再讨论。(Word非常接触中也有介绍)

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-9-11 11:07 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

多谢指教。

我现给人家设置一个Word使用sql数据库为数据源进行邮件合并能精确套打的实例。

数据库链接,

域选项查询,

精确定位,

合并处文本自动适应等等,基本上能成功,就是这个要命的域分开来显示让人头痛一下,多亏版主相救。

[此贴子已经被作者于2006-9-11 11:09:29编辑过]
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-17 03:04 , Processed in 0.036314 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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