ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 如何查找公式编辑器编写的内容(vba也好)

[复制链接]

TA的精华主题

TA的得分主题

发表于 2009-3-5 21:01 | 显示全部楼层 |阅读模式
守版主有没有办法

TA的精华主题

TA的得分主题

发表于 2009-3-6 09:32 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
原帖由 skyya 于 2009-3-5 21:01 发表
守版主有没有办法

不知楼主此举意欲何为呢?
如果结果只是在Word中,没有很好的方法。
如果是将公式的结果生成方正注解,可以参考“WD2BD智能王”的功能。

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-3-14 22:04 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
原帖由 守柔 于 2009-3-6 09:32 发表

不知楼主此举意欲何为呢?
如果结果只是在Word中,没有很好的方法。
如果是将公式的结果生成方正注解,可以参考“WD2BD智能王”的功能。

回守版主的话,我是想在word中查找.虽然有点遗憾,但还是谢谢你的答复

TA的精华主题

TA的得分主题

发表于 2009-3-16 12:09 | 显示全部楼层
楼主说的是这样吗:
equation.gif
对应的VBA代码是Selection.Range.GoToNext(wdGoToEquation).Select
如果要选中公式对象,加上一句selection.MoveRight Unit:=wdCharacter, Count:=1, Extend:=wdExtend

[ 本帖最后由 小fisher 于 2009-3-16 12:18 编辑 ]

TA的精华主题

TA的得分主题

 楼主| 发表于 2009-3-27 07:59 | 显示全部楼层
原帖由 小fisher 于 2009-3-16 12:09 发表
楼主说的是这样吗:
475681
对应的VBA代码是Selection.Range.GoToNext(wdGoToEquation).Select
如果要选中公式对象,加上一句selection.MoveRight Unit:=wdCharacter, Count:=1, Extend:=wdExtend

谢谢小fisher,不过我要的是比较两个公式内容是否一致,不是定位公式!

TA的精华主题

TA的得分主题

发表于 2009-3-27 14:28 | 显示全部楼层
原帖由 skyya 于 2009-3-27 07:59 发表

谢谢小fisher,不过我要的是比较两个公式内容是否一致,不是定位公式!

因为公式是嵌入在word中的OLE对象,word只能在外部把它作为一个整体进行操作(比如插入、删除、修改大小、位置、复制、剪切等),但是不能进入到它的内部读取或修改其中的一部分,真正可以编辑修改公式的程序是双击它时激活的公式编辑器程序,但公式编辑器是独立于word和VBA之外的,所以用VBA很难通过常规方法获取其中的内容。
如果是单纯比较两个公式内容是否一致,我倒是有办法,就是先用VBA选中其中一个公式,使用复制命令,然后从剪贴板中获取其中一种格式的二进制数据放到一个byte数组中,然后对另一个公式进行同样操作,最后再按字节对比就行了
如果是要查找其中的字符串,先用VBA选中它并复制,然后从剪贴板中获取CF_ENHMETAFILE格式的数据,然后用EnumEnhMetaFile API函数分析其中类型为EMR_EXTTEXTOUTA或EXTTEXTOUTW的记录,应该也可以得到。

TA的精华主题

TA的得分主题

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

fisher兄果然高见

前一种用二进制比较我倒是试过,但即使相同的内容,因为格式不同也会不一样,所以不好用,兄台的第二种方法,让我佩服万分,只是不知怎样获取CF_ENHMETAFILE格式的数据,又怎样EnumEnhMetaFile API函数分析其中类型为EMR_EXTTEXTOUTA或EXTTEXTOUTW的记录,期待兄台详细指点!!谢谢

TA的精华主题

TA的得分主题

发表于 2009-5-19 21:18 | 显示全部楼层
我的工作就是天天与公式打交道,所以有一些自己的心得,正好就教于各位大方之家。

如果是要查找公式中的内容,在WORD中也不是没有办法,不过要借助一个中介,这就是TeX代码。

比如我要查找公式中的x=y,具体过程可见所附动画。这个动画演示了如图把所有的公式都转换成TeX代码,然后使用WORD的“查找与替换”查找“x=y”的过程,最后把所有的公式TeX代码再复原成公式。

虽然可以通过这种方式查找,但如果通过这种方式比较公式,估计比较危险,因为同样的公式也可以有许多种不同的写法。电脑比较不是人脑。
kk.gif

TA的精华主题

TA的得分主题

发表于 2009-5-19 21:27 | 显示全部楼层
关于公式编辑器的使用技巧和TeX代码在WORD公式编辑中的应用,我在Office精英俱乐部回答了很多问题了,也发了一个示范性的帖子,完全原创的,可惜居然连一个顶的人都没有,让我失望。

在这里再转一下那个帖子的地址吧,希望能在同好见赏。

题目是《将 Mathematica 推导出来的公式直接导入 WORD 文件的方法》。
http://www.officefans.net/cdb/viewthread.php?tid=104467

TA的精华主题

TA的得分主题

