728x90

Excel - VBA 65

[VBA] RTF(Rich Text Format) 을 Plain Text로 변경

RTF 자료를 일반 문자열로 변경이 필요할 때 클래스 모듈을 삽입하고 이름을 clsRTFParsser 로 하고 아래 코드를 삽입합니다. Option Explicit '//32bit 버전 출처 : https://stackoverflow.com/a/1747886 #If VBA7 Then '// 64Bit용에는 PtrSafe 적용, LongPtr로 변경 Private Declare PtrSafe Function GlobalAlloc Lib "kernel32" (ByVal wFlags&, ByVal dwBytes As LongPtr) As LongPtr Private Declare PtrSafe Function GlobalLock Lib "kernel32" (ByVal hMem As LongPtr) As Lon..

Excel - VBA 2023.11.02

[VBA] Characters.Font.Color Error

작성된 시트에서 셀내 글자색을 지정하여 사용한 경우 일부 글자색을 다른 글자색으로 일괄 변경하는 매크로입니다. Cell.Characters(i, j).Font.Color를 이용해서 하는 작업인데, 사용중 알 수 없는 오류가 발생하는 경우가 있습니다. Sub FontColorChange1() Dim C As Range, iCnt As Long, i As Long Dim Color1 As Long, Color2 As Long, Color3 As Long, Color4 As Long, Color5 As Long, Color6 As Long, Color7 As Long, Color8 As Long, Color9 As Long, Color10 As Long, Color11 As Long, Color12 As Lo..

Excel - VBA 2023.10.10

Selenium TakeScreenshot.Copy와 TakeScreenshot.SaveAs

Selenium을 이용해서 지적도와 항공사진을 다운로드 하는 작업을 했는데, 지적도나 항공사진 서비스가 하나의 그림파일로 제공되는 게 아니라 일정크기 구역의 지도를 모자이크로 만드는 것이 대부분이므로 이걸 다운로드 하기 어려워 결국 ScreenShot으로 해결을 합니다. 먼저 사용한 방법이 아래와 같이 스크린 샷을 복사하고 바로 붙여 넣기 하는 방식이었는데, 다운로드 한 지도가 수백장이 되니,,, Excel의 메모리 사용량이 1GB를 넘기게 되었습니다. WD.TakeScreenshot.Copy ActiveSheet.Paste With ActiveSheet.Shapes(ActiveSheet.Shapes.Count) '// 화면캐처라 불필요한 부분 잘라내기 .PictureFormat.CropLeft = CI..

Excel - VBA 2023.09.11

[VBA] Compound class names not permitted

SeleniumBasic을 이용하여 Web을 스크랩할 때 Tag의 class가 아래처럼 기술된 경우 FindElementByClass 방법으로 이 버튼을 클릭하고자 할 때 발생하는 오류와 해결하는 방법입니다. 현위치 1. FindElementByClass를 사용하는 경우 오류 발생 wd.FindElementByClass("btn btnCurrent geoLocation Btn").Click => Compound class names not permitted 오류가 발생 2. FindElementByCss와 Title을 사용하는 방법 wd.FindElementByCss("button[title='현재위치를 표시합니다.']").Click 3. FindElementByCss와 class를 사용하는 방법 wd...

Excel - VBA 2023.09.09

WorkBook과 Worksheet 보호를 암호 없이 해제하기

Excel의 보안은 취약하기 이를 데 없습니다. 예전에는 아주 간단한 문자열 대입하는 코드로도 시트보호 암호를 깨기도 했는데, 지금은 암호입력과 결과 반응 시간을 늘려서 해당 코드를 시간이 주구장창 길어져서 효과가 없는 것 같습니다. 그래서 다른 방법으로 해제하는 방법을 소개하면 아래와 같습니다. Excel 문서 파일은 Zip파일과 같은 형식으로 구성되어 있습니다. 확장자를 아래처럼 .zip으로 변경하고 파일탐색기에서 열어보면 아래와 같이 폴더 구조와 파일들을 볼 수 있습니다. 만약 열기 암호가 설정된 파일이라면 열기 암호를 해제한 후에 볼 수 있습니다. 주요 내용은 xl 폴더 안에 있으므로 xl폴더를 먼저 보면 아래와 같습니다. 여기에 보면 workbook.xml 이라는 파일이 있는데, 여기에 Work..

Excel - VBA 2023.08.28

VBA로 ZIP과 UnZip

Excel 파일인 xlsx, xlsm, xlam, xlsb 등은 모두 기본적으로 Zip파일 형식으로 저장된 파일입니다. 그래서 확장자를 zip으로 바꾸면 파일 내부 구조를 볼 수 있습니다. 물론 읽기 암호를 설정한 경우에는 ZIP파일에 암호를 걸어 둔 것처럼 안을 볼 수 없습니다. 이 파일을 압축해제하면 몇 가지 유용한 처리를 할 수 있습니다. 이 때 사용하기 위한 UnZip과 Zip 소스코드 입니다. UnZip 소스이고, 이 함수는 압축이 해제된 폴더 Path를 반환합니다. Function Unzip(ZipName As Variant) As String Dim UnZipFolder As Variant, BasePath As String Dim FSO As Object: Set FSO = CreateOb..

Excel - VBA 2023.08.27

양력을 음력으로 변환하기

EGTools 추가기능에서 지원하는 음력 변환 함수인 ToLunar() 함수에 대한 소스코드 설명입니다. 천문연구원의 API를 이용하여 음력으로 전환할 수도 있지만, Excel은 인터넷이 없는 환경에서도 양력을 음력으로 변환할 수 있도록 만들었습니다. 지원되는 양력 구간은 1900-01-01부터 2100-12-31까지입니다. (2023.08-23일 확장) 10여년도 훨씬 전에 SQL Table로 만들어서 변환하던 것에서 착안하여 VBA에서 Table보다는 Array를 이용하는 것이 훨씬 유리하기 때문에 Array를 이용한 날짜 세기 방식으로 만든 것입니다. 배열은 3개를 사용합니다. Dim LY As Variant, LM As Variant, LType As Variant Ltype()에는 각 월의 날수..

Excel - VBA 2023.08.23

IsNumeric 함수의 함정

오늘 VBA로 처리하던 중 이상한 문제가 있어 기록해 둡니다. IsNumeric() 함수는 인자가 숫자나 숫자로 전환될 수 있으면 True를 반환합니다. 생각지도 못했던 문자열이 True로 나오는 문제가 있으므로 주의 해야 합니다. IsNumeric("0D0") = True IsNumeric("0E0") = True 자릿수와 상관없이 숫자열 + D/E + 수자열에 대해서 IsNumeric이 True가 됩니다. CDbl로 평가해 보면 아래처럼 지수형태의 숫자로 인지하고 있습니다. CDbl("1234D02") = 123400 CDbl("1234E02") = 123400 그래서 아래처럼 지수형태로 검토해 보면 CDbl("1234D-2") = 12.34 CDbl("1234E-2") = 12.34 지수형태의 문자..

Excel - VBA 2023.08.06

VBA에서 사용자 Folder를 찾기

일반적으로 C: 드라이브에 Desktop, Downloads, Documents, Pictures, Videos 같은 사용자 폴더가 위치하는데, 용량관리를 위해서 D: 드라이브에 옮겨서 사용하는 경우 이런 옮겨진 사용자 폴더를 찾아야 할 때 정확한 위치는 아래 Registry를 보면 알 수 있습니다. VBA에서는 아래와 같이 찾을 수 있습니다. MyFolderName = CreateObject("WScript.Shell").RegRead("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders\personal") %USERPROFILE%이 포함된 폴더명이 있을 경우 아래처럼 처리합니다. MyFolderN..

Excel - VBA 2023.08.05

Outlook 없이 메일을 발송하기 (CDO.Message)

Outlook 이 설치되지 않은 경우나, Outlook을 사용하지 않고 직접 메일 서버를 통해서 메일을 발송해야 하는 경우에 사용할 수 있습니다. 함수로 구현하며, 수신주소, 메일제목, 메일본문, 첨부파일 4가지 인수를 받도록 합니다. Function SendMailwithCDO(vReceipt As Variant, _ sTitle As String, _ Optional sBody As Variant = "", _ Optional vAttachments As Variant = "") 메일 서버에서 발송하기 위해서는 메일서버 및 계정 정보가 필요합니다. Dim sName As String '발송인 이름 Dim sEmail As String '발송 메일 주소/계정 Dim sPass As String '계정 ..

Excel - VBA 2023.08.04
728x90