Comment puis-je GZip compresser un fichier à partir d'Excel VBA en utilisant du code dans un fichier .xla uniquement?

StackOverflow https://stackoverflow.com/questions/167888

Question

Je dois pouvoir compresser un fichier GZip dans une fonction Excel VBA. Plus précisément, j'ai besoin de pouvoir utiliser l'algorithme «deflate».

Y a-t-il un moyen de faire cela sans avoir à exécuter une application en ligne de commande? En l'absence de dépendance à des outils externes, le code sera plus robuste.

Idéalement, le code utiliserait des fonctions de bibliothèque VBA ou COM préinstallées - je ne souhaite pas avoir à implémenter cette logique ni à installer des DLL, etc.

Si possible, je souhaite que l'installation de la fonction soit aussi simple que l'ajout d'un fichier .xla aux compléments Excel disponibles. Aucune DLL, fichier EXE, entrée de registre, etc. requis.

Modifier Puis-je utiliser le GZipStream .NET pour le faire?

Était-ce utile?

La solution

VBA (qui est vraiment un dialecte de VB6) est lent pour ce type d’application. Je me souviens que j’avais une fois implémenté l’algorithme Shannon-Fano sur VB6 et sur C, la version C était environ 10 fois plus rapide, même après avoir été transformée en DLLMain et appelée à partir de là plutôt que sur un exécutable en ligne de commande.

De nombreuses DLL COM fournissent des services de compression, à la fois open source et shareware, et certaines d'entre elles implémentent l'algorithme de déflation GZIP. Il serait très simple d'appeler une fonction d'une telle DLL à partir de votre code VBA pour effectuer la compression en votre nom.

Je comprends que vous soyez réticent à utiliser quelque chose de externe à votre application, même si dans ce cas vous devrez peut-être appliquer une exception pour des raisons de performances.

Pour gâcher complètement votre plaisir, examinez le fichier ZIPFLDR.DLL sous Windows \ System32. Vous pouvez également consulter ces liens:

À la fois dans Google, vous devriez être en mesure de trouver plus / de meilleurs exemples.

Autres conseils

OK, je pense avoir une réponse pour vous.

zlib est une bibliothèque écrite par le gars qui a écrit l'algorithme de déflation que vous ne voulez pas implémenter. Il existe une DLL Win32 disponible. Voici la FAQ concernant son utilisation à partir de Windows:

http://www.zlib.net/DLL_FAQ.txt

Consultez la question 7. Les auteurs ne semblent pas trop se passionner pour les utilisateurs de Windows, ni du tout pour les utilisateurs de VB, mais tant qu’ils ont la gentillesse de fournir la bibliothèque, nous pouvons faire le reste. .

Si cela vous suffit, alors tant mieux. Si vous souhaitez obtenir de l'aide pour appeler la bibliothèque C à partir de VBA, ajoutez un commentaire et nous le comprendrons. Je n'ai fait aucun appel VB-to-C depuis des années - cela semble amusant.

Il semble que vous souhaitiez ouvrir une bouteille de vin mais que vous refusiez définitivement d’utiliser un ouvre-bouteille. Tant qu’il n’y aura pas de fonction VBA permettant le grazingage d’un fichier, vous ne pourrez pas faire le travail sans ressources externes telles qu’un fichier dll ou exe.

Si une personne souhaitait compresser des fichiers sans s’appuyer sur un logiciel tiers, elle l’implémentait généralement comme un objet COM / une DLL, de sorte qu’elle serait disponible pour beaucoup plus que pour Excel. Si quelqu'un souhaitait intégrer la fonctionnalité zip à Excel, il utilisait des outils tiers pour ne pas avoir à réimplémenter l'algorithme. Donc, vous nagez à contre-courant. Cependant ...

http://www.cpearson.com/excel/SaveCopyAndZip.htm

Il existe deux versions. La version du complément COM "... vous permet de compresser n'importe quel classeur enregistré sur le disque (mais il se peut que l'état ne soit pas sauvegardé)." Il repose sur un composant logiciel Moonlight mais tous les composants et la configuration sont contenus dans le programme d'installation. Ce n'est pas tout à fait du domaine public mais la licence est moins restrictive que la GPL. Le résultat final est un complément Excel (qui utilise un composant tiers).

Mais si vous ne voulez vraiment vraiment pas de dépendances sur des outils externes, vous devrez soit implémenter vous-même l'algorithme de compression, soit attendre que Microsoft intègre cette fonctionnalité à Windows et l'expose via Excel.

J'espère que cela vous aidera.

Si vous souhaitez implémenter l'algorithme dans VBA, vous devez (dans VBA) enregistrer la feuille de calcul, puis utiliser les fonctions d'E / S de VB pour ouvrir le fichier, le dégonfler et le sauvegarder à nouveau. À toutes fins pratiques, cela revient à écrire une application VB ordinaire qui fonctionne sur un fichier. Vous devrez peut-être placer la macro VBA dans un classeur séparé pour éviter l'utilisation du "fichier en cours d'utilisation". types d'erreurs, mais si vous rouvrez le fichier en lecture seule et que vous l'enregistrez avec un nom de fichier différent, vous devriez pouvoir tout conserver dans un classeur.

Mais je suis à peu près certain que le traitement de gzip depuis VBA serait fonctionnellement identique et infiniment plus simple.

MODIFIER: du code. Cela n'a pas échoué lorsque je l'ai exécuté. Vous pouvez donc tout conserver dans le même classeur.

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top