发表于 2009-5-20 18:14 | 显示全部楼层
把下面这个代码复制到标准模块中,然后运行ShowEqText()过程,可以在立即窗口中输出ThisDocument中所有公式中包含的文本,不同公式之间有“-----”隔开

  1. '内存函数
  2. Private Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
  3. Private Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long
  4. Private Declare Function GlobalSize Lib "kernel32" (ByVal hMem As Long) As Long
  5. Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

  6. '剪贴板函数
  7. Private Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
  8. Private Declare Function CloseClipboard Lib "user32" () As Long
  9. Private Declare Function GetClipboardData Lib "user32" (ByVal wFormat As Long) As Long
  10. Private Const CF_ENHMETAFILE = 14

  11. '设备上下文函数

  12. Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
  13. Private Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long
  14. Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long
  15. Private Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long



  16. '增强图元文件函数
  17. Private Declare Function CopyEnhMetaFile Lib "gdi32" Alias "CopyEnhMetaFileA" (ByVal hemfSrc As Long, ByVal lpszFile As String) As Long
  18. Private Declare Function DeleteEnhMetaFile Lib "gdi32" (ByVal hEmf As Long) As Long
  19. Private Declare Function EnumEnhMetaFile Lib "gdi32" (ByVal hdc As Long, ByVal hEmf As Long, ByVal lpEnhMetaFunc As Long, lpData As Any, lpRect As RECT) As Long
  20. Private Type ENHMETARECORD
  21.         itype As Long
  22.         nSize As Long
  23. End Type

  24. Private Type RECT
  25.         Left As Long
  26.         Top As Long
  27.         Right As Long
  28.         Bottom As Long
  29. End Type

  30. Private Const EMR_EXTTEXTOUTA = 83
  31. Private Const EMR_EXTTEXTOUTW = 84


  32. Sub ShowEqText()
  33.     Dim hMem As Long
  34.     Dim hEmf As Long
  35.     Dim hdc As Long
  36.     Dim hDCMem As Long
  37.     Dim oRect As RECT
  38.     Dim lRet As Long
  39.    
  40.     For i = 1 To ThisDocument.InlineShapes.Count
  41.         If ThisDocument.InlineShapes(i).Field.Code.Text = " EMBED Equation.3  " Then
  42.             ThisDocument.InlineShapes(i).Field.Copy
  43.             If OpenClipboard(ByVal 0&) Then
  44.                 hMem = GetClipboardData(CF_ENHMETAFILE)
  45.                 If CBool(hMem) Then
  46.                     hEmf = CopyEnhMetaFile(hMem, vbNullString)
  47.         
  48.                 End If
  49.                 CloseClipboard
  50.             End If
  51.             If hEmf <> 0 Then
  52.                 hdc = GetDC(0)
  53.                 hDCMem = CreateCompatibleDC(hdc)
  54.                 ReleaseDC 0, hdc
  55.                 With oRect
  56.                     .Left = 0
  57.                     .Top = 0
  58.                     .Right = 1
  59.                     .Bottom = 1
  60.                 End With
  61.                 Dim s As String
  62.                 lRet = EnumEnhMetaFile(hDCMem, hEmf, AddressOf EnhMetaFileProc, s, oRect)
  63.                 DeleteEnhMetaFile hEmf
  64.                 DeleteDC hDCMem
  65.                 Debug.Print "----------"
  66.             End If
  67.         End If
  68.     Next
  69. End Sub

  70. Private Function EnhMetaFileProc(ByVal hdc As Long, ByVal lpHTable As Long, ByVal lpEMFR As Long, ByVal nObj As Long, lParam As String) As Long
  71.     Dim nSize As Long
  72.     Dim bytStr() As Byte
  73.     Dim itype As Long
  74.     Dim s As String
  75.     Dim iASC As Integer

  76.     CopyMemory itype, ByVal lpEMFR, 4
  77.     If itype = EMR_EXTTEXTOUTW Then
  78.         CopyMemory nSize, ByVal lpEMFR + 72, 4
  79.         nSize = nSize - 76
  80.         ReDim bytStr(1 To nSize) As Byte
  81.         CopyMemory bytStr(1), ByVal lpEMFR + 76, nSize
  82.         For i = 1 To nSize Step 2
  83.             CopyMemory iASC, bytStr(i), 2
  84.             s = s & ChrW(iASC)
  85.         Next
  86.         Debug.Print s

  87.     ElseIf itype = EMR_EXTTEXTOUTA Then
  88.         CopyMemory nSize, ByVal lpEMFR + 72, 4
  89.         nSize = nSize - 76
  90.         ReDim bytStr(1 To nSize) As Byte
  91.         CopyMemory bytStr(1), ByVal lpEMFR + 76, nSize
  92.         For i = 1 To nSize Step 2
  93.             CopyMemory iASC, bytStr(i), 2
  94.             s = s & Chr(iASC)
  95.         Next

  96.     End If
  97.     EnhMetaFileProc = 1
  98. End Function
复制代码
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2025-1-14 03:36 , Processed in 0.027210 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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