3

我正在使用 Word 2010,并且使用公式编辑器已经有一段时间了。

我想编写一个宏,将文档中的选定内容保存为图像。我想用它来提取我在文档中写的方程式,作为图片,然后将它们上传到一些免费图片网站上发布。

但是,如果我能够提取文档的大部分内容,而不仅仅是方程式(尽管现在提取方程式会让我满意),那将更加有用。

在 Excel 中,有一个内置选项可以将内容复制为图像,然后您可以将其粘贴到您想要的任何位置。但由于某种原因,Word 没有这种能力。

无论如何,我正在寻找一种方法来做到这一点,即使这会涉及一些外部非内置 vba 代码。但它应该与 vba 集成,这样我就可以处理这些图像,并用它们做其他事情(就像我说的,例如 - 将它们自动上传到某些图像站点)。

在发布这个问题之前我做了一些研究,我找不到任何有效的解决方案。

感谢您的帮助!

4

1 回答 1

1

基本上,您需要使用 VBA 选择项目,执行“复制”,然后使用剪贴板功能检索数据并将其保存到文件中。不幸的是,我不能发布完整的代码,因为它不属于我。

序列是:

  • 打开剪贴板
  • GetClipboardData(返回值取决于剪贴板格式。)
    • CF_ENHMETAFILE 它是 GDI MetaFile 对象的句柄。您可以使用 CopyMetaFile 将其保存到文件中。在这种情况下,您不必使用 GlobalLock。
    • CF_TEXT 它是一个 HGLOBAL
    • CF_DIB 它是一个包含 BITMAPINFO 的 HGLOBLA - 可以复制到文件中
  • CopyEnhMetafileGlobalSize、GlobalLock、CopyMemory、GlobalUnlock。
  • 关闭剪贴板

    Private Declare Function Win32GetClipboardData Lib "Kernel32" Alias "GetClipboardData" (ByVal lClipboardFormat As Long) As Long

在它返回 HGLOBAL 的地方,您可以使用 GlobalSize、GlobalLock、CopyMemory 将其复制到 BSTR 或Byte()对象,然后使用 ADODB.Stream 将数据保存到文件中。,然后和 GlobalUnlock 进行清理。我认为它属于剪贴板,所以你不应该使用 GlobalFree。

看来我知道很多工作!但是一旦完成,您将拥有一个像这样的简单函数:

Sub SaveClipboardData(ByVal lFormat, ByVal sFileName)

你可以说:

  • 选择对象
  • 复制
  • SaveClipboardData CF_ENHMETAFILE, "path\to\file.emf"

达达!

您将能够非常轻松地保存为 BMP (CF_DIB) 或 EMF,ImageMagick 可以将它们转换为您想要的任何其他内容。我建议使用 EMF,因为它是一种矢量格式,并转换为 PNG 以获得最佳分辨率。

我已经编写了至少两次代码来执行此操作 - 这并不难,但您必须正确获取函数签名。请参阅此处以获得一些帮助:

于 2012-05-13T19:15:20.957 回答