2019.03.15更新:已经将个人做好的完整docm 代码附在文后,先上图。

记录几个开发过程中遇到的难点和注意点。

  1. Word中添加ActiveX控件,如输入框,需要放置在  文本框 中,或者放置在 正文流中。
  2. 本docm因需要和背景底图搭配,所以需要调整 Activek输入框控件的上下和左右位置,几次使用 放置文本框的办法没有成功。最后是放置在 空白的正文流中去的。
  3. 如何调整 正文流中的 ActiveX输入控件的上下位置和左右位置。
    1. 上下位置:粗调,打多个换行符。若要精确调整,设置上面的行的行距为固定值,1磅。
    2. 左右位置:粗调,直接打多个空格。微调,设置字体大小为1,使劲打空格。
    3. 控件的宽度和高度调节:“开发工具”-激活“设计模式”,选中控件,点击“属性”,修改Width和 Height,分别对应宽度和高度。
  4. 控件的事件:在“设计模式”下,双击该控件,VB编辑器会自动为我们生成 Change 事件。如果要手动编写 其它事件代码,则需要 在VB编辑器界面,代码编写区域的顶部的左侧(控件名称列表)和右侧(事件列表),分别选择 控件 和 事件名称。选择后,VB编辑器的代码编写区域会自动出现事件函数代码。
  5. VB语法:VB语法较奇葩。有C语言经验的要避免利用C经验去想当然。提几个:赋值与比较均是单等号 = ,不等于是 <>或><,而非 != ,代码换行要紧跟下划线_ ,单行注释是一个单引号打头。
  6. VB语法:VB中最大的奇葩。让你开开眼:
Dim a = 100 \ 1.5
Dim b = 100 \ 2.5
'猜猜 a 和 b 是多少

如果你没有VB经验,你绝对猜不到 ,a 和 b 居然都是 50 !这TM还是严谨的计算机科学么???而其中原理如下:

首先,左斜线 / 是 VB的一般除法,而右斜线 \ ,就比较神奇了。它一般也叫‘整除,但不是数学上的整除。也不是常规的 C语言概念里的 整除,而是获得整数的除法。简单说就是 \ 运算符会自动将左、右的值,先转换为整数,再进行整除运算。而如何将该运算符 左右的值,转换为 整数,就更更更奇葩了!

VB中小数转换整数的规则:当小数部分恰好为 0.5 时,VB会将它转换为最接近的 [[ 偶数值 ]]。多么奇葩的规则。1.5 被硬生生的转换成了 2,而2.5被强制扭曲成了 2 !这就造成了上面 a 和 b都是50的奇怪结果。

如果对我的观点存疑,我也没有好办法,我没有找到官方描述,只搜到了一个相关的官方表述。这就是在VB中针对整除的“四舍六入,五留双”的顺口溜的由来。(该顺口溜仅适用于VB语言,且仅适用于VB的整除运算规则)

在MSDN有个官方的关于 Fix 函数 和 Int 函数的相关表述,我觉得可以解释为何 VB会如此转换:
    当小数部分恰好为 0.5 时,Cint 和 CLng 函数会将它转换为最接近的 [[ 偶数值 ]]
    例如,0.5 转换为 0、1.5 转换为 2
    Cint 和 CLng 函数不同于 Fix 和 Int 函数,Fix 和 Int 函数会将小数部分截断而不是四舍五入。
    并且 Fix 和 Int 函数总是返回与传入的数据类型相同的值。

下面是正文。

应公司财务人员的请求,需在Word中做个:输入阿拉伯数字,自动转换成大写,并填充到Word控件中对应的亿、万、千控件格子的功能,特研究VB。

下面是我在网上搜集的将 阿拉伯数字转换为 中文大写的代码,注释为我添加,方便理解,特记录在此。

有机会把带有宏的原Word也发布,供大家参考。

Function mychange(ByVal Myinput)    'MyinputA 去除空白符且变成整数(去掉小数)后的数字串'MyinputB 翻转后的数字串'MyinputC 转换为大写的金额Dim Temp, TempA, MyinputA, MyinputB, MyinputCDim Place As StringDim J As IntegerPlace = "分角元拾佰仟万拾佰仟亿拾佰仟万"shuzi1 = "壹贰叁肆伍陆柒捌玖"shuzi2 = "整零元零零零万零零零亿零零零万"qianzhui = ""If Val(Myinput) = 0 Then Myinput = 0If Myinput = "" Then Myinput = 0If Myinput < 0 Then qianzhui = "负"'将小数转为整数,去掉小数点, 123.45 -> 12345Myinput = Int(Abs(Myinput) * 100 + 0.5)If Myinput > 99999999999# Thenmychange = "输入有误:数字过大"Exit FunctionEnd IfIf Myinput = 0 Thenmychange = "零元零分"Exit FunctionEnd IfMyinputA = Trim(Str(Myinput))shuzilong = Len(MyinputA)'翻转金额,12345->54321For J = 1 To shuzilongMyinputB = Mid(MyinputA, J, 1) & MyinputBNext'1把阿拉伯数字转为大写, 54321, 5->伍'2将数字和对应位置的单位拼接,伍肆叁贰壹,伍->伍分'3拼接时翻转回来, 肆角伍分'注意0:从 shuzi2 得到单位,而不是从 Place'       12.10->1210->0121->  整 壹角 贰元 壹拾'       10.88->1088->8801->捌分 捌角   元 壹拾'       30800.25->3080025->5200803->..贰角 元 零 捌佰 零 叁万'               ->叁万 零 捌佰 零 元 贰角...For J = 1 To shuzilongTemp = Val(Mid(MyinputB, J, 1))If Temp = 0 ThenMyinputC = Mid(shuzi2, J, 1) & MyinputCElseMyinputC = Mid(shuzi1, Temp, 1) & Mid(Place, J, 1) & MyinputCEnd IfNext'细节:处理零'10.46          壹拾零元... -> 壹拾元'10 1234.56     壹拾零万... -> 壹拾万'10 1234 5678.56壹拾零亿... -> 壹拾亿'30800.25       上一步得到:叁万 零   捌佰 零     元 贰角伍分'               注意并不是:叁万 零仟 捌佰 零拾 零元 贰角伍分'30800.25       叁万零捌佰(零)元.. ->  叁万零捌佰 元..shuzilong = Len(MyinputC)For J = 1 To shuzilong - 1If Mid(MyinputC, J, 1) = "零" ThenSelect Case Mid(MyinputC, J + 1, 1)Case "零", "元", "万", "亿", "整":MyinputC = left(MyinputC, J - 1) & Mid(MyinputC, J + 1, 30)J = J - 1End SelectEnd IfNext'贰亿万... -> 贰亿...shuzilong = Len(MyinputC)For J = 1 To shuzilong - 1If Mid(MyinputC, J, 1) = "亿" And Mid(MyinputC, J + 1, 1) = "万" ThenMyinputC = left(MyinputC, J) & Mid(MyinputC, J + 2, 30)Exit ForEnd IfNextmychange = qianzhui & Trim(MyinputC)
End Function

最后我把自己的完整 docm 带有VB代码的完整文件(程序)附上,内有注释。请使用盗版 office 打开(笑),请勿使用正版WPS。最优适配Office2007,其它高于Office2007的均可使用,只是样式不再对齐。Office2003不支持。

CSDN站内下载。我不想要金币的,不知道怎么取消金币,我上传的时候没有选需要金币。

参考资料:

1. Office VBA 对象参考

【办公-Word-VB】Word中VB控制ActiveX控件转换人民币大写并填充-源码带完整注释相关推荐

  1. Asp.net中开发使用ActiveX控件

    从网上看来一篇网页中使用ActiveX的文章,正好用到.整理了一下以作备用 一 使控件实现 IObjectSafety 接口 1. 从 Visual Basic 6.0 光盘获取 OLE 自动化类型库 ...

  2. 河南税务局网站添加到IE浏览器可信站点中,启用“ActiveX控件和插件”,将安全级别设置为‘中’的具体操作

    河南税务局网站http://etax.henan.chinatax.gov.cn/ 添加到IE浏览器可信站点中,启用"ActiveX控件和插件",将安全级别设置为'中'的具体操作 ...

  3. 32位visual studio中添加x64 ActiveX控件方法

    visual studio中创建ActiveX控件的方法可参考:https://blog.csdn.net/wangzhiyang925/article/details/38715605?tdsour ...

  4. Asp.Net 中使用客户端Activex控件需要注意的事情

    案例:Asp.Net +VB制作的Activex控件 操作系统:Windows2003 +Sp1 现象1:通过     <OBJECT classid="CLSID:132A80F5- ...

  5. 类中调用界面ActiveX控件报错当前线程不在单线程单元中因此无法实例化 ActiveX 控件的解决办法...

    解决办法是Form类中定义一个静态的ActiveX对象,在formload中将界面上的ActiveX对象赋值给新定义的对象,类中访问该静态对象即可. public static AxClientDri ...

  6. delphi2007中如何安装ActiveX控件

    (1).打开Delphi2007, File-New-Package Delphi for win32. (2).Component-Import Component,选择 Import Active ...

  7. 关于用C#编写ActiveX控件4(转)

    在前面我们已经完成了ActiveX控件的开发,接下来的就是发布它了. 首先,我们建立一个windows安装项目,并将ActiveX控件的主输出添加到项目输出中.然后,改动ActiveX控件的主输出文件 ...

  8. word把对应图片变成嵌入的ActiveX控件。

    刚做一个小东东,做的过程还是走过些弯路,记录一下,客户提出word报表上的图太单调,提出把对应的报表上的图做成如程序里显示的Chart控件一样,能缩放,能做一些数据的转换运算然后显示.最开始我是准备用 ...

  9. VS2008 在IE中 调试 ActiveX控件

    不知道是不是微软的粗心大意,VS2008中竟然没有ActiveX控件测试容器. 幸好需要在IE中测试控件,就不需要那个测试容器啦. 1. 生产测试控件的HTML: <HTML> <H ...

最新文章

  1. PyAlgoTrade Hello World 第一个程序(一)
  2. Windows Server 2008常见的安全设置
  3. Android App定位和规避内存泄露方法研究
  4. boost::mpl模块实现pair_view相关的测试程序
  5. 60度斜坡怎么计算_【测绘】南方CASS土方计算方法—方格网法
  6. 如何将计算机加入到域环境中,如何在讲计算机加入一个WinXP的域环境
  7. jquery attr
  8. 比较和同步两个SQL Server数据库之间的图像
  9. Spring 在xml文件中配置Bean
  10. vba 判断目标单元格内容改变的代码_【VBA小代码】批量改变单元格部分字符格式...
  11. AOSP>设计>测试>(第三节)兼容性测试套件CTS
  12. pdf怎么设置密码?
  13. 计算材料学与第一性原理、分子动力学、蒙特卡洛计算方法
  14. 关于python变量使用下列说法中错误的是_关于Python中的全局变量和局部变量,以下描述中错误的是...
  15. 在各级供应商的表达中,OEM,Tier One (Tier 1),Tier Two (Tier 2)的概念和区别
  16. HTML+CSS实现网易云音乐首页(手机版)
  17. SDN学习笔记(一)
  18. 优秀课程案例:使用Scratch制作扫雷插旗排雷完整版
  19. win10自动重启另辟蹊径解决方案
  20. JAVA学习心得--自勉(转)

热门文章

  1. 解决SpringMVC报404错误
  2. java完善四则计算器_java 四则混合运算 计算器
  3. CorelDRAW2022精简亚太新增功能详细介绍
  4. 详解C语言自定义类型(结构体,位段,枚举,联合)
  5. php wscript.shell组件,wscript.shell × 命令行执行组件
  6. ogg同步迁移数据库
  7. 01-host-only配置成可访问外网(centos)
  8. iwebshop项目环境搭建-locust性能测试
  9. 作业助手功能介绍及操作流程
  10. Intel RealSense Camera SR300和SR305的细微差别