이번 시간에는 명단에 사진을 자동으로 넣어 보기로 하겠습니다.

 

예를 들어 매년, 매월, 또는 매주 명단이 바뀌게 되면 그에 따라 사진도 같이 바꿔줘야 되는데 상당히 번거롭습니다.

 

아래 보안구역 출입명부가 있습니다.

 

그리고 이 엑셀파일이 있는 폴더 밑에 하위폴더로 '사진파일'이 있구요.

 

그 '사진파일' 폴더에는 각 개인의 사진이 있습니다.

 

아래는 VBA코드입니다.

 

우선 현지 활성화된 시트에 있는 모든 그림을 삭제해줍니다.

 

이 작업을 안하게 되면 기존 사진이 안 지워지고 위에 새로운 사진이 덧씌워지게 됩니다.

 

Dim Pic As Object
    For Each Pic In ActiveSheet.Pictures
Pic.Delete
Next Pic


그리고 현재작업중인 엑셀의 경로를 가져옵니다.
Str1 = ActiveWorkbook.Path

i = 0
Do While Cells(6 + i, 4) <> ""

 

명단의 이름을 가져오고 그에 맞는 파일이 '사진폴더'에 있는 지 검사합니다.
Name = Cells(6 + i, 4)
str2 = Str1 & "\사진파일\" & Name & ".png"
ret = Dir(str2)

 

사진폴더에 해당사진이 있으면
If ret <> "" Then

 

해당사진의 경로를 filename2 에 저장해주고요
filename2 = Str1 & "\사진파일\" + ret


해당사진을 불러와서 Pic 개체에 넣어줍니다.
Set Pic = ActiveSheet.Pictures.Insert(filename2)

 

그리고 사진을 넣을 장소를 선택을 하고요. 명단의 옆 셀이 되겠죠
Range(Cells(6 + i, 5), Cells(6 + i, 5)).Select
Set Imagecell = ActiveCell.MergeArea

 

Pic 개체의 위치를 설정해줍니다. 아까 선택했던 셀의 좌,우,너비,높이 위치를 알려줍니다.
With Pic
  .ShapeRange.LockAspectRatio = msoFalse
  .Left = Imagecell.Left + 1
  .Top = Imagecell.Top + 1
  .Width = Imagecell.Width - 1
  .Height = Imagecell.Height - 1
End With
End If


아래 명단으로 이동하여 끝까지 반복합니다.
i = i + 1
Loop

 

코드를 실행한 결과입니다.

 

그림이 셀사이즈에 딱 맞게 잘 들어갔네요!!

 

아래는 관련 엑셀파일과 코딩 내용입니다.

그림 넣기.zip
0.20MB

 

감사합니다.


Dim Pic As Object
For Each Pic In ActiveSheet.Pictures
Pic.Delete
Next Pic

Str1 = ActiveWorkbook.Path
i = 0
Do While Cells(6 + i, 4) <> ""
Name = Cells(6 + i, 4)
str2 = Str1 & "\사진파일\" & Name & ".png"
ret = Dir(str2)
If ret <> "" Then
filename2 = Str1 & "\사진파일\" + ret
Range(Cells(6 + i, 5), Cells(6 + i, 5)).Select
Set Pic = ActiveSheet.Pictures.Insert(filename2)
Set Imagecell = ActiveCell.MergeArea
With Pic
.ShapeRange.LockAspectRatio = msoFalse
.Left = Imagecell.Left + 1
.Top = Imagecell.Top + 1
.Width = Imagecell.Width - 1
.Height = Imagecell.Height - 1
End With
End If
i = i + 1
Loop

'엑셀 > VBA' 카테고리의 다른 글

[VBA] 엑셀 그림 일괄 저장하기  (0) 2020.08.20
[VBA] 엑셀 그림 위치 구하기  (0) 2020.08.11
[VBA] 사용자 정의 함수 만들기(sum함수)  (0) 2019.12.28

이번 시간에는 파이썬을 이용하여 한글파일 내에 특정 문자열를 찾아 바꾸도록 해보겠습니다.

 

 

 

위 그림에서 보듯이 111.hwp 한글문서 내용입니다.

 

별 내용은 없고 여기에서 '박지성'이라고 표시된 문자열을 '손흥민'으로 바꾸어 보겠습니다.

 

코딩내용입니다.


먼저 파이썬 파일내에 한글을 쓰기 위한 구문을 추가합니다.

 

#_*_coding:cp949_*_

 

그리고 아래 문구를 한글 액티브액스(open API)를 불러오기 위하여 써줍니다.

 

import win32com.client as win32
hwp=win32.gencache.EnsureDispatch("HWPFrame.HwpObject")

 

그리고 111.hwp 한글파일을 열어줍니다.


hwp.Open('e:\\한글\\111.hwp',"HWP","forceopen:true")

 

그리고 모두 찾아 바꾸기를 하기 위해 명령은  "AllReplace"를 써줍니다.

 

hwp.HAction.GetDefault("AllReplace", hwp.HParameterSet.HFindReplace.HSet);

 

찾아 바꾸기에서 세부내용을 셋업해줘야 하는데요

 

"FindString" 속성에 찾을 문자열을 "ReplaceString" 속성에 새 문자열을 넣어줍니다.

 

option=hwp.HParameterSet.HFindReplace
option.FindString = "박지성"
option.ReplaceString =
"손흥민"

 

한글 파일에서  Ctrl+F 를 치면 나오는 대화상자에 아래와 같이 해주는 동작과 같습니다.

그리고 명령실행 시 "진짜 바꾸겠습니까?" 라든지 "총 12번 바꿨습니다" 라는 메시지 상자가 나오는데

 

이를 무시하기 위하여 아래 명령을 써줍니다.

 

option.IgnoreMessage = 1

 

그리고 실행해줍니다. 실행되면서 박지성이 손흥민으로 바뀝니다!!

 

hwp.HAction.Execute("AllReplace", hwp.HParameterSet.HFindReplace.HSet);

 

그리고 저장을 해주고 한글프로그램을 닫습니다. 끝~


hwp.Clear(3)
hwp.Quit()

 

수정된 한글파일을 다시 열어보면 짠~ 박지성이 손흥민으로 바뀌어져 있네요!!

 

보시고 궁금한 내용이 있으시면 댓글 부탁드립니다.

 

감사합니다.

 

 


#_*_coding:cp949_*_
import win32com.client as win32
hwp=win32.gencache.EnsureDispatch("HWPFrame.HwpObject")
hwp.Open('e:\\한글\\111.hwp',"HWP","forceopen:true")
hwp.HAction.GetDefault("AllReplace", hwp.HParameterSet.HFindReplace.HSet);
option=hwp.HParameterSet.HFindReplace
option.FindString = "박지성"
option.ReplaceString = "손흥민"
option.IgnoreMessage = 1
hwp.HAction.Execute("AllReplace", hwp.HParameterSet.HFindReplace.HSet);
hwp.Clear(3)
hwp.Quit()

 

이번 시간에는 VBA로 사용자 정의 함수(user defined function) 을 만들어 보도록 하겠습니다.

 

엑셀을 사용하다 보면 기본적으로 많이 쓰는 함수가  sum 함수입니다.

 

이것들은 엑셀에서 기본적으로 제공해주는 함수인데요

 

VBA를 통하여 똑같은 기능을 하는 함수를 따로 만들 수 있습니다.

 

이것을 더 응용해서 자신에게 맞는 함수를 만들 수도 있겠죠


 

sum 함수를 만들기 위해서는 먼저 엑셀을 실행하시고 Alt + F11을 누르시면

 

아래와 같은  VBA 편집창이 나오는데요

 

 

 

여기서 메뉴 => 삽입 => 모듈을 클릭하시면 왼쪽에 모듈에  Module이 생성됩니다

 

모듈을 더블클릭 하시면 오른쪽에 코드를 작성할 수 있는 편집창이 하나 뜨게 되는데요

 

여기에서 우리 원하는 함수를 작성해 주시면 됩니다.


우선 함수를 만든다고 선언을 해줍니다.

 

함수 이름은  sumsum이라고 짓겠습니다.

 

인수는 range 형태로 rng 변수로 받습니다.(예를 들어 "a1:b10" 을 인수로 받게 되는 것입니다.)

 

Function sumsum(rng As Range)

 

처음 합은 0이므로


sum1 = 0

 

c 라는  range 형의 변수를 선언해줍니다.


Dim c As Range

 

그리고 아까전에 인수로 받았던  rng 의 영역에 대해서 모든 셀의 내용을 sum1  변수에 더합니다.

 

For Each c In rng
       sum1 = sum1 + c.Value
Next c

 

그리고 sumsum 변수에 sum1을 대입합니다. 함수이름에 변수를 넣는것은 해당 값으로 함수를 리턴하라는 이야기입니다.

 

따라서 rng 영역에 있는 모든 값을 더해서 리턴이 되는겁니다.


sumsum = sum1

 

함수 끝..


End Function

 

VBA 편집창을 나와서 엑셀에서 sumsum 함수가 잘 돌아가는지 테스트를 해보면....

 

 

 

선택된 영역의 숫자의 합 10이 제대로 나오는 것을 확인 할 수 있습니다!!

 

sum 뿐만 아니라 사용자가 원하는 함수를 만들 수가 있겠지요

 

궁금하신 사항이 있으시면 댓글로 남겨주세요

 

감사합니다.

 

 


Function bb(rng As range)
sum1 = 0
Dim c As range
For Each c In rng
    sum1 = sum1 + c.Value
Next c
bb = sum1
End Function

'엑셀 > VBA' 카테고리의 다른 글

[VBA] 엑셀 그림 일괄 저장하기  (0) 2020.08.20
[VBA] 엑셀 그림 위치 구하기  (0) 2020.08.11
[VBA] 명단에 사진 자동으로 넣기  (0) 2020.07.02

파이썬으로 한글파일을 조작하는 프로그램을 만들어보도록 하겠습니다.

 

먼저 이번 시간에는 한글파일을 열어서 프린트하는 간단한 프로그램입니다.

 

한글파일을 다루려면 먼저 win32com 라이브러리를 불러와야 합니다.

 

win32com은 파이썬에서 ActiveX 를 연결해주는 라이브러리인데요

 

이를 통하여 한글뿐만 아니라 엑셀도 조작이 가능합니다.(추후에 관련 글에서 설명하도록 하겠습니다.)

 

win32com 라이브러리는 pywin32라는 프로그램을 따로 설치해주셔야 이용이 가능한 라이브러리입니다.

 

구글이나 네이버에 'python win32com' 검색하시면 설치하시는 방법이 나오니 따라해주시면 됩니다.

 

관련 블로그 링크입니다. 참고하셔서 설치해 주세요.

 


다음으로 소스코드를 분석해보겠습니다.

 

import win32com.client as win32

 

win32com의 client 모듈을 win32 이름으로 불러왔습니다.

 

그럼 다음에 해야할 일은 한글 ActiveX를 읽어오는 겁니다.

 

음... 한글을 읽어오기 위해서는 한글 프로그램이 먼저 해당 PC에 깔려 있어야 합니다.

 

hwp=win32.gencache.EnsureDispatch("HWPFrame.HwpObject")

 

그러면 hwp 이름으로 한글을 조작할 수 있습니다.

 

그리고 읽어오고 싶은 한글파일 경로를 적어주시고 옵션에는 강제열기로 설정해줍니다.

 

C드라이브에 111.hwp파일이 있다고 하면


hwp.Open('c:\\111.hwp', "HWP", "forceopen:true")

 

그리고 프린트를 해야겠지요

 

hwp.HAction.GetDefault("Print", hwp.HParameterSet.HPrint.HSet)

 

이것은 프린트를 하겠다는 명령을 가져온겁니다.

 

그리고 해당 명령(프린트)를 실행해 줍니다.

 

hwp.HAction.Execute("Print", hwp.HParameterSet.HPrint.HSet)

 

프린트했으니 한글을 종료해야겠죠?


hwp.Quit()

 

이상으로 파이썬으로 한글파일을 읽어서 프린트하는 법을 알아보았습니다

다음 시간에는 한글파일 내의 특정 문구를 찾아 자동으로 바꿔주는 프로그램을 만들어 보겠습니다

보시다가 궁금하신 사항은 댓글로 남겨주세요

감사합니다


소스코드

import win32com.client as win32
hwp=win32.gencache.EnsureDispatch("HWPFrame.HwpObject")
hwp.Open('c:\\111.hwp', "HWP", "forceopen:true")
hwp.HAction.GetDefault("Print", hwp.HParameterSet.HPrint.HSet)
hwp.HAction.Execute("Print", hwp.HParameterSet.HPrint.HSet)
hwp.Quit()

+ Recent posts