-추후 Addin으로 기능 업해서..배포예정
-혹시 제가 만든 기능들 쓰시는 분들은 고칠 부분이나 추가되야 할 부분 이야기좀 해주세요..


오래전 막 VBA를 시작하고...

엑셀 폴더에 있는 파일을 뿌려주는 vba를 봤었다...얼마나 신기했던지...

이 기능이 없었음 아마 몇시간을..파일이름들을 보며 직접 치고 있었을 것이다..

이렇게 간단한 기능에..한가지 추가해서 이왕 이름까지 바꿔보자...
(지금 파일이름을 정리할 일이 있어서..)

그냥 이 기능만으로 만족하시고 쓰실수 있겠다 싶으신 분은 엑셀실행파일을 다운 하시고..

VSTO공부중이신 분은 소스파일을 다운 받으셔서 보면 됩니다.

엑셀실행파일 : 압축을 풀고 SetUp파일 실행 후 안에 있는 엑셀파일 실행시키면 됩니다.

소스파일 :



실행화면 1]폴더 가져오고 엑셀의 간단한 기능을 이용해서 변경파일 이름을 지정해준다.

실행화면 2]엑셀 기능을 사용해서 채우기..

실행화면 3] 파일 변환 누른후 화면

엑셀로 파일이름 관리를 할 경우 이점.
1. 간단한 함수 및  기능으로 원하는 이름으로 완변하게 변경을 할 수 있다..
2. 엑셀 파일 이름을 정리할 때 한번에 엑셀에 정리해주니 활용도가 높다..

이제 간단하게 파일관리기를 만들어 보자..

1. 아래와 같이 시트1에 간단한 모양을 만든다.


2. 작업을 할 요구사항을 몇개 적어보겠다..
- 간단히 VSTO하는 방법을 알려주는 거라..거창하게 이것저것 기능 안넣겠음)
- 이 기능만으로도 원하는 작업은 다 할 수 있을 것이며.. 추후에 Addin에 이 기능을 포함시킬것이다..

 가. 원본 파일명만 나오게 하기.(폴더 경로까지 나오면 너무 지저분하고 이름 바꾸기도 힘들다.)
 나. A5셀부터 파일명과 확장자명을 뿌려준다.
 다. B5셀부터 변경할 파일이름을 사용자가 적어서 변경할 수 있게 해준다.
 라. C5셀부터 변경여부를 표시해준다.

3. 폴더의 파일을 가져오기 해보자..

         private void btnGetFolder_Click(object sender, EventArgs e)
        {
            FolderBrowserDialog fld = new FolderBrowserDialog();
            this.Range["a1", missing].Value2 = "VSTO.Tistory.com";
            if (Convert.ToInt32(fld.ShowDialog()) == 1)
            {
                this.Range["b3", missing].Value2 = fld.SelectedPath;
                int i = 5;

                foreach (string c in Directory.GetFiles(fld.SelectedPath))
                {
                    this.Range["a" + i, missing].Value2 = c.Substring(c.LastIndexOf('\\') + 1);
                    i++;
                }
            }
        }


- if (Convert.ToInt32(fld.ShowDialog()) == 1) (선택한 폴더가 있을 경우에는)

- int i = 5; (A5셀부터 입력 할 것이므로)

- this.Range["b3", missing].Value2 = fld.SelectedPath;  (B3셀에 폴더경로를 넣어준다)

- foreach (string c in Directory.GetFiles(fld.SelectedPath)) (폴더경로의 파일이름들을 하나씩 c 에 넣는다)

- this.Range["a" + i, missing].Value2 = c.Substring(c.LastIndexOf('\\') + 1);  (아래 참고 확인)

- 그리고 다음 row로 이동을 하기 위해서 +1을 해준다.

참고

 
c의 값이  c:\test\1.txt라고 가정해보자..

우선 1.txt를 빼기 위해서는 뒤에서부터 \의 위치를 잡아줘야 한다..

그러기 위해서 우선 LastIndexOf('\\')로 위치를 잡아주고  \는 필요 없기 때문에 +1을 해준다.

1. LastIndexOf('\\')만 해줬을 경우 값 : 7(0부터 시작하므로)
2. SubString(7)로 했을 경우 아래와 같이 \1.txt가 나온다. (0~6까지 지우고 7번째를 뜻함.)
3. +1을 해줬을 경우 : \도 지워지기 때문에

1~3번까지를 더해주면 c.Substring(c.LastIndexOf('\\') + 1)와 같이 된다.
뭐 엑셀에서는 중첩함수들은 기본이니....중첩함수로 생각하시면 될듯..


4. 이젠 이름 바꾸기 코딩을 해보자.
             int i = 5;
            string filepath = this.Range["A1", missing].Text.ToString();
            while (this.Range["A" + i, missing].Value2 != null)
            {
                if (filepath != null)
                {
                    FileInfo fName = new FileInfo(filepath + "\\" + this.Range["A" + i, missing].Text.ToString());
                    if (fName.Exists && this.Range["B" + i, missing].Text.ToString().Length > 0)
                    {
                        fName.MoveTo(filepath + "\\" + this.Range["B" + i, missing].Text.ToString());
                        this.Range["C" + i, missing].Value2 = "성공";
                    }
                    else
                    {
                        this.Range["C" + i, missing].Value2 = "실패";
                    }
                }
                i++;
            }

- 이번에는 While 조건문을 바꿧다.. A셀에 값이 없을때까지 B셀에 값을 넣어준다.

- if (filepath != null) 폴더경로가 있어야지 실행이 되게 한다

- FileInfo fName = new FileInfo(filepath + "\\" + this.Range["A" + i, missing].Text.ToString());
(파일 이동을 위해..FileInfo클래스를 사용해서 다시 폴더경로와 파일이름을 더해준다.)

- if (fName.Exists && this.Range["B" + i, missing].Text.ToString().Length > 0)
(fname.Exists로 파일이 있는지 확인 하고 바꿀 이름인 B셀의 텍스트 길이가 0보다 크면 조건문을 실행하게 한다)

- 조건이 참이면 MoveTo를 이용해서 이름을 바꿔주고 C셀에는 "성공"이라고 넣어준다.

- false이면 실패라고 넣어준다.

저작자 표시 비영리 변경 금지
신고
Posted by VSTO