VBA를 통한 이미지 삽입 (저장할 수 있는!)

학습/엑셀 VBA|2014. 4. 2. 22:46
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

VBA를 통해서 이미지 삽입 시, 많이 사용하는 LoadPicture를 사용한다.


하지만 해당 LoadPicture()를 사용할 경우, 2010 버전 이후에서는 이미지Link가 되고, 

파일 저장 시, 이미지가 함께 저장되지 않는다.


그래서 다른 사람들에게 전달하거나 정리하기에는 알맞지 않은 함수;;


그래서 다른 함수를 찾은 것이 AddPicture 함수가 있다.


해당 함수를 사용하면 이미지를 호출하고 저장할 수 있다.




용법:


Shapes.AddPicture(파일명, 파일연결 여부 , 그림을 문서와 저장 여부 

                             , X좌표 , Y좌표, 이미지 높이, 이미지 넓이)


실제 사용 시.


    dim r위치

    set r위치 = Range("Sheet1!A1")


    iLeft = r위치.Left

    iTop = r위치.Top

    Set s = Worksheets(sSheetName).Shapes.AddPicture(sFileName, False, True, iLeft, iTop, 51, 51)


시트1에 A1위치에 이미지를 삽입하는 방법이다.


댓글()

VBA에서 현재 보고 싶은 시트를 확인할 때.

학습/엑셀 VBA|2014. 2. 8. 10:59
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

workbook.ActiveSheet 을 이용하면 된다.



현재 시트의 이름을 확인하는 예제.

MsgBox "The name of the active sheet is " & ActiveSheet.Name



댓글()

엑셀 VBA 폴더 여부 확인

학습/엑셀 VBA|2012. 11. 15. 19:38
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
오랫만에 글을 쓰네요

VBA에서 폴더가 있는지 없는지 여부를 알려면!!!!


Dir 기능을 사용하면 된다.


  Dir("폴더 경로",vbDirectroy)   '폴더 경로에 폴더가 있으면! 폴더명을 리턴하고, 없으면 ""값을 리턴한다. 



만약 C:\Err 란 폴더에 파일을 복사하고 싶은데.. 폴더가 있는지 없는지 모르겠다면 아래와 같이 작업하면 된다.


 if (Len(Dir("C:\Err",vbDirectroy)) <= 0 )

'폴더가 없다는 이야기입니다. 폴더를 생성하죠

MkDir("C:\Err")

end if




Dir 펑션은 그저 폴더만 아니라 각종 파일 형태를 확인할 수 있습니다.

뒤에 옵션을 수정해서 사용하시면 됩니다.

옵션은 아래와 같습니다.



 Constant

 설명 
 vbnormal  Default. Specifies files with no attributes.
 vbReadOnly  Specifies read-only files in addition to files with no attributes.
 vbHidden  Specifies hidden files in addition to files with no attributes.
 vbSystem  Specifies system files in addition to files with no attributes.
 vbVolume  Specifies volume label; if any other attribute is specified, vbVolume is ignored.
 vbDirectory  Specifies directories or folders in addition to files with no attributes.
 vbArchive File has changed since last backup.
 vbAlias File has a different name.



더 상세한 내용은 msdn을 참조


http://msdn.microsoft.com/en-us/library/dk008ty4(v=VS.71).aspx



댓글()

엑셀 VBA 속도 향상! (서식계산 옵션 VBA로 변경하기)

학습/엑셀 VBA|2011. 12. 23. 17:11
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
오랫만에 글을 남기네요;;

VBA로 데이터를 자동으로 기록 수정하는 것들을 할 때마다 여러개의 값을 변경하는 경우들이 생깁니다.

그럴 경우에는 FOR문을 막 돌리면서 시트의 데이터를 수정하게 되지요

근데... 문제는 시트에 수식이 걸려져 있을 경우 엄청나게 느려진다는 것입니다!

그럴 경우에는 아래처럼 옵션 변경을 이용하세요.

'함수 시작부분에는...
Application.Calculation = xlCalculationManual

'끝날 때에는
Application.Calculation = xlCalculationAutomatic


위의 내용은 엑셀의 자동 수식 계산을 껏다가 다시 키는 옵션입니다.
이런 옵션을 키면 왜 빨라지느냐?

엑셀에서 수식자동 계산 옵션이 켜져 있을 경우에 
데이터가 하나 변경되게 되면, 거기에 연결된 모든 수식 테이블을 다시 계산하도록 합니다.

그런데.. VBA로 각 값을 하나씩 수만번 되돌리면서 고치고 있다면...
거기에 연결된 수식들도 다시 수만 번 반복하고 있다는 이야기지요;;;

그러니깐 함수를 이용하기 전에 잠시 옵션을 껏다가 다시 키는겁니다.

>ㅁ</ 전 이거 몰라서 매일 옵션을 서식 수동 계산으로 해놓고 쓰고 있었죠;;;

그러다가 실수로 옵션이 변경되면...... WHAT THE FUCK!!!

ㅎㅎ 함수마다 위의 옵션을 붙여놓으면 그런 일은 벌어지지 않겠죠.  :)



댓글()

엑셀 오늘 날짜 기록

학습/엑셀 VBA|2011. 7. 13. 13:44
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

엑셀에서 오늘 날짜를 알고 싶을 때!

=Today() 라고 입력하면 된다.

VBA를 이용해서 오늘 날짜를 기록하고 싶을 때에는 아래와 같은 방법을 쓰면 된다.

Range("A1").Value = Date
Range("B1").Value = Time

Date와 Time은 현재 시간과 날짜를 반환해 주는 함수다~
Time은 시간 변경도 할 수 있는데, 변경을 하면 컴퓨터의 시간이 변경된다.

VBA로 수정할 때마다 각각의 버젼을 기록하게 하여 관리하는 방법으로 주로 사용하면 편리하다~
(뭐 저장할 때마다 기록한다던지...)

댓글()

엑셀 셀 서식이 많습니다.!!

학습/엑셀 VBA|2011. 6. 28. 12:54
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

해결 방법!
VBA를 하실 줄 아신다면 아래 코드를 이용하면 대부분 해결됩니다.
(모르시는 분은.. 흠...... 나중에 스샷이라도 찍어서 올려, 사용할 수 있게 해드릴께요;;)


    Dim n As Integer, yn As Byte
    On Error Resume Next
    Dim iCnt
    Dim i
    For n = ActiveWorkbook.Styles.Count To 1 Step -1
        If Not (ActiveWorkbook.Styles(n).Name = "Normal") Then
            ActiveWorkbook.Styles(n).Delete
        End If
    Next


하지만 위의 경우를 복사해서 사용하면 계속 먹통이 되는 경우도 있지요....
(그럴 땐 CTRL + BREAK 키를 이용하세요...)

이럴 땐 아래 코드를 이용해보세요..
 
    Dim n As Integer, yn As Byte
    On Error Resume Next
    Dim iCnt
    Dim i
    iCnt = ActiveWorkbook.Styles.Count
    For i = 0 To iCnt
        If Not (ActiveWorkbook.Styles(i).Name = "Normal") Then
            ActiveWorkbook.Styles(i).Delete
        End If
    Next i

뭐... 위와 거의 비슷하지만.. 조금 강제적인게 달라서..
그래도 시간이 오래갑니다.. 조금 기다리세요..




--왜 두번째 것을 해야하는가?!    라면...

처음 것은 스타일을 완전히 삭제할 때까지 진행하는 것 같은데.. 절대 삭제되지 않는 스타일이 있어요..(기본 스타일 및 버그 걸린 스타일..) 이 때 이 것을 삭제하지 못하면서 무한 루프에 빠지는듯 합니다.
(정확한 것은 아닙니다. 예측일뿐..)
그래서 못 지우는 것은 넘기고.. 그냥 삭제하자 하는 것으로 코드를 살짝 바꾼게 두 번째 것입니다.
하지만 위에 것도 완전히 삭제하는 것은 아니기 때문에 두번째 코드를 한 2~3번 반복하신 후에..
첫번째 코드를 실행 하는 것을 추천드립니다.

--추가 설명
 delete는 지정된 것을 삭제하는데... 그럼 뒤에 것이 알아서 앞으로 당겨져 연결되는 stack 구조인듯 합니다. 하지만 i는 계속 상승하니깐 앞으로 당겨진 스타일은 삭제할 수 없게 되는거죠..(대신 삭제 못하는 것을 뛰어넘고 다른 것을 삭제할 수 있게 됩니다.)




위에 것들은 진행상황을 볼 수 없어서.. UserForm으로 제작한 것이 있어요..
아래 두 개의 파일을 받아 주시구요..(frx는 없어도.. 되려나??)
(헛;; 예전에 있던 것은 잘못된 거군요 .. 새로 업데이트 합니다;;)




받은 후에, 보기>매크로 를 눌러주세요.
그냥 아무 매크로 이름을 넣고 편집을 눌러주시면 VBA 창이 나타납니다.

삽입>파일
을 해주신 다음, 받은 파일을 열어주세요.

그럼 왼쪽에 프로젝트에서 '폼'이라고 추가가 되어 있을 거에요.
열어보시면 UserForm2가 추가되어 있을 것입니다.
클릭해 보시면 이상한 모양의 팝업창이 떠 있을 거에요.
이후 상단의 녹색 ▷ 버튼을 눌러보세요.
ㅋㅋ 그럼 아까 보였던 팝업창이 나타날 것입니다.
그럼 '1단계 강제 삭제' 버튼을 2~3번 눌러주시고.
이후 '2단계 강제 삭제' 버튼을 눌러주시면 모든 스타일 완전히 삭제할꺼에요. ㅎㅎ
(이렇게도 안되는 경우가 있는데... 그 땐.. 어떻카죠 ;ㅁ; 잘 모르겠어요..)

우와 힘들군요.. 스샷이라도 첨부하면 좋겠지만.. 귀찮으니 패스...
(그럴 일은 없겠지만...)댓글이라도 달리면 나중에 추가 수정하죠..
뭐 알아들을 사람들은 아무렇게나 써도 알아들을테니.. 필요 없으실꺼구요 ㅎㅎ




댓글()

엑셀 VBA로 이미지 파일 읽어서 붙이기!!!

학습/엑셀 VBA|2011. 6. 8. 12:29
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

엑셀로 이미지 파일을 관리하기 위해서
새로운 이미지를 불러올 필요가 있다.
이 때에는 아래와 같은 VBA 함수를 이용할 수 있다.. >ㅁ<b

    Dim picTemp
    Dim sPicPath

    Set picTemp = ActiveSheet.Pictures.Insert(sPicPath)

위와 같이 실행하면 현재 위치하는 셀에 이미지가 들어간다!!!
아..만약 현재 셀에 딱 맞게 이미지를 넣고 싶다면, 아래의 코드를 추가하자.
현재 자신의 셀 크기에 맞게 이미지를 수정해 주는 것이다.
    
    picTemp.Width = ActiveCell.Width - 2
    picTemp.Height =ActiveCell.Height - 2
    picTemp.Top = ActiveCell.Top + 1
    picTemp.Left = ActiveCell.Left + 1

-추가 내용-
이렇게 하면 계속 Picture가 추가되어서 문제 될 수 있다.
이럴 때엔 그림을 한 번에 날려줄 수 있는 코드가 있다!

    ActiveSheet.Pictures.Delete

모두 다 날리니깐... 주의하자!


댓글()

엑셀 VBA를 이용해서 다른 프로그램 실행시키기

학습/엑셀 VBA|2011. 5. 16. 09:33
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.


Excel VBA를 이용해서 다른 외부 프로그램을 실행시키는 법입니다.

아래와 같이 따라하면 간단!

------------------------------------------------------
sProgPath = "D:\TestPorg.exe"                  '실행시킬 파일 경로입니다.
Proc = Shell(sProgPath, vbNormalFocus)     '파일 실행!!
------------------------------------------------------



실행과 동시에 어떤 파일을 읽어드리는 작업을 하고 싶다하시면 아래와 같이 해주세요.
'notepad로 테스트 텍스트 파일을 읽고 싶다' 할 때는 아래와 같이 해주세요.

---------------------------------------------------------
sProgPath = "notepad.exe"       '실행시킬 파일 경로입니다.
sFileName = "test.txt"                      '실행할 파일입니다.
sFilePath = "D:\"                            '실행할 파일 경로입니다.

Proc = Shell(sProgPath & sFilePath & sFileName, vbNormalFocus)
---------------------------------------------------------



엑셀로 작업하면서 외부 툴을 열거나 오픈할 때에 귀찮으므로
따로 버튼들을 만들어 놓고 누를 때마다 열리게 하면
좀 더 파일을 쉽게 관리할 수 있어요

아래와 같이 특정 셀 영역을 참조하게 해서 열리게 하는 것도 편리하죠!

----------------------------------------------------------
sProgPath = Range("ToolFilePath").Value()
sFilePath = Range("BinFilePath").Value() & "\"
sFileName = Range("BinFileName").Value()

Proc = Shell(sProgPath & sFilePath & sFileName, vbNormalFocus)
----------------------------------------------------------

댓글()

[엑셀]VBA를 이용해서 Text 파일 읽기 (UTF-8 파일 읽기)

학습/엑셀 VBA|2011. 5. 12. 15:41
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

VBA을 이용해서 Text 파일 (혹은 Xml등등)을 읽는 방법입니다.

보통 VBA의 FileSystem을 이용한 [Open / Close를 활용 한 방법이 있습니다. 
(구글링 및 네이버를 이용해서 쉽게 찾을 수 있습니다.)

하지만 FileSystem은 ASCII 형태로 저장이 되어 일부 프로그램에서 로드할 때 깨지거나,
문제점이 발생할 수 있습니다. 
(회사에서 UTF-8 형태로 모두 바꾸는 바람에 기록 방법을 바꾸어야 했어요 ㅠㅠ)

이 때에는 Stream을 이용해서 File을 읽을 수 있습니다.

'Stream의 생성

Dim stmFileControl As Stream       'Stream 인자 생성
Set stmFileControl = New Strem     'Stream 저장공간 배치

stmFileControl .Open
stmFileControl.Position = 0             '기록, 혹은 읽을 위치를 0으로 맞춘다.
stmFileControl.Charset = "UTF-8"                   '저장시 [UTF-8]로 읽거나 저장합니다.

'Stream에 파일 읽기

Stream.LoadFromFile("C:\Text.txt")
'C:\Text.txt에 파일을 읽겠다는 선언을 합니다.

sStr = LuaStream.ReadText()
'이전에 LoadFromFile로 선언한 C:\Text.txt에서 글자를 모두 읽어옵니다.

'Stream에서 파일로 저장


stmFileControl.SaveToFile "C:\Test.txt", adSaveCreateOverWrite
'C:\Test.txt에 저장(혹은 생성)하겠다는 것입니다.
'adSaveCreateOverWrite가 해당 옵션을 선택하는 것입니다. (다른 옵션도 있겠지만.. 확인하지 않았어요..

stmFileControl.Close
'stmFileControl을 닫습니다.


각 생성 및 소멸을 함수로 묶어서 만들면 편하게 사용할 수 있습니다. : )


--참고하세요!!--
Stream을 사용하려면
Microsoft ActiveX DataObject 2.8(이상)을 사용할 수 있어야 합니다.
VBA에서  [도구>참조] 를 눌러서 위의 라이브러리를 추가해주세요.

그냥 일반적으로 사용하는 Text형식은 아래와 같습니다.
stmFileControl.Charset = "euc-kr"                  '저장시 [euc-kr8]로 저장합니다.

-- UTF-8로 기록하는 방법 --
http://it205.tistory.com/entry/VBA에서-Text-파일-저장하기-UTF-8-로-저장하기

댓글()