엑셀 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] 디렉토리에서 파일 이름 리스트 가져오기!

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

가끔 엑셀에서 파일 이름 리스트를 가져올 필요가 있다.
(파일 관리라던가 버젼 관리라던가..)
그거 할 때 쓸만한 함수

Sub DirFileList()

Dim fileList() As String
Dim fName As String
Dim fPath As String
Dim i As Integer
Dim startrow As Integer
Dim ws As Worksheet
Dim filetype  As String

'셀에 항목으로 경로입력이 필요함을 통보
Range("C2").Select
fPath = "D:\Data\"
'셀에 항목으로 확장자입력이 필요함을 통보
filetype = "*"

 

startrow = 2    'starting row for the data
fName = Dir(fPath & "*." & filetype)

While fName <> ""
    i = i + 1
    ReDim Preserve fileList(1 To i)
    fileList(i) = fName
    fName = Dir()
Wend


If i = 0 Then
Range("F2").Select
    ActiveCell.FormulaR1C1 = "No Files Found!"
    Exit Sub
End If
For i = 1 To UBound(fileList)
    ws.Range("A" & i + startrow).Value = fileList(i)
Next
Columns(1).AutoFit

End Sub

다른 분이 만드신건데..
출처를 모르겠네요;;;
본 제작자 분이 보시거나 아시면 연락을;;;;

댓글()

Call과 ByVal

학습/엑셀 VBA|2011. 4. 20. 09:33
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
어떤 함수를 호출할 경우 인자 값이 필요한 경우가 있다.

Sub Func(iVal As Integar)

Print( iVal)
iVal = iVal + 3
Print(iVal)

End Sub

위의 함수를 호출할 경우

Call로 호출을 하면 iVal의 인자값이 함수 종료 후에 변경이 된다.
-_-;; 말이 어렵네요.. 어쨋던 C언어의 포인터처럼 인자가 연동이 된다는 것이다.

그러면... 혹시 하나는 연동하고 하나는 연동하고 싶지 않을 경우는 어떻할 것인가;;;

그럴 때에는 ByVal을 사용하면 된다.

ByVal은 해당 인자를 연동하지 않겠다는 것을 의미한다.

---
언제나 저 혼자 보기 위해서 쓰는 글입니다.
혹시나 질문이 필요하면 .... 댓글을 달아주세요;
뭐.. 사실 이건 잊어먹지 않기 위해서 쓰는 글입니다. 

댓글()

[엑셀]VBA에서 Text 파일 저장하기 (UTF-8 로 저장하기)

학습/엑셀 VBA|2011. 4. 19. 20:08
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에 기록

stmFileControl.WriteText("기록값을 String으로 넣습니다." & sString & " &로 묶어도 되요")

'Stream에서 파일로 저장

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

stmFileControl.Close
'stmFileControl을 닫습니다.


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


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

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

댓글()

엑셀 값만 복사하기! (VBA을 이용한 복사영역 조절)

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


엑셀을 사용하다가 복사를 하고 싶은데.. 서식이 언제나 같이 붙어서 다닌다.
특히 표를 만들어 두었는데 표의 테두리가 같이 따라오는 것이 영 불편하다..
뭐... 핫키를 이용해서 사용할 수도 있고, 붙여넣기 옵션이 있지만..



영 불편하다..

그래서 VBA으로 복사영역을 따오고.. 값만 현재 선택한 셀에 붙여넣기 하려고 Script를 작성했다.


Sub CopyValues()

ActiveCell.PasteSpecial Paste:=xlPasteValues, Operation:=xlPasteSpecialOperationNone, SkipBlanks:=True

End Sub

ActivCell은 현재 선택된 Cell을 의미하고
PasteSpecial은 복사영역을 가져온다

그냥 복사하기 위해서는
Active.PasteSpecial를 사용하면 된다.

그래서 옵션으로

Paste:=xlPasteValues 값을 지정하게 된다.
그러면 값만 복사해주게 된다.

뭐.. 그냥 편히 쓰고 싶으시면 위의 매크로를 Copy&Paste하시고,
매크로를 등록하고 Ctrl + B 정도의 핫키를 쓰시면 됩니다.
(다만 사용시에 복사영역이 없을 경우에는 오류를 출력합니다;;)

==아래는 조사하면서 알게 된 PasteSpecial의 매개변수이다. ==

Paste
붙여넣을 값을 정의하는 부분이다.

xlPasteAll
xlPasteColumnWidths
xlPasteComments
xlPasteFormats
xlPasteFormulas
xlPasteFormulasAndNumberFormats
xlPasteValidation
xlPasteValues
xlPasteValuesAndNumberFormats
xlPasteAllExceptBorders
msdn 설명글 주소
http://msdn.microsoft.com/ko-kr/library/microsoft.office.interop.excel.xlpastetype(VS.80).aspx

Operation
붙여넣기할 때 하는 작업 방식이다.
xlPasteSpecialOperationAdd
xlPasteSpecialOperationDivde
xlPasteSpecialOperationMultiply
xlPasteSpecialOperationNone
xlPasteSpecialOperationSubtract
msdn 설명글 주소
http://msdn.microsoft.com/ko-kr/library/microsoft.office.interop.excel.xlpastespecialoperation(VS.80).aspx

SkipBlanks
복사해서 넣을 때 빈 셀을 같이 붙여 넣을 경우 True, 아닐 경우 False
(빈 셀을 클립보드에 포함할지 아닐지를 결정하는 옵션)

Traspose
범위를 붙여넣을 때에 행과 열을 바꾸면 True, 아닐 경우 False



---
각 옵션들의 설명은 나중에 추가로 포스팅하겠습니다.
일단은 msdn을 확인해보시길...


댓글()