Hvordan kan jeg gzip komprimere en fil fra Excel VBA bruke kode i en XLA filen bare?

stemmer
3

Jeg må være i stand til å gzip komprimere en fil i en Excel VBA-funksjon. Spesielt jeg trenger å være i stand til å bruke 'deflate' algoritme.

Er det en måte å gjøre dette uten å måtte exec en kommandolinje program? Uten avhengighet av eksterne verktøy koden vil være mer robust.

Ideelt sett koden vil gjøre bruk av forhåndsinstallerte VBA eller COM bibliotekfunksjoner - Jeg ønsker ikke å ha for å implementere denne logikken meg selv eller installere DLLs etc.

Hvis det er mulig, jeg vil installasjon av funksjonen skal være så enkelt som å legge en XLA til den tilgjengelige Excel Add-Ins. Ingen DLLs, EXEs, registeroppføringer osv nødvendig.

Edit Kan jeg gjøre bruk av .NET GZipStream å gjøre dette?

Publisert på 03/10/2008 klokken 15:04
kilden bruker
På andre språk...                            


5 svar

stemmer
0

Hvis du ønsker å implementere algoritmen i VBA, ville du trenger å (i VBA) lagrer regnearket og deretter bruke VB I / O-funksjoner for å åpne filen, deflatere den, og lagre den på nytt. For alle praktiske formål er det identisk med å skrive en vanlig VB program som fungerer på en fil. Du må kanskje sette VBA-makro i en egen arbeidsbok for å unngå "fil i bruk" typer feil, men hvis du åpner filen som skrivebeskyttet og lagre det med et annet filnavn du bør være OK å holde alt i en arbeidsbok.

Men jeg er nesten sikker på at beskytningen ut til gzip fra i VBA ville være funksjonelt identiske og uendelig lettere.

EDIT: Noen kode. Det tok ikke svikte når jeg kjørte den, så det er greit å holde alt i samme arbeidsbok.

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
Svarte 03/10/2008 kl. 15:10
kilden bruker

stemmer
4

VBA (som er egentlig en dialekt av VB6) er treg for disse type programmer. Jeg husker jeg en gang gjennomført Shannon-Fano algoritme på VB6 og på C, C-versjonen var omtrent 10 ganger raskere, selv etter å ha blitt omgjort til en DllMain og ringte derfra i stedet for på et kommandolinje kjørbar.

Det er mange COM DLL-filer som gir komprimering tjenester, både åpen kildekode og shareware, og noen av dem å gjennomføre GZIP er deflate algoritme. Det ville være veldig enkelt å bare kalle en funksjon fra en DLL fra VBA kode for å gjøre kompresjonen på dine vegne.

Jeg forstår at du blir tilbakeholdne på å bruke noe eksternt til søknaden din, men i dette tilfellet må du kanskje søke et unntak for ytelse skyld.

I et forsøk på å fullstendig ødelegge moroa, undersøke filen Zipfldr.dll på windows \ system32. du kan også gjerne ta en titt på disse linkene:

Finnes både gjennom googling, bør du være i stand til å finne mer / bedre eksempler.

Svarte 03/10/2008 kl. 17:35
kilden bruker

stemmer
0

Det virker som du ønsker å åpne en flaske vin, men du definitivt nekter å bruke en flaskeåpner. Så lenge det ikke er noen VBA funksjon slik at GZipping av en fil, vil du ikke være i stand til å gjøre jobben uten noen ytre ressource eksempel en dll eller exe-fil.

Svarte 03/10/2008 kl. 18:51
kilden bruker

stemmer
3

OK, jeg tror jeg har et svar til deg.

zlib er et bibliotek skrevet av fyren som skrev deflate algoritme du ikke ønsker å gjennomføre. Det er en Win32 DLL tilgjengelig. Her er spørsmål og svar om å bruke den fra Windows:

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

Sjekk ut aktuelle 7. Forfatterne synes ikke så ivrig på Windows-brukere, og synes ikke i det hele tatt opptatt av VB-brukere, men så lenge de er snill nok til å gi biblioteket vi kan gjøre resten.

Hvis dette er nok til å hjelpe deg, så flott. Hvis du vil ha hjelp med å kalle C-bibliotek fra VBA legge til en kommentar, og vi vil finne det ut. Jeg har ikke gjort noen VB-til-C samtaler i år - det høres ut som moro.

Svarte 03/10/2008 kl. 19:29
kilden bruker

stemmer
0

Hvis noen ønsket å komprimere filer uten å stole på tredje-parts programvare vil de vanligvis gjennomføre det som et COM objekt / DLL slik at det ville være tilgjengelig for mer enn bare Excel. Hvis noen ønsket å innlemme zip-funksjonalitet i Excel de ville bruke tredje-parts verktøy slik at de ikke ville ha til å re-implementere algoritmen. Så du svømmer mot strømmen. Derimot...

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

Det er to versjoner. COM-versjon "... kan du zip noen arbeidsbok som er lagret på disk (men det kan være i en ufrelst tilstand)." Det er avhengig av en Moonlight programvarekomponent, men alle komponenter og oppsett finnes i installasjonsprogrammet. Det er ikke helt public domain men lisensen er mindre restriktiv enn GPL. Sluttresultatet er et Excel-tillegg (som bruker en tredje-parts komponent).

Men hvis du virkelig, virkelig ønsker ikke noen avhengigheter på eksterne verktøy du enten nødt til å implementere komprimering algoritmen selv eller vente til Microsoft bygger denne funksjonaliteten i Windows og eksponerer det gjennom Excel.

Jeg håper dette hjelper.

Svarte 04/10/2008 kl. 12:52
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more