.xla 파일의 코드를 사용하여 Excel VBA에서 파일을 압축하려면 어떻게해야합니까?

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

문제

Excel VBA 기능에서 파일을 압축 할 수 있어야합니다. 구체적으로 'deflate'알고리즘을 사용할 수 있어야합니다.

명령 줄 애플리케이션을 실행하지 않고도이 작업을 수행 할 수있는 방법이 있습니까? 외부 도구에 의존하지 않으면 코드가 더 강력합니다.

이상적으로 코드는 사전 설치된 VBA 또는 COM 라이브러리 기능을 사용합니다.이 논리를 직접 구현하거나 DLL을 설치하지 않아도됩니다.

가능하면 기능의 설치가 사용 가능한 Excel 애드 인에 .xla를 추가하는 것만 큼 간단하게 만들고 싶습니다. DLL, exes, 레지스트리 항목 등이 필요하지 않습니다.

편집하다 .NET gzipstream을 사용하여이를 수행 할 수 있습니까?

도움이 되었습니까?

해결책

VBA (실제로 VB6의 방언)는 이러한 종류의 응용 분야에서 느립니다. 한때 VB6과 C에서 Shannon-Fano 알고리즘을 구현 한 것을 기억합니다. C 버전은 DLLMAIN으로 바뀌고 명령 줄 실행 파일보다는 전화를 한 후에도 약 10 배 더 빠릅니다.

오픈 소스와 쉐어웨어와 함께 압축 서비스를 제공하는 많은 COM DLL이 있으며 그 중 일부는 GZIP의 Deflate 알고리즘을 구현합니다. VBA 코드의 DLL에서 하나의 기능을 호출하여 귀하를 대신하여 압축을 수행하는 것은 정말 간단합니다.

나는 당신이 당신의 응용 프로그램 외부의 것을 사용하는 것을 꺼려한다는 것을 이해하지만,이 경우 성능을 위해 예외를 적용해야 할 수도 있습니다.

재미있는 재미를 완전히 망치기 위해 Windows System32에서 Zipfldr.dll 파일을 검사하십시오. 다음 링크를 살펴 보는 것도 좋습니다.

인터넷 검색을 통해 둘 다 발견하면 더 많은/더 나은 예를 찾을 수 있어야합니다.

다른 팁

좋아, 나는 당신을위한 답이 있다고 생각합니다.

Zlib은 구현하고 싶지 않은 Deflate 알고리즘을 쓴 사람이 작성한 라이브러리입니다. 사용 가능한 Win32 DLL이 있습니다. Windows에서 사용하는 것에 관한 FAQ는 다음과 같습니다.

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

질문 7. 저자는 Windows 사용자에게 너무 열중하지 않으며 VB 사용자에게 전혀 열중하지 않지만 라이브러리를 제공하기에 충분히 친절하는 한 나머지는 할 수 있습니다.

이것이 당신을 돕기에 충분하다면, 훌륭합니다. VBA에서 C 라이브러리를 호출하는 데 도움을주고 싶다면 의견을 추가하면 알아낼 수 있습니다. 나는 몇 년 동안 VB-to-C 전화를 한 적이 없었습니다. 재미처럼 들립니다.

와인 한 병을 열고 싶지만 병 개봉을 확실히 거부합니다. 파일의 Gziping을 허용하는 VBA 기능이없는 한, DLL 또는 EXE 파일과 같은 외부 ressource 없이는 작업을 수행 할 수 없습니다.

누군가 3 자 소프트웨어에 의존하지 않고 파일을 압축하고 싶다면 일반적으로 COM 개체/DLL로 구현하므로 단순한 Excel 이상으로 사용할 수 있습니다. 누군가가 Zip 기능을 Excel에 통합하려면 3 파티 도구를 사용하여 알고리즘을 다시 구현할 필요가 없습니다. 그래서 당신은 조수에 대항하여 수영하고 있습니다. 하지만...

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

두 가지 버전이 있습니다. COM 애드 인 버전 "... 디스크에 저장된 모든 통합 문서 (그러나 구원받지 않은 상태 일 수 있음)." Moonlight 소프트웨어 구성 요소에 의존하지만 모든 구성 요소와 설정은 설치 프로그램에 포함되어 있습니다. 공개 도메인은 아니지만 라이센스는 GPL보다 덜 제한적입니다. 최종 결과는 Excel 애드 인 (3 파티 구성 요소를 사용하는)입니다.

그러나 실제로 외부 도구에 대한 종속성을 원하지 않는다면 압축 알고리즘을 직접 구현하거나 Microsoft가 해당 기능을 Windows로 구축하고 Excel을 통해 노출 될 때까지 기다려야합니다.

이게 도움이 되길 바란다.

VBA에서 알고리즘을 구현하려면 (VBA에서) 스프레드 시트를 저장 한 다음 VB의 I/O 함수를 사용하여 파일을 열고 디플레이트하고 다시 저장해야합니다. 모든 의도와 목적을 위해 파일에서 작동하는 일반 VB 응용 프로그램을 작성하는 것과 동일합니다. "파일 사용"오류 유형을 피하기 위해 VBA 매크로를 별도의 통합 문서에 넣어야 할 수도 있지만 파일을 읽기 전용으로 다시 열고 다른 파일 이름으로 저장하면 모든 것을 하나의 통합 문서로 유지해야합니다.

그러나 나는 VBA 내에서 GZIP로 껍질을 벗기는 것이 기능적으로 동일하고 무한히 쉬울 것이라고 거의 확신합니다.

편집하다: 일부 코드. 내가 실행했을 때 실패하지 않았으므로 모든 것을 같은 통합 문서에 보관해도됩니다.

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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top