[英]How can I instruct excel to execute my .xla file automatically on startup?
[英]How can I GZip compress a file from Excel VBA using code in an .xla file only?
我需要能够在Excel VBA函数中压缩文件。 具体来说,我需要能够使用'deflate'算法。
有没有办法在不必执行命令行应用程序的情况下执行此操作? 不依赖于外部工具,代码将更加健壮。
理想情况下,代码将使用预安装的VBA或COM库函数 - 我不希望自己实现此逻辑或安装DLL等。
如果可能的话,我希望安装该函数就像将.xla添加到可用的Excel加载项一样简单。 不需要DLL,EXE,注册表项等。
编辑我可以使用.NET GZipStream来执行此操作吗?
对于这类应用程序,VBA(实际上是VB6的方言)很慢。 我记得我曾经在VB6和C上实现了Shannon-Fano算法,即使在转换成DLLMain并从那里调用而不是在命令行可执行文件中,C版本也快了大约10倍。
有许多COM DLL提供压缩服务,包括开源和共享软件,其中一些实现GZIP的deflate算法。 从您的VBA代码中调用此类DLL中的一个函数来代表您进行压缩非常简单。
我理解您不愿意使用应用程序外部的东西,但在这种情况下,您可能必须为性能而应用异常。
为了彻底破坏你的乐趣,请检查windows \\ system32上的ZIPFLDR.DLL文件。 您可能还想看看这些链接:
通过谷歌搜索找到,你应该能够找到更多/更好的例子。
好的,我想我有一个答案。
zlib是一个由编写你不想实现的deflate算法的人编写的库。 有一个win32 DLL可用。 以下是有关从Windows使用它的常见问题解答:
http://www.zlib.net/DLL_FAQ.txt
查看问题7.作者似乎对Windows用户并不热衷,并且似乎对VB用户一点也不热衷,但只要他们足够友好地提供库,我们就可以完成其余的工作。
如果这足以帮助你,那就太好了。 如果您需要帮助从VBA调用C库添加注释,我们将解决它。 多年来我没有做过任何VB-to-C电话 - 听起来很有趣。
如果要在VBA中实现算法,则需要(在VBA中)保存电子表格,然后使用VB的I / O函数打开文件,缩小文件并再次保存。 对于所有意图和目的,它与编写适用于文件的普通VB应用程序完全相同。 您可能需要将VBA宏放在单独的工作簿中以避免“正在使用文件”类型的错误,但如果您以只读方式重新打开文件并使用不同的文件名保存它,则应该可以将所有内容保存在一个工作簿中。
但我几乎可以肯定,从VBA内部对gzip进行shell操作将在功能上完全相同且无限容易。
编辑:一些代码。 当我运行它时它没有失败,因此可以将所有内容保存在同一个工作簿中。
Sub main()
ActiveWorkbook.Save
Open "macrotest.xls" For Binary Access Read As #1
Open "newfile.zip" For Binary Access Write As #2
'do your stuff here
Close #2
Close #1
End Sub
看来你想打开一瓶葡萄酒,但你肯定会拒绝使用开瓶器。 只要没有允许GZipping文件的VBA功能,如果没有一些外部资源(如dll或exe文件),您将无法完成工作。
如果有人想要在不依赖第三方软件的情况下压缩文件,他们通常会将其作为COM对象/ DLL实现,因此它不仅可以用于Excel。 如果有人想将zip功能合并到Excel中,他们会使用第三方工具,因此他们不必重新实现算法。 所以你正在逆潮流游泳。 然而...
http://www.cpearson.com/excel/SaveCopyAndZip.htm
有两个版本。 COM加载项版本“...允许您压缩已保存到磁盘的任何工作簿(但它可能处于未保存状态)。” 它依赖于Moonlight Software组件,但所有组件和设置都包含在安装程序中。 它不是公共领域,但许可证的限制性比GPL要小。 最终结果是Excel加载项(使用第三方组件)。
但是,如果你真的,真的不希望任何依赖外部工具,你要么必须自己实现压缩算法,要么等到Microsoft将这些功能构建到Windows并通过Excel公开它。
我希望这有帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.