엑셀 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로 이미지 파일 읽어서 붙이기!!!

학습/엑셀 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)
----------------------------------------------------------

댓글()

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을 확인해보시길...


댓글()

VBA에서 엑셀 함수 이용하기.

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

VBA 쓰다가 가끔씩 필요한 함수들이 있기 마련이다
근데 엑셀에서 함수로는 기억이 나는데.. VBA은 어떤거지 라고 의문이 날 때가 있다.


-_- 그 때마다 공간 하나에 함수를 쓰고 가져오는 방법도 쓰지만..
Exam>


Range("B1").FormulaR1C1 = "=SUM("A:A")"  .. 뭐 이런식??으로 쓰고
Range("B1").Value                                    이런 식으로 값을 가져오는 방법..


하지만 그 보다  간단하고 좋은 방법이 있다.


dim fSum as SIngle
fSum =Evaluate("=SUM(A:A)")


부왘!
이렇게 그냥 바로 Evaluate를 사용하면 된다!


다른 방법으로...


Application.WorksheetFunction.sum()...
Application.WorksheetFunction.Acos()...
Application.WorksheetFunction.pi()...


처럼 Application의 Function으로 바로 접근하는 법도 있지만.. Excel함수를 바로 사용하는게 아니라서.. 익숙치 않아 힘들 때가 있으니깐.... 잘 안쓰게 되더라..


뭐 그렇다는 겁니다...


*반말 표현이나 상스러운 표현이 있더라도 이해해주세요 ㅠㅠ
*혼자 정리하기 위해서 쓰는 문서라서 그래요...

댓글()

엑셀 VBA를 이용한 파일 존재 유무 확인

학습/엑셀 VBA|2011. 3. 10. 14:43
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
엑셀 VBA를 이용해서 파일이 존재하는지 여부를 확인하는 함수를 만드는 방법입니다.

VBA를 열어서 아래와 같은 코드를 입력해 놓으면, 

=FileChk([파일명]) 을 이용해서 파일 여부를 확인할 수 있습니다.

------------------입력할 코드입니다. ------------------
Function FileChk(sFileName As String)
    Dim sChkFile As String
    
    sChkFile = Dir(sFileName)
    If (Len(sChkFile) > 0) Then
        FileChk = True
    Else
        FileChk = False
    End If
End Function
------------------------------------------------------

[파일명]에 해당되는 파일이 있을 경우에는 TRUE를 반환합니다.
(물론 없을 경우에는 FALSE)를 반환하지요.

IF문을 이용해서 다른 Text로 바꾸어 출력할 수도 있어요 ^^
=IF( FileChk([파일명]), "있음!", "없네요!")

아... 그리고 그냥 파일명만을 넣으면, 저장된 엑셀 파일과 같은 위치에 있는 파일만 체크합니다.
만약 다른 폴더에 있는 것을 검사하고 싶으시면,

C:\Text.txt 처럼 경로명까지 붙여주시면 됩니다.


댓글()