ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

word的自动计算功能开发

[复制链接]

TA的精华主题

TA的得分主题

发表于 2004-5-26 19:25 | 显示全部楼层 |阅读模式

关于计算式

各位兄弟,我在word中编写结构计算书的时候,有好多计算式是:例如:
75/{84 -9×4)]+786.5
2*89+75-9+8-789/4
****等等算式,
计算都快算崩溃了,想编写一个这样的宏,在选中计算式如2*89+75-9+8-789/4的时候,运行一下宏,则能直接写出”=结果”,得到了高手wtkc的指点,小弟不敢独享,特将其代码公布:'.'***************************************************************************************************

'有一个很简单的办法,加入excel的引用即可,借助excel的强大计算功能,不必开发公式解析。
;选择公式后,执行宏则可
Dim xlApp As Excel.Application
Sub calculate()
    Dim formulaStr As String, resultStr As String
    formulaStr = Application.Selection
    MsgBox formulaStr                                         '如果为了提高速度可以注释掉此句
    On Error Resume Next
    If xlApp Is Nothing Then
        Set xlApp = CreateObject("Excel.Application")
        xlApp.Workbooks.Add
    End If
    xlApp.Cells(1, 1).formula = "=" & Left(formulaStr, Len(formulaStr) - 1)
    resultStr = xlApp.Cells(1, 1).Value
    Selection.InsertAfter resultStr
End Sub
'Reade me:运用前先加载vb的数据库:在vb的编写代码中,选中Excel的vb库,在word中
         计算:45+89-4*9*5/8....等计算式,在计算的后面,不要有等号,程序会自动写出.
         或者会出错,因为Left(formulaStr, Len(formulaStr) )中认为没有考虑.
大家还有什么更加高明的请写出!


[此贴子已经被konggs于2006-8-18 9:09:57编辑过]

TA的精华主题

TA的得分主题

 楼主| 发表于 2004-5-26 19:45 | 显示全部楼层
大虾们! 各位兄弟,我在word中编写结构计算书的时候,有好多计算式是:例如: 如下格式
在word的文本中有:
……(关于a的文字叙述,:如因为是13m跨径的桥梁,)
则a=75/(84 -9×4)+786.5
……关于b的文字叙述,:如因为是13m跨径的桥梁)
b=89+75-9+8-789/4 ……则:欲求的结果W=(a/b+5)*100-500
运行: 则能将上面的计算式写出结果,

如:a=75/(84 -9×4)+786.5=788.0625

……

b=89+75-9+8-789/4=-34.25

……

W=(a/b+5)*100-500=-2307.650073

在VBA中这样的问题很好解决,但是在word的文本中,这样的问题估计需要用到查找;替换,和调用excel的模块,还忘高手能提出解决的代码,谢谢!!!!

TA的精华主题

TA的得分主题

发表于 2004-5-26 20:20 | 显示全部楼层

WORD中对于普通的四则运算以及乘方开方等运算,只须使用如下功能:

CTRL+F9:插入域括号,然后在括号内输入“=(1+2)*4/4-5+8”等等你要的数据公式然后更新域即可。

不必劳师动众吧!

TA的精华主题

TA的得分主题

 楼主| 发表于 2004-5-27 11:39 | 显示全部楼层
更新域的vba代码怎么写啊!?谢谢

TA的精华主题

TA的得分主题

发表于 2004-5-27 16:34 | 显示全部楼层

选中域,右击更新域即可,(快捷方式:SHIFT+F9 或ALT+F9)

非得用VBA吗?

TA的精华主题

TA的得分主题

 楼主| 发表于 2004-5-28 09:19 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
sub mycal()
'本程序用于计算公式,利用word里面域的算法
Dim formulaStr As String, resultStr As String
formulaStr = Application.Selection
'**********************************
Selection.InsertAfter "="
Selection.MoveRight Count:=(Len(formulaStr) + 1)
cc = "=" & formulaStr
MsgBox "你欲求算式是?" & Chr(13) & Chr(10) & formulaStr
Set myField = ActiveDocument.Fields.Add(Range:=Selection.Range, _
                                         Type:=wdFieldEmpty, Text:=cc, PreserveFormatting:=False)

End Sub
看看是不是较好一些!(自定义一个按钮,更方便的)

(方法:选中算式如:12+45*56-78/9+5^2,再运行此宏即可)

[此贴子已经被konggs于2006-8-18 9:20:55编辑过]

TA的精华主题

TA的得分主题

发表于 2004-5-29 22:01 | 显示全部楼层

抽空做了一个:

Sub CalValue()
Dim Mycal As Single, Myrange As Range, Er
On Error Resume Next
Err.Clear
Er = (Right(Selection, 1) * 1)
If Err.Number = 13 Then‘此判断主要针对选定过程中容易将段落标记选中否则可省略。
Set Myrange = ActiveDocument.Range(Start:=Selection.Start, End:=Selection.End - 1)
Else
Set Myrange = ActiveDocument.Range(Start:=Selection.Start, End:=Selection.End)
End If
Mycal = Myrange.Calculate
Myrange.InsertAfter "=" & Mycal
End Sub

[此贴子已经被konggs于2006-8-18 9:22:02编辑过]

TA的精华主题

TA的得分主题

 楼主| 发表于 2004-5-31 17:58 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
高啊,比我们的妙!!!那么带三角函数的怎么能解决啊?斑竹指教!!!

TA的精华主题

TA的得分主题

发表于 2004-5-31 20:56 | 显示全部楼层

 

  CTRL+F9

  SHIFT+F9

  ALT+F9

  守柔对域的研究,真是入木三分,佩服。

TA的精华主题

TA的得分主题

发表于 2004-6-1 11:21 | 显示全部楼层

Sub SCTC()
Dim Mycal As Double, MyValue As Double, CalValue As Double, SelVal As Single, InSin As String
If Selection.End = Selection.Start Then MsgBox "请选定需要计算的文本!": Exit Sub
If Selection.Text Like "sin(*)" = True Then
SelVal = CSng(Mid(Selection, 5, Len(Selection) - 5))
MyValue = SelVal * 3.14159265358979 / 180
CalValue = Round(Sin(MyValue), 13)
If Abs(CalValue) < 1 Then
Selection.InsertAfter "=0" & CalValue
Else
Selection.InsertAfter "=" & CalValue
End If
Exit Sub
End If
If Selection.Text Like "cos(*)" = True Then
SelVal = CSng(Mid(Selection, 5, Len(Selection) - 5))
MyValue = SelVal * 3.14159265358979 / 180
MyValue = SelVal * 3.14159265358979 / 180
CalValue = Round(Cos(MyValue), 13)
If Abs(CalValue) < 1 Then
Selection.InsertAfter "=0" & CalValue
Else
Selection.InsertAfter "=" & CalValue
End If
Exit Sub
End If
If Selection.Text Like "tan(*)" = True Then
SelVal = CSng(Mid(Selection, 5, Len(Selection) - 5))
MyValue = (SelVal * 3.14159265358979 / 180)
MyValue = SelVal * 3.14159265358979 / 180
CalValue = Round(Tan(MyValue), 13)
If Abs(CalValue) < 1 Then
Selection.InsertAfter "=0" & CalValue
Else
Selection.InsertAfter "=" & CalValue
End If
Exit Sub
End If
If Selection.Text Like "cot(*)" = True Then
SelVal = CSng(Mid(Selection, 5, Len(Selection) - 5))
MyValue = Round(SelVal * 3.14159265358979 / 180, 13)
MyValue = SelVal * 3.14159265358979 / 180
CalValue = Round(1 / Tan(MyValue), 13)
If Abs(CalValue) < 1 Then
Selection.InsertAfter "=0" & CalValue
Else
Selection.InsertAfter "=" & CalValue
End If
Exit Sub
End If
If Selection.Text Like "[!A-Z]*" = True Then
Selection.InsertAfter "=" & Selection.Calculate
End If
Exit Sub

End Sub

感于楼主的执著,但计算终非WORD所长,勉力而作,仅供参考!(真正的计算,还应该要考虑出错的判断和处理,此处打马虎过去也!),而且只作了四个三角函数和一个四则运算,且不能连续计算,请注意.

[此贴子已经被konggs于2006-8-18 9:23:55编辑过]
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-5-2 11:32 , Processed in 0.032947 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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