Skip to content

기글하드웨어기글하드웨어

인터넷 / 소프트웨어 : 윈도우즈, 리눅스, 기타 운영체제, 각종 어플리케이션, 프로그램, 소프트웨어, 인터넷, 인터넷 서비스에 대한 이야기, 소식, 테스트, 정보를 올리는 게시판입니다.

Extra Form

어제 다음과 같은 프로그램을 짰더랬습니다.
https://gigglehd.com/gg/soft/379801
 

근데 자고 나서 일어나서 생각해 보니, 이 프로그램으로 원하는 파일을 찾는 건 좀 불편할 거란 생각이 들더군요. 그래서 좀 뜯어고치다가, 어째 잘 되지가 않아서 아예 갈아엎고 새로 원하는 대로 만들어 버렸습니다. 새 프로그램은 전처리 파일을 만들 필요 없이, 프로그램 내에서 디렉터리를 지정하면 자체적으로 DWG 파일을 찾게끔 바꾸었습니다.
 

새로 짠 프로그램은 다음과 같습니다.

Option Explicit

'전역 변수 설정.
Public dwgList As Collection

Sub main()
'필요 변수 등 설정.
    Dim dwgName As Variant
    Dim i As Long: i = 0
    Dim readOnly As Boolean: readOnly = True
    Dim fileSystem As Object
    Dim hostFolder As String
    Dim outputFile As String
    Dim findingText As String
    Dim textList As Collection
    Set dwgList = New Collection '프로그램 시작 초기화
    
'프로그램 작동 설정.
    hostFolder = "T:\"
    outputFile = "T:\DWGfindResult.txt"
    findingText = "ASDF"

' 직접실행 창에 작업 시작을 알린다.
    Debug.Print "작업 1단계 개시."

' 각 디렉터리와 그 서브 디렉터리를 재귀적으로 순회한다.
    Set fileSystem = CreateObject("scripting.filesystemobject")
    doFolder fileSystem.getfolder(hostFolder)

' 직접실행 창에 작업 2단계 시작을 알린다.
    Debug.Print ""
    Debug.Print "작업 2단계 개시."

' 순회가 끝나면 경로 컬렉션의 모든 DWG 파일을 하나씩 열기 시작한다.
    For Each dwgName In dwgList
        Set textList = New Collection '초기화 - 버그 방지!

' 진행상황 파악을 위해 직접실행 창에 전체 DWG 파일 갯수와 _
' 현재 열고 있는 DWG 파일 순서를 분수로 출력한다.
        i = i + 1
        Debug.Print i & " / " & dwgList.Count

        On Error Resume Next '오류 발생시 넘어감
        AutoCAD.Documents.Open dwgName, readOnly

' DWG 파일의 모든 텍스트 중 원하는 것이 있는지 찾는다.
' 원하는 텍스트가 포함된 텍스트 데이터를 텍스트 컬렉션에 추가한다.
        Set textList = dwgTextFind(findingText)

' 만약 텍스트 컬렉션의 카운트가 1 이상이면 현재 열린 파일명과 텍스트 컬렉션의 _
' 모든 내용을 직접실행 창에 출력하고, 동시에 지정된 텍스트 파일에 추가한다.
        If textList.Count Then
            resultOutput outputFile, dwgName, textList
        End If

' 열린 DWG 파일을 닫는다.
        AutoCAD.Documents.Close

' 모든 DWG 파일에 이 작업을 반복한다.
    Next
End Sub

Sub doFolder(folder)
'각 디렉터리와 서브 디렉터리를 재귀적으로 순회하기 위한 서브루틴.
    On Error Resume Next '오류 발생시 다음 폴더로 넘어감.
    
    Dim subFolder As Variant
    For Each subFolder In folder.subfolders
        doFolder subFolder
    Next
    
' 순회 과정에서 DWG 파일이 발견되면 경로 컬렉션에 경로를 추가한다.
    Dim file As Variant
    For Each file In folder.Files
        If LCase(file.Name) Like "*.dwg" Then
            dwgList.Add file.Path
            Debug.Print file.Path '화면에 출력
        End If
    Next
End Sub

Function dwgTextFind(findingText) As Collection
'DWG 파일 내의 모든 텍스트에서 원하는 부분이 있는지 찾아, _
'조건이 맞는 모든 텍스트를 모은 컬렉션을 반환한다.
    Dim mSpaceObj As AcadObject
    Dim item As Variant
    Dim text As String
    Dim result As New Collection '한번에 선언 및 생성 - 초기화
    
    For Each item In ThisDrawing.ModelSpace
        On Error Resume Next '텍스트 스트링이 없으면 그냥 지나감
        text = "" '초기화
        Set mSpaceObj = item
        text = mSpaceObj.TextString
        If InStr(LCase(text), LCase(findingText)) Then '대소문자 구분하지 않음!
            result.Add text
        End If
    Next
    
    Set dwgTextFind = result
End Function

Sub resultOutput(outputFile, dwgName, textList)
'출력할 텍스트 파일명과 출력할 내용들을 받아서 _
'현재 열린 파일명과 검색된 스트링을 화면과 텍스트 파일에 출력하는 서브루틴.
    Dim fileNum As Integer
    Dim item As Variant
    
    fileNum = FreeFile()
    Open outputFile For Append As #fileNum '텍스트 파일을 추가 모드로 연다.
    
    Debug.Print dwgName
    Write #fileNum, dwgName
    
    For Each item In textList
        Debug.Print Chr(9) & item
        Print #fileNum, Chr(9); item
    Next
    
    Debug.Print "" '마지막에 빈 줄 추가
    Write #fileNum,
    Close #fileNum
End Sub

네. 이 프로그램은 잘 작동합니다. 적어도 제가 테스트한 한도 내에서는 말이죠.
하지만 왠지 제 실력 때문인지 뭔가 자꾸 부족하다는 생각이 드는군요. 굳이 dwgList를 전역으로 쓸 필요가 있었을까? 오류 처리는 어떻게 하는 것이 더 좋을까? main 프로시저는 정말 저게 최선인가? 더 모듈화할 수 있지 않았을까? 이런 생각이 자꾸 드네요.
 

그래서 질문드립니다. 이 프로그램에서 부족한 부분은 무엇이고, 어떤 식으로 수정하는 것이 좋을까요? 여러분의 고견을 기다리겠습니다.




작성된지 4주일이 지난 글에는 새 코멘트를 달 수 없습니다.


  1. 등록된 글이 없습니다.
목록
Board Pagination Prev 1 ... 64 65 66 67 68 69 70 71 72 73 Next
/ 73

최근 코멘트 30개
냥뇽녕냥
02:49
ExpBox
02:36
포인트 팡팡!
02:25
아이들링
02:25
아이들링
02:06
아이들링
01:53
아이들링
01:51
스와마망
01:41
스와마망
01:37
스와마망
01:35
PAIMON
01:32
PAIMON
01:31
아스트랄로피테쿠스
01:24
ExpBox
01:22
360Ghz
01:21
투명드래곤
01:20
ExpBox
01:20
까마귀
01:19
ExpBox
01:18
아이들링
01:13
포인트 팡팡!
01:07
MUGEN
01:07
빈도
01:04
아이들링
01:01
까마귀
00:59
아이들링
00:50
이수용
00:47
조마루감자탕
00:46
노코나
00:40
노코나
00:38

AMD
한미마이크로닉스
MSI 코리아
더함

공지사항        사이트 약관        개인정보취급방침       신고와 건의


기글하드웨어는 2006년 6월 28일에 개설된 컴퓨터, 하드웨어, 모바일, 스마트폰, 게임, 소프트웨어, 디지털 카메라 관련 뉴스와 정보, 사용기를 공유하는 커뮤니티 사이트입니다.
개인 정보 보호, 개인 및 단체의 권리 침해, 사이트 운영, 관리, 제휴와 광고 관련 문의는 이메일로 보내주세요. 관리자 이메일

sketchbook5, 스케치북5

sketchbook5, 스케치북5

나눔글꼴 설치 안내


이 PC에는 나눔글꼴이 설치되어 있지 않습니다.

이 사이트를 나눔글꼴로 보기 위해서는
나눔글꼴을 설치해야 합니다.

설치 취소