My/Job (개인작업물)

[VBA] VBA , 매크로 신규 제작

알찬돌삐 2007. 2. 13. 19:49
회사 업무에 필요해서 만들게 되었음.
굳이 VB 로 실행화일을 만들 필요도 없을것 같고.......
무엇보다 회사에서 사용중인 내 컴에는 Visual Basic 라이센스가 없다는거 .....ㄷㄷㄷㄷㄷㄷㄷ
ㅋ_ㅋ.
그래서 VBA 로 -_-;


[ 뭐, 매크로 등록하는건 똑같져.....뭐~~. 도형그려서 매크로 연결하고 ^^. ]




[ 파일 객체를 사용합니다. 파일 선택 버튼 클릭시 파일 open 다이얼로그를 띄우고 해당 파일의 존재유무 체크후
오픈합니다.]

-- 파일 다이얼로그
Dim FileDlg As FileDialog
  ' 파일 오픈 다이얼로그를 선언합니다.
  Set FileDlg = Application.FileDialog(msoFileDialogOpen)
  ' 다이얼로그 경로를 지정합니다.
  ' 현재 엑셀파일을 연 경로로 지정하려면 FileDlg.InitialFileName = ThisWorkbook.Path 으로 하면 됩니다.
  FileDlg.InitialFileName = ""
  ' 파일다이얼로그 필터를 초기화하고 엑셀파일만 보이도록 필터를 등록합니다.
  FileDlg.Filters.Clear
  FileDlg.Filters.Add "엑셀 파일", "*.xls"
  FileDlg.Show
If (FileDlg.SelectedItems.Count = 0) Then Exit Sub  ' 선택된 파일이 없다면 종료
    If (FileDlg.SelectedItems.Count > 1) Then
    MsgBox "하나의 파일만 선택해 주세요"
    Exit Sub
    End If
   
    ' 텍스트박스에 파일 경로를 넣어둔다.
    TextBox1.Text = FileDlg.SelectedItems(1)
    Set FileDlg = Nothing

-- 파일을 오픈할때 파일이 존재하는지 확인
Function File_exists(ByVal Filename As String) As Boolean
   
    If (Len(Dir(Filename)) <> 0) Then
    File_exists = True
    Else
    File_exists = False
    End If
   
End Function

위 함수를 호출하여 사용한다. ㅋㅋ php 랑 함수명 같게 만들었다.
사용법은 File_exists(파일이존재하는경로) 리턴값은 True 와 False 이다.

-- 파일을 오픈하자.
Dim WrkBook as Workbook
Set WrkBook = Application.Workbooks.Open(파일경로, 0, True)
WrkBook.Close savechanges:=False
Set WrkBook = Nothing
파일을 오픈할때 업데이트나 링크된 파일 확인 여부를 띄우지 않고 오픈한다.
파일을 저장하지 않고 닫는다.

-- 화면 초기화는 어떻게??
Dim Rngtarget as Range
Set Rngtarget = Application.ActiveWorkbook.ActiveSheet.Range("1:65536")
Rngtarget.Clear
Set Rngtarget = Nothing

-- 데이터는 어떻게 가져올것인가?
기존에는 파일을 오픈한후 각각의 셀과 다른 워크시트의 셀값을 비교하였으나.
이럴 경우 시간지연이 굉~~~~~~~장히 발생하더라구여~~
파일을 다섯개 열어서 작업할 경우. 컴터 뻗은지 알았음 --;;;;

' 동적 배열로 선언
Dim ArrayStr() as String
Dim intTmpTotal as Integer
' 해당 엑셀파일의 첫번째 시트
' 전체 문서의 맨 마지막 셀에 위치한 데이터의 위치를 가져온다
intTmpTotal = Application.Workbook.Worksheets(1).Range("A65536").End(xlUp).Row
' 배열의 크기 재선언
Redim ArrayStr(intTmpTotal)
이와 같은 작업을 수행한후.
따로 실제 데이터가 몇개나 들어갈 것인지 루프를 돌면서 저장될 배열의 크기를 따로 체크하는것이 낫다
배열의 크기를 줄여주기 위해서.
그러한 작업을 수행한 후 배열안에 든 데이터는 그대로 두고 배열의 크기를 재정의한다.
ReDim Preserve 을 사용하지 않고 Redim 구문만 사용할 경우 배열에 든 데이터가 사라진다.
ReDim Preserve ArrayStr(실제배열의갯수)



대충 이러한 작업을 거친다 ^^..