반응형

vba를 이용하여 자동화를 하기 위하여는 어떤 범위에 있는 대상에 대하여 작업이 이루어 지는지를 설정 해주어야 합니다. 보통 range 라는 개체를 이용하여 설정을 해주게 되는데 이 range 를 현재 엑셀 시트에서 사용자가 선택한 영역으로 하고 싶은 경우가 있습니다.

 

선택을 필요로 하는 대상 셀이 한정 적이거나 자동화 대상이 필요에 따라 자주 변경되는 경우에는 사용자가 선택한 영역을 이용하여 range 를 설정해주는 것이 편리하기도 합니다.

 

엑셀 시트에서 특정 영역을 선택한 다음 vba 에디터 창으로 가서 아래와 같이 입력한 후 F5 를 눌러 실행해 봅시다.

 

Sub selectiontest()

    Dim currentSelection As Range
    Dim row_Count As Integer
    Dim column_count As Integer
    
    Set currentSelection = Selection.Cells()
    
    row_Count = currentSelection.Rows.Count
    column_count = currentSelection.Columns.Count
    
    MsgBox (row_Count) '현재선택한 셀의 세로 줄 수
    MsgBox (column_count) '현재선택한 셀의 가로 줄 수
    

End Sub

현재 선택한 셀의 가로 줄 수와 세로 줄 수가 팝창으로 안내가 됩니다.

 

선택한 모든 셀에 대하여 무엇인가를 해야 한다면 For 구분을 통하여 실행이 가능합니다.

 

 

 

 

여기서 한번 응용을 해보도록 하겠습니다.

 

특정 셀안에 색상을 표기하는 16진수 값이 들어있을 때 해당 값을 이용하여 섹의 색상을 칠한다고 하면 아래와 같이 하면 되겠습니다.

 

먼저 필요한 명령들을 보면 아래와 같습니다. 

 

선택 영역을 지정하는 함수 : Selection.Cells()

문자열의 일부 영역을 잘라내는 함수 : LEFT(string, number), MID(string,from, number), RIGHT(string, number)

16진수 값을 10진수로 변경해주는 함수 : WorksheetFunction.Hex2Dec(value)

셀의 배경색상을 지정하는 함수 .Interior.Color = RGB(255,255,255)

 

 

엑셀의 특정 영역에 16진수 색상 값을 적어 보겠습니다.

 

해당 셀을 영역으로 선택한 뒤 아래의 코드를 vba 에디터 창에 입력한 후 F5 를 눌러봅시다.

위에 설명했던 코드들이므로 한번 훓어 보시면 되겠습니다.

Sub selectiontest_setCellColor()

    Dim currentSelection As Range
    Dim row_Count As Integer
    Dim column_count As Integer
    
    Set currentSelection = Selection.Cells()
    
    row_Count = currentSelection.Rows.Count
    column_count = currentSelection.Columns.Count
    
    For Each c In currentSelection
        
        Dim clr_red As Integer
        Dim clr_green As Integer
        Dim clr_blue As Integer
        
        clr_red = WorksheetFunction.Hex2Dec(Mid(c.Value, 2, 2))
        clr_green = WorksheetFunction.Hex2Dec(Mid(c.Value, 4, 2))
        clr_blue = WorksheetFunction.Hex2Dec(Right(c.Value, 2))
        
        c.Interior.Color = RGB(clr_red, clr_green, clr_blue)
        
    Next

End Sub

짜잔. 요렇게 색상이 칠해졌습니다.

 

물론 당연히 선택한 셀이 아닌 기존 방식대로 특정 영역의 모든 셀에 대하여도 동일하게 적용이 가능합니다.

코딩을 하는 이유는 많은 작업을 쉽고 빠르며 정확하게 하기 위함이므로 위와 같은 칸이 수천개가 있다면 당연히 코딩을 하는 것이 좋은 방법이 되겠습니다.

 

디자이너분들이라고 겁먹지 마시고 과감히 코딩을 배워봅시다.

뎃글, 공감 은 블로그 작성자에게 큰 힘이 된답니다. 
도움이 되었다 생각되시면 클릭!!  부탁드려요~

 

이상입니다.

반응형
반응형

 

엑셀에서 자동화를 한다는건 사실 이유가 뻔 합니다. 처리해야 할 셀이 엄청나게 많거나 일반적인 함수로 연산이 불가한 경우 입니다. 그 중 오늘은 엄청나게 많은 데이터에 대한 자동화 처리를 위하여 반복문을 사용하는 방법을 알아보겠습니다.

 

우선 셀의 영역을 설정을 해야 합니다.

앞장에서 설명 하였던 영역을 설정하는 부분을 참고하세요.

 

[vba] 자동화를 위하여 엑셀의 영역 설정하는 방법

https://diy-dev-design.tistory.com/20?category=791049

 

Sub checkError()

    Dim asht As Worksheet
    Dim rngA As Range
    
    Set asht = ActiveSheet
    
    Set rngA = asht.Range("a3")
    Set rngA = asht.Range(rngA, rngA.End(xlDown))
        
End Sub

요렇게요. 그럼 a3 부터 a 열의 제일 마지막 행까지 설정이 됩니다.

 

반복문으로 무었을 할거냐면요. 

a 열에 있는 단어를 모두 소문자로 바꿔서 b 열에 넣을 겁니다.

 

엑셀 기본 제공 함수에는 왜인지 모르겠지만 이 기능을 지원하지 않는것 같습니다. 그러면 vba 로 하면 되는거죠.

 

위에 작성한 함수 아래 부분에 for 구문을 이용해서 위에서 말했던 소문자로 바꾸눈 기능을 개발해보겠습니다.

 

Sub checkError()

    Dim asht As Worksheet
    Dim rngA As Range
    
    Set asht = ActiveSheet
    
    Set rngA = asht.Range("a3")
    Set rngA = asht.Range(rngA, rngA.End(xlDown))
    
    '반복문 추가
    For Each c in rngA
    	c.offset(0,1).value = LCase(c.value)    
    next c
    
End Sub

요렇게 하면 됩니다.

 

For 뒤에 Each c 라는 부분이 있는데요. rngA 라는 Range의 각각의 셀을 c 로 하겠다는 의미 입니다. 모든 셀이 각각 턴마다 c 에 대응되고 나면 종료가 됩니다.

 

아래쪽에 Next c 라는 부분을 만나면 다음 셀로 넘어가게 되죠. 즉 For ~ Next 사이의 코드가 계속해서 반복됩니다. 언제까지요? 네. 모든 셀이 한번씩 지나가는 동안요.

 

그 아랫줄에 오늘 설명하기로 하였던 하나의 명령어가 나왔습니다.

 

바로 offset 입니다.

 

문장을 그래도 해석해 보면 c 라는 셀로 부터 아래쪽으로 0칸, 오른 쪽으로 1칸 위치에 있는 셀의 value, 즉 값에다가 c 의 값을 이용하여 LCase - 소문자로 변경하는 함수 - 로 세팅하라는 의미 입니다. 

 

문장이 좀 이상한데요. 어쨌든, LCase 는 소문자로, 반대로 UCase 는 뒤의 괄호안의 문자를 모두 대분자로 변경하라는 의미입니다. 즉 소문자로 변경한 c 의 값을 c 의 오른쪽 첫번째 칸에 입력하라는 의미가 되겠습니다.

 

offset 은 특정 셀에 대하여 사용할 수 있는 명령어 인데요. offset은 두개의 인자를 입력받는데 첫번째 인자는 세로 방향, 두번째 인자는 가로방향입니다. 0 이면 제자리이고요. 가로에 대하여 - 는 왼쪽, + 는 오른쪽입니다. 세로방향에 대하여 -는 위쪽, + 는 아래쪽입니다. 

 

특정 셀에 대하여 오른쪽으로 두칸, 아래로 한칸이면 c.offset(1,2) 가 됩니다.

특정 셀에 대하여 왼쪽으로 세칸, 위로 두칸이면 c.offset(-2, -3) 이라고 작성하면 됩니다. 

 

offset 은 아주 자주 사용되고 유용한 명령어 이므로 꼭 기억해두시길 바랍니다.

 

다음 강좌에서는 셀의 색상을 칠하는 방법, 셀 안의 글자 색을 변경하는 방법을 알아보겠습니다.

또한 색상의 경우 16진수 값으로 FF143F 와 같이 작성되는 경우가 많은데요. 이런식의 색상 코드를 이용하여 셀의 색상을 채우는 방법을 알아보겠습니다.

 

도움이 되셨다면 공감을 부탁드립니다~

 

그럼 이만

 

 

 

반응형
반응형

엑셀을 사용하는 목적 자체가 근본적으로 문서를 만들기 위함은 아니다 보니 세로 또는 가로로 굉장히 길게 데이터가 나열되어 있는 경우가 많습니다. 우리는 vba 를 이용하여 자동화를 할 것이기 때문에 어디부터 어디까지 자동화를 할것인지 영역을 설정을 해주어야 할 필요가 있는데요. 일반적으로 제가 자주 사용하는 패턴을 몇개 올려보려 합니다.

 

우선 alt+F11 을 눌러 vba 편집창을 열어줍니다.

 

 

좌측 트리구조에서 현재 엑셀 파일에 포함되어 있는 시트의 이름과 마지막에 ThisWorkbook 이라는 트리가 보일텐데요. 저는 보통 ThisWorkbook 라는 부분에 코드를 작성합니다. 왜나하면 현재 엑셀 파일내의 모든 시트에 자동화를 하기에 적당한 위치이기 때문입니다. 대신 스크립트 동작을 위하여 어떤 시트에서 동작을 할 것인지를 설정 해 주어야 합니다. 해당 위치를 더블클릭하면 스크립트 에디터 창이 열리게 됩니다.

 

아래는 제가 가장 많이 사용하는 패턴의 시트, 영역 설정하는 코드 입니다.

Sub checkError()

    Dim asht As Worksheet
    Dim rngA As Range
    
    Set asht = ActiveSheet
    
    Set rngA = asht.Range("a3")
    Set rngA = asht.Range(rngA, rngA.End(xlDown))
        
End Sub

Dim 은 엑셀에서 변수를 정의할때 사용하는 명령어 고요. Dim 뒤에 있는 asht 가 변수 명이 되겠습니다.

뒤에 As Worksheet 라는 것은 앞에 선언한 asht 가 워크시트를 저장할 변수임을 알려주게 됩니다.

 

역시 rngA 는 변수이며 Range 즉 엑셀의 어떤 영역을 지칭합니다. 그 아래에 set 으로 시작하는 부분에서 위에 정의한 변수에 실제 유의미한 정보를 설정해 주게 됩니다.

 

asht 는 현재 활성화된 워크시트를,

rngA 는 일단 현재 시트의 a3 칸을 지정한 뒤 다시 a3 으로부터 아래 마지막까지를 설정하는 명령입니다.

 

이렇게 하면 특정 위치로부터 행의 가장 아래까지 설정이 가능합니다. 행이 몇행까지 있는지 알지 못하거나 경우에따라 변경이 될 수 있는 상황에서 이렇게 작성하면 일일이 코드 수정을 하지 않아도 되는 장점이 있습니다. 

 

이런식으로 작성할 때 가끔 문제가 발생할 수 있는 여지가 있는데요, a 열에 어떤 행이 중간에 값이 비어 있을때 입니다. Range.End(xlDown) 이라는 명령은 값이 있는 마지막까지를 탐색하기 때문이죠. 매번 마지막 행을 확인할 필요가 없으니 편리한 기능이기는 한데 기준이 되는 a 열의 중간에 값이 비어있을 수도 있다면 이렇게는 안됩니다. (중간에 빈칸이 필요한 경우 의미 없는 문자열(예> N/A)을 삽입하여 자동화 시 걸러내는 방법을 사용하는 것이 좋습니다)

 

만약 시작부터 끝을 알고 있는 경우, 또는 빈 칸이 포함되어 있는 경우 아래와 같이 정의를 해주어야 하죠.

 

Dim rngA As Range
Set rngA = asht.Range("a3","a3000")

이렇게 하면 a3 ~ a3000 까지 각 셀에 값이 있건 없건 영역으로 설정이 됩니다.

 

제가 소스 코드를 ThisWorkbook 에 작성을 한다고 하였고 그 때문에 스크립트가 동작할 시트가 어떤 시트인지를 지정해주어야 한다고 하였는데요. 만약 특정 시트에 바로 스크립트를 작성할 것이라면 아래와 같이 간단하게 영역을 설정 할 수 있습니다.

 

Sub checkError()

    Dim rngA As Range
    Set rngA = [a3:a3000]

End Sub

바로 대괄호 [ ] 를 이용하여 설정하는 방법입니다. 동일하게 a3 ~ a3000 까지를 설정하는 코드입니다. 시트는 현재 이미 선택이 되어 있기 때문에 별도로 시트를 설정할 필요가 없죠. 

 

특정 셀 하나를 설정하려면 아래와 같이하면 됩니다.

Sub checkError()

    Dim rngA As Range
    Set rngA = [a125]

End Sub

 

저는 대부분의 자동화 코드를 이런식으로 시작합니다. 

그 아래 부분에 For 구문을 이용하여 필요한 기능을 적용할 수 있습니다.

 

 

다음 편에서는 For 구문을 이용하여 반복 처리하는 부분과 offset 이라는 기능을 이용하여 선택된 셀로 부터 특정 위치에 있는 셀을 지정하는 방법을 알아보겠습니다.

 

뎃글, 공감 은 블로그 작성자에게 큰 힘이 된답니다. 
도움이 되었다 생각되시면 클릭!!  부탁드려요~

 

2019/07/12 - [DEV/VBA] - [vba] For 구문 이용하기와 offset 사용 해 보기

 

[vba] For 구문 이용하기와 offset 사용 해 보기

엑셀에서 자동화를 한다는건 사실 이유가 뻔 합니다. 처리해야 할 셀이 엄청나게 많거나 일반적인 함수로 연산이 불가한 경우 입니다. 그 중 오늘은 엄청나게 많은 데이터에 대한 자동화 처리를 위하여 반복문을..

diy-dev-design.tistory.com

 

2020/02/05 - [DEV/VBA] - [VBA] 셀의 넓이를 픽셀로 지정하기 (set column width by pixels)

 

[VBA] 셀의 넓이를 픽셀로 지정하기 (set column width by pixels)

정말 지긋지긋한 마이크로 소프트 입니다. 저는 VBA 를 하면서 이번 포스트 내용만큼 어의가 없는 경우는 없었던거 같습니다. 왜 때문이냐고요? 바로 아주 단순한 셀 넓이를 VBA 를 이용하여 지정하는 방법 때문입..

diy-dev-design.tistory.com

 

반응형
반응형

git 은 정말 훌륭한 버전 관리 솔루션입니다. 저의 경우 개발은 덤으로 하고 있기 때문에 이런 버전관리 솔루션이 익숙치는 않고 다만 필요에 의해 사용하는 수준이다 보니 상세한 기능수준까지 활용하는 수준은 아니며 웹서핑을 통해 근근히 필요한 내용을 찾아가며 사용하고 있습니다.

 

저 역시 회사에서 프로젝트 관리를 위하여 git 을 이용하여 변경 시마다 커밋으로 변경 정보를 남기고 관리를 하고 있는 입장인데 오늘 갑자기 문제에 봉착하였습니다.

 

제가 사용하는 프로젝트는 사실 개발 소스코드를 관리하는 목적은 아니고 컬러 배색 테이블을 깃으로 버전 관리를 하고 있는데 이 배색 테이블의 버전 별 변경정보를 배색 관리 툴에서 확인하고 싶어서 git bash 를 열어놓고 diff 라는 명령어를 이용하여 변경 정보를 확인하면서 발생되었습니다.

 

분명 관리되는 파일은 ANSI 로 저장을 하는것으로 알고 있었고 git bash 에서 diff 명령어를 통해 확인된 결과 아래와 같이 꺽쇠로 구분된 형태로 정확한 정보가 표시가 되지 않는 것이었죠.

 

내가 사용한 명령은 아래와 같습니다. 

git diff --color-words 75b59ef5 205a7797

--color-words 옵션을 붙이면 실제 차이가 있는 부분만 보여주는 옵션입니다.

뒤에 두개는 각 커밋의 명칭입니다.

 

어쨌든 문제가 된 결과 화면은 아래와 같습니다.

 

 

회색으로 박스처럼 선택된 영역인데 한글로 저장된 영역에 해당됩니다.

 

상당히 많은 곳을 검색한 결과 정확히 개선이 되는 해법을 찾아 본 프스팅을 남깁니다.

 

 

우선 본인의 git config 파일을 찾아 아래의 줄을 추가하였습니다.

"ecukr" 부분의 내용은 중요하지는 않고 다만 정의된 이름을 의미합니다. 본 포스트의 아래에서 해당 명칭을 호출하게 되는데 그때 사용되는 명칭과 동일하면 됩니다.

[diff "euckr"]
      textconv="iconv -f euc-kr -t utf-8"

 

실제 컨피그 파일 내부

필요한 설정을 추가 한 상태

만약 해당 컨피크 파일이 어디 있는지 모르겠으면 everything 과 같은 툴을 설치한 뒤 .gitconfig 라고 검색하면 어디에 있는지 알수 있습니다.(everything 이라는 툴은 정말 놀라운 툴입니다. 이글을 읽고 있는 분께서도 한번 설치해보시기 바랍니다.) Notepad++ 와 같은 편집기로 수정을 한뒤 저장 해 주도록 합니다.

 

그런 다음 실제 프로젝트가 있는 폴더에 해당 설정을 이용할 것임을 알려 주어야 합니다.

 

실제 위의 설정을 사용할 데이터가 있는 폴더(git 으로 관리중인 폴더)에 .gitattributes 라는 파일을 하나 만들어 준뒤 해당 파일 안에 

 

*.ini diff=euckr

와 같이 한줄 추가해 주고 저장을 해 줍시다.

 

필자의 경우 *.ini 라고 작성하였으므로 해당 디렉토리 하위의 모든 ini 파일에 대하여 diff 시 euckr 로 정의된 텍스트 변환 셋을 적용하도록 설정을 한 것인데 만약 본인의 프로젝트 자료가 .cpp 나 .h 등이 있다면 해당 확장자에도 마찬가지로 적용되도록 아래와 같이 추가할 수 있을 것입니다. 본인의 파일 확장자에 맞도록 추가해주면 됩니다.

 

*.ini diff=euckr
*.cpp diff=euckr
*.h diff=euckr

 

이렇게 하면 해당 파일(.gitattributes)이 포함되어 있는 모든 하위의 폴더에서 diff 명령 실행 시 한글이 깨지지 않고 출력이 되는 것을 확인하였습니다.

 

다시 한번 diff 명령을 실행한 결과:

동일 위치에서 한글로 된 description 이 잘 출력되는 것을 확인할 수 있다.

깔끔하게 해결이 되었네요.

 

 

저와 같은 문제를 겪는 분들께 도움이 되셨으면 합니다.

반응형

'DEV' 카테고리의 다른 글

유튜브 음악, 영상 다운로드 프로그램 - MUSIC DOWNTOWN  (4) 2023.06.20
반응형

예전 포스트에서 포토샵의 스크립트에대하여 설명하면서 대표적인 예로 레이어를 자동으로 저장하는 기능을 설명드린 적이 있는데요. 이번에는 좀더 간단한 ( 코딩 줄 수가 짧은 ) 스크립트로 다시 올려봅니다.

 

A-Z 하나하나 작성 설명을 포함했던 기존 스크립트

https://diy-dev-design.tistory.com/6

 

방식은 동일한데요. 변수나 함수의 정의 방법을 개선하여 대폭 코딩 양을 줄인 케이스 입니다.

 

1. 우선 PSD 파일의 모든 레이어에 대하여 PNG 파일로 저장이 됩니다.

2. 현재 PSD 파일의 경로에 폴더가 생성되고 그 하위에 이미지가 저장됩니다.

3. 저장되는 이미지는 현재 레이어의 이름으로 저장 됩니다.

4. 레이어 내에 폴더(레이어셋)가 있는경우 하위폴더가 해당 레이어 셋 이름으로 생성되고

5. 레이어 셋 내의 레이어 들은 그 하위 폴더 내부에 저장됩니다. 포토샵 구조와 동일하게 저장되죠.

6. 저장되는 파일은 PNG 파일로 저장이 됩니다. 

var pngOption = new PNGSaveOptions()
    pngOption.embedColorProfile = true;
    pngOption.formatOptions = FormatOptions.STANDARDBASELINE;
    pngOption.matte = MatteType.NONE;
    pngOption.quality = 100;
    pngOption.PNG8 = false; //24 bit PNG
    pngOption.transparency = true;
    pngOption.interlaced = true;

var cDoc = app.activeDocument
var tempLayers = cDoc.layers
var cWidth = cDoc.width
var cHeight = cDoc.height
var cRes = cDoc.resolution
var savePath = cDoc.path + "\\"

// 일단 모든 레이어를 꺼줍니다.
for (var i = 0 ; i < tempLayers.length; i++)
{
	tempLayers[i].visible = false
}

// 아래의 한줄의 함수로 모든 레이어를 저장합니다.
explorerLayerSet_new(savePath, cDoc) 

function explorerLayerSet_new (cPath, lSet){
	var dLyrs = lSet.layers
	for (var k = 0 ; k < dLyrs.length; k++){
		if (dLyrs[k].typename == "LayerSet") 
		{
			dLyrs[k].visible = true
			ePathName = cPath + dLyrs[k].name + "\\"
			ee = new Folder(ePathName)
			ee.create();
			explorerLayerSet_new (ePathName, dLyrs[k])
			dLyrs[k].visible = false
		}else{
			dLyrs[k].visible = true
			dFile = File(cPath + dLyrs[k].name + ".png")
			cDoc.saveAs(dFile, pngOption,true, Extension.LOWERCASE)  
			if (dLyrs[k].name.indexOf("All") == -1)
			{
				dLyrs[k].visible = false
			}
		}
	}
	lSet.visible = false
}

 

네.. 많이 짧아 졌습니다.

 

일단 재귀함수 (반복해서 하위로 탐색해나가는 함수) 부분에 변수를 정의할 때 var 라는 지시어를 붙여 주어 로컬 변수가 될 수 있도록 하여 재귀 호출시에 문제가 없도록 변경한 것이 기존 대비 가장 큰 차이점이라 할 수 있겠습니다.

 

번거롭게 코딩하는 것이 귀찮으시면 위의 내용을 메모장에다가 붙여넣으신 다음 확장자를 jsx 로 하여 저장한뒤 사용하시면 되겠습니다.

 

포토샵에 기본적으로 들어있는 Layer Export 스크립트 보다 빠르고 하위 폴더까지 저장되므로 PSD 자료 정리에 편리하게 사용하시기 바랍니다.

 

포토샵에서 기존에 만들어진 스크립트를 사용하는 방법은 아래 포스트를 참고하세요~

https://diy-dev-design.tistory.com/47

 

[포토샵스크립트] 스크립트 단축키로 실행하기

안녕하세요. 오늘은 자신이 작성하였거나 웹에서 다운로드 받은 스크립트를 간단하고 빠르게 실행하는 방법을 알려드리겠습니다. 우선 스크립트를 실행하는 방법은 몇가지가 있는데 다음과 같습니다. Extend Scrip..

diy-dev-design.tistory.com

 

2019-09-10 내용을 추가합니다. : JPG 저장 옵션

기존 만들어진 스크립트에 jpg 파일로 저장하기 위한 옵션이 따로 있으면 좋을 것 같아서 jpg 파일 저장 옵션을 추가하였습니다. 아래 몇줄을 추가하고 나면 스크립트 초반에 저장하고 싶은 옵션을 골라 저장을 할 수 있습니다.

var pngOption = new PNGSaveOptions()
    pngOption.embedColorProfile = true;
    pngOption.formatOptions = FormatOptions.STANDARDBASELINE;
    pngOption.matte = MatteType.NONE;
    pngOption.quality = 100;
    pngOption.PNG8 = false; //24 bit PNG
    pngOption.transparency = true;
    pngOption.interlaced = true;

// jpg 파일 저장을 위한 설정
var jpgSaveOption = new JPEGSaveOptions()
    jpgSaveOption.quality = 8;
    
var sType = "jpg" // jpg 로 파일을 저장하기를 원하는경우, png 로 저장을 하고 싶다면 "png"
var cDoc = app.activeDocument
var tempLayers = cDoc.layers
var cWidth = cDoc.width
var cHeight = cDoc.height
var cRes = cDoc.resolution
var savePath = cDoc.path + "\\"

// 일단 모든 레이어를 꺼줍니다.
for (var i = 0 ; i < tempLayers.length; i++)
{
	tempLayers[i].visible = false
}

// 아래의 한줄의 함수로 모든 레이어를 저장합니다.
explorerLayerSet_new(savePath, cDoc) 

function explorerLayerSet_new (cPath, lSet){
	var dLyrs = lSet.layers
	for (var k = 0 ; k < dLyrs.length; k++){
		if (dLyrs[k].typename == "LayerSet") 
		{
			dLyrs[k].visible = true
			ePathName = cPath + dLyrs[k].name + "\\"
			ee = new Folder(ePathName)
			ee.create();
			explorerLayerSet_new (ePathName, dLyrs[k])
			dLyrs[k].visible = false
		}else{
			dLyrs[k].visible = true
			dFile = File(cPath + dLyrs[k].name + "." + sType)
            
              if (sType == "jpg") // jpg 로 저장을 하는 경우를 판단함
              {
                  cDoc.saveAs(dFile, jpgSaveOption,true, Extension.LOWERCASE)  
              }else{
                  cDoc.saveAs(dFile, pngOption,true, Extension.LOWERCASE)  
              }
			
			if (dLyrs[k].name.indexOf("All") == -1)
			{
				dLyrs[k].visible = false
			}
		}
	}
	lSet.visible = false
}

 

2019-12-04 일반 사용자 분들도 쉽게 사용하실 수 있도록 스크립트를 첨부하였습니다.

아래 링크에서 다운로드 받으셔서 사용하시면 됩니다.

레이어 저장이 필요한 PSD 파일을 열어두신 후 다운로드 받으신 jsx 파일을 드래그 해서 포토샵 바탕위치로 드롭하면 스크립트가 자동으로 실행이 되며 이미지가 저장이 됩니다. (PSD 이미지 위가 아닙니다. 포토샵의 검정색 배경 부분에 가져다 놓으셔야 합니다)

layerexporter.jsx
0.00MB

 

2019-09-10 내용을 추가합니다. 레이어 저장시 레이어의 크기로 저장되도록 기능 추가

아래 포스트에서 확인 하시면 됩니다. 거의 비슷한데요. 레이어별 크기로 저장을 하거나 기존 도큐먼트 사이즈로 저장할 수도 있습니다.

https://diy-dev-design.tistory.com/72

 

[포토샵스크립트] PSD 모든 레이어 자동 저장, 하위 폴더 포함 (레이어 크기로 이미지 저장)

안녕하세요. 제가 포토샵 스크립트를 이용하여 PSD 파일내의 모든 레이어를 자동으로 하위폴더 구조를 유지하며 저장할 수 있는 스크립트를 만들어서 올렸었는데요. 바로 아래 링크에서요. https://diy-dev-design..

diy-dev-design.tistory.com

뎃글, 공감 은 블로그 작성자에게 큰 힘이 된답니다. 
도움이 되었다 생각되시면 클릭!!  부탁드려요~

 

궁금하신 부분이 있다면 뎃글로 문의 해 주세요~

반응형
반응형

이미지 관련된 툴을 개발함에 있어 다양한 이미지 포멧을 만들고 변경하기 위한 코어를 개발하는 것은 말도 안되게 힘든 작업입니다. 저는 디자이너라는 타이틀을 가지고 있기 때문에 포토샵이라는 훌륭한 어플리케이션이 기본적으로 설치가 되어 있어 간단한 스크립트 만으로 다양한 이미지 컨트롤을 할 수 있지만 개발자 또는 일반인이 포토샵을 구해서 사용하려면 비용적인 부담이 있기 때문에 망설여 질 수 밖에 없습니다.

 

물론 Irfanview 와 같이 무료이면서 아주 다양한 기능을 지원하는 이미지 뷰어도 있습니다만 어떤 목적에 맞게 개발적 관점에서 이미지를 변경할 수 있는 툴이 필요한 경우도 있게 마련입니다.

 

그런 경우 아주 적합한 툴이 바로 ImageMagick 입니다. 아래는 해당 Application의 홈페이지 입니다.

https://imagemagick.org/index.php

 

ImageMagick

Create, Edit, Compose, or Convert Bitmap Images

imagemagick.org

 

가보면 다운로드 받아 PC 에 설치하고 간단한 커맨드 명령만으로 이미지를 변환 할 수 있다는 것을 알 수 있습니다. 간단하게는 사이즈를 변경하거나 이미지의 포멧을 바꾸거나 하는 것을 할수 있고 주석을 넣거나 이미지의 뎁스를 변경하거나 여러장의 이미지를 합성하는 등의 복잡한 기능도 커멘드 라인을 통해 진행할 수 있습니다.

 

하지만 이번 글 제목처럼 단순 이미지 변경외에도 전체적인 개발 과정에서 이미지 변환이 필요하거나 복잡한 로직속에 이미지 수정이 필요하여 해당 툴을 사용해야 하는 경우 C# 에서 DLL 을 불러들여 개발을 하는 방법이 있습니다. VS 2017 이상이라면 아주 간단합니다.

 

먼저 비주얼 스튜디오의 상단 도구 메뉴에서 도구 --> Nuget 패키지관리자 --> 솔루션용 Nuget Pakage 관리.. 를 선택해 줍니다.

 

위와 같이 찾아보기 텝에서 검색창에 ImageMagick 을 적어 줍니다.

그러면 아래에 검색된 결과가 나오는데요. 저는 .NET 용 패키지를 설치하려고 합니다. 리스트를 내려볼까요.

 

요런 식으로 Magick.NET 이라고 붙어 있는 녀석이 .NET 용 라이브러리 입니다.

저는 Q8-x64 를 설치할 예정입니다. Q8 과 Q16 이 있는데 Q8 이 컨트롤이 좀더 심플합니다. 기회가 되면 나중에 설명을 드리겠습니다.

 

 

Q8-x64 를 선택하고 나면 우측에 비어있던 창에 아래와 같이 나타납니다.

현재 프로젝트 명이 체크박스와 함께 나타나는데요. 

현재 프로젝트 명 앞의 체크박스를 선택해주면 아래 "설치" 라는 버튼이 활성화 됩니다.

 

설치버튼을 누르고 새로 뜨는 팝업창에서 확인버튼을 하번더 눌러주면 dll 설치가 끝이 납니다.

 

다시 코드로 와서 상단에 using 으로 시작하는 지시문을 추가해줍니다.

 

using ImageMagick;

 

이제 코딩을 할 준비는 모두 끝이 났습니다. 

 

다음 포스트에서 ImageMagick 을 이용하여 이미지를 컨트롤 하는 방법을 올려보도록 하겠습니다.

 

궁금한 것은 뎃글 주세요.

 

도움이 되셨다면 공감도 꾹 부탁합니다.

2020/06/03 - [DEV/c#] - C# .net으로 photoshop 연동하기

 

C# .net으로 photoshop 연동하기

저는 회사에서 디자인팀에 있고 전공도 디자인과 출신이며 심지어는 고등학교도 예체능계열 고등학교를 나왔습니다만 지금 회사에서 하는일의 95% 정도는 개발을 하고 있습니다. 실제로 제가 ��

diy-dev-design.tistory.com

2020/04/03 - [DEV/c#] - ImageMagick 을 이용하여 이미지 컨트롤 해보기

 

ImageMagick 을 이용하여 이미지 컨트롤 해보기

포토샵 없이 이미지를 편집하는 방법이 없을까 고민하다가 알게된 라이브러리, 바로 ImageMagick 입니다. 먼저 포스트에서 ImageMagick 을 프로젝트에 가져오는 방법을 아래와 같이 소개해 드린적이 ��

diy-dev-design.tistory.com

 

2020/01/03 - [DEV/c#] - [C#] C# APP 에서 엑셀 연동해보기

 

[C#] C# APP 에서 엑셀 연동해보기

엑셀에서 VBA 로 코드를 짜다 보면 막상 특정 엑셀 파일에만 VBA 가 적용이 가능하기 때문에 막상 다른 엑셀 파일에서 동일한 동작을 하려면 또 코드를 복사해 넣고 실행을 해야 하는 경우가 있습�

diy-dev-design.tistory.com

 

 

 

 

 

반응형
반응형

사용자의 마우스 컨트롤 없이 자동으로 지정된 위치에서 마우스를 클릭하게 만들어 주는 기능 입니다.

 

먼저 아래와 같이 DLL 을 불러들여 주어야 하겠습니다.

class 정의 바로 아래부분에 넣어 주면 무난하겠네요.

[DllImport("user32.dll")]
public static extern void mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo);

[DllImport("user32")]
public static extern int SetCursorPos(int x, int y);

 

DllImport 부분에 빨간 줄이 나온다면 제일 상단에 아래의 같이 지시문을 추가합니다

 

using System.Runtime.InteropServices;
using System.Threading;

<2022/12/28 누락된 코드가 있어 추가하였습니다>

그런 다음 마우스를 이동하는 함수를 만들어야 겠습니다.

 

먼저 상수값을 지정해 주어야 합니다. 마우스의 각 이벤트에 대응되는 상수인데요. 이름은 적당히 적어 주면 됩니다.

역시 Form 상단 클래스 정의 이후에 아래와 같이 정의해주면 되겠습니다.

private const int MouseEV_Move = 0x0001; 		/* mouse move 			*/
private const int MouseEV_LeftDown = 0x0002; 	/* left button down 	*/
private const int MouseEV_LeftUp = 0x0004; 	/* left button up 		*/
private const int MouseEV_RightDown = 0x0008; 	/* right button down 	*/

private int interval_;
private readonly ManualResetEvent stoppeing_event_ = new ManualResetEvent(false); //System.Threading;

<2022/12/28 누락된 코드가 있어 추가하였습니다>

그런 다음 아래에 실제 함수를 작성해 봅니다.

public void MouseSetPosNclick(int x, int y)
{
	try
	{
		SetCursorPos(x, y);
		stoppeing_event_.WaitOne(interval_);
		MouseClick_now();
	}
	catch (Exception e)
	{
		MessageBox.Show("MouseSetPosNclick\r\n" + e.Message);
	}
}

public void MouseClick_now()
{
	try
	{
		mouse_event(MouseEV_LeftDown, 0, 0, 0, 0);
		mouse_event(MouseEV_LeftUp, 0, 0, 0, 0);
		stoppeing_event_.WaitOne(100);
	}
	catch (Exception e)
	{
		MessageBox.Show("MouseClick_now\r\n" + e.Message);
	}
}

 

 

사용하실 때에는 아래와 같이 사용하시면 되겠습니다.

 

MouseSetPosNclick(467, 280); // 원하는 좌표를 입력하면 됩니다.

 

궁금하신 부분은 뎃글로 질문 남겨 주세요~

뎃글, 공감 은 블로그 작성자에게 큰 힘이 된답니다. 
도움이 되었다 생각되시면 클릭!!  부탁드려요~

 

 

 

본 기능을 이용하여 윈도우 잠금 방지 유틸리티를 하나 만들어 보았습니다.

https://diy-dev-design.tistory.com/98

 

재택근무 필수 유틸 "자리안비움" - 윈도우 꺼짐 방지

요즘 코로나 바이러스 때문인지 덕분인지 재택근무를 하는 분들이 많은데요. 막상 집에 있다 보면 사무실에 있을 때 처럼 연속해서 자리에 머무르지 못하는 경우가 종종 있습니다. 애들이나 와이프가 뭐 부탁하면..

diy-dev-design.tistory.com

 

2020/07/21 - [DEV/c#] - C# 문자열 읽어서 문자열에 해당하는 변수에 값 세팅하기

 

C# 문자열 읽어서 문자열에 해당하는 변수에 값 세팅하기

오늘 소개해드릴 꿀팁은요. 문자열을 읽어 들여서 문자열 내에 들어있는 특정 단어를 이용하여 개발 중인 코드의 변수로 인식하여 해당 변수에 값을 세팅하는 방법을 소개해 드릴까 합니다. 예�

diy-dev-design.tistory.com

2023.01.31 - [DEV/c#] - [c#] Resource 에 추가한 텍스트를 소스코드에서 불러오기

 

[c#] Resource 에 추가한 텍스트를 소스코드에서 불러오기

뻔하디 뻔한 개발 노하누는 가라~ 이번에도 쓸만한 내용을 소개해 드릴 까 합니다. 개발을 하다 보면 실제 소스코드 외에도 어떤 텍스트를 resource 에 넣어 두고 소스코드에서 불러와야 하는 경우

diy-dev-design.tistory.com

 

반응형
반응형

 

c# .net 환경 개발시 아래의 함수를 이용하여 Delay 를 구현할 수 있습니다.

 

private static DateTime Delay(int MS)
{
  DateTime ThisMoment = DateTime.Now;
  TimeSpan duration = new TimeSpan(0, 0, 0, 0, MS);
  DateTime AfterWards = ThisMoment.Add(duration);

  while (AfterWards >= ThisMoment)
  {
    System.Windows.Forms.Application.DoEvents();
    ThisMoment = DateTime.Now;
  }

  return DateTime.Now;
}

 

사용할때는 아래와 같이 사용합니다.

 

Delay(1000); // 1초 동안 Delay 를 하게 되죠

 

이상 간단하게 Delay 기능 사용하기 였습니다.

반응형
반응형

포토샵 스크립트 역시 다른 개발언어와 마찬가지로 도움말이 있습니다. 레퍼런스라고 해야할까요. 사실 개발자라고 해도 모든 명령어와 프라퍼티, 메소드를 외우고 있을 수는 없기 때문에 잘 만들어진 레퍼런스가 있으면 큰 도움이 됩니다. 레퍼런스가 잘만들어져있는 스크립트 언어로는 대표적으로 3DS MAXscript 가 있을 수 있겠습니다. 정의와 설명, 사용예시까지 나와 있어 초보 개발자 분들께 아주 큰 도움이 되죠. 포토샵 스크립트에서는 Extend Script Tool kit 에서 제공하는 Object Model Viewer 라는 툴을 제공합니다. 포토샵, 일러스트 등의 어도비에서 제공하는 스크립트의 명령어와 각각 클래스의 메소드, 프라퍼티를 알기 쉽게 제공하는데요. 오늘은 해당 툴을 사용하는 방법을 알아 보겠습니다.

 

우선 Extend Script Tool Kit 을 켜신다음 F1 키를 누르거나 help --> Object Model Viewer 를 선택하시면 아래와 같은 창이 표시됩니다.

 

F1 키를 눌러 도움말을 열어본 화면

상단에 검색을 위한 입력칸이 있고요. 우측 Browser 라고 보이는 부분 하단으로 보여지는 부분이 실제 사용되는 부분입니다. Core Java Script 라고 표시된 부분을 눌러보시면 드롭다운 메뉴가 표시가 되며 여기서 도움을 얻을 언어를 선택하면 됩니다. 기본적으로 자바 스크립트에 대한 레퍼런스가 선택이 되어 있습니다.

 

상단 드롭다운 버튼을 이용하여 현재 프로그래밍 중인 application 을 선택해 준다.

드롭다운을 열어보면 현재 제공하고 있는 언어의 목록이 있는데요. 여기서 포토샵을 선택하면 되겠습니다.

 

중간에 세개의 하얀 박스가 있는데요.

 

맨 위에는 개체를 찾아 선택하는 부분

중간은 해당 개체가 클래스인지, 메소드 인지 어떤 정보인지를 알려주는 부분이고요

아래쪽은 위에서 선택된 개체의 메소드와 프라퍼티를 나열해주고 있습니다.

 

개체를 선택한뒤 개체의 메소드나 프라퍼티를 아래쪽에서 선택하면 우측에 선택한 개체에 대한 설명이 표시가 됩니다.

앞에서 공부 했던 도큐먼트의 크기를 찾는 과정에서 사용했던 width 라는 단어는 아래 보시는 바와 같이 설명이 표시가 됩니다. 데이터 타입으로 unitValue 라고 되어 있는데요. 현재 사용자가 설정한 유닛을 기준으로 값이 리턴이 되게 됩니다.

상단의 Class 창에서 Document 를 선택하고 아래 Width 라는 프라퍼티를 선택한 상태

 하단의 하얀 박스에는 그 외에도 엄청나게 많은 항목이 존재하는데 도큐먼트라는 개체가 갖는 다양한 기능이나 속성을 이용할 수 있습니다. 대표적인 예로 저장하기, 닫기, 컬러모드를 변경한다거나 선택영역 정보를 확인한다던가 하는 작업을 할 수 있으며 하얀 부분에 사용할 수 있는 개체와 사용방법이 표시됩니다.

 

예를 들어 도큐먼트를 닫는 액션을 할건데요. 현재 작업한 것을 저장하지 않고 그냥 닫을 겁니다. 

레퍼런스 기준으로 찾아보면 하단에 close 부분이 되겠는데요. 아래와 같이 설명이 나옵니다.

 

선택한 프라퍼티 또는 매서드에 대한 설명이 우측에 나온다.

측 Document 개체 뒤에 .close 라고 적어주고요. 괄호안에 저장 옵션을 설정해 주어야 합니다. 이미지가 수정되면 닫기 작업을 할때 포토샵이 저장할 것인지 물어보죠? 같은거라고 보시면 됩니다. 그런데 우리는 저장 옵션을 모르기 때문에 역시 찾아봐야 합니다.

저 파란섹 SaveOptionsType 부분을 클릭하면 아래와 같이 창이 변경됩니다.

파랗게 표시된 텍스트는 링크가 있음을 의미하며 해당 속성으로 바로 접근할 수 있다

좌측선택 창이 변경이 되었고 우측 상단에 SaveOptionsType 이라는 개체가 표시되고 있죠? 

다시 좌측 아래를 보면 세가지 옵션이 있습니다.

 

대층 읽어보면 

  • 변경사항을 저장하지 않고 
  • 변경사항을 저장할지 물어보고
  • 변경사항을 저장하고

정도가 되겠습니다.

그중 DONOTSAVECHANGES (변경사항을 저장하지 않고)  를 선택해보면 아래와 같이 우측에 표시가 됩니다.

 

'저장하지 않고 닫기' 에 해당되는 DONOTSAVECHANGES 옵션 (대소문자 주의)

 

실제로 작성해야 하는 최종 상태는 우측과 같은 형태입니다.

 

var imgPath = "D:\\images\\audi-a6-allroad-07.jpg"
var imgFile = File(imgPath)

var cDoc = app.open(imgFile)

cDoc.close (SaveOptionsType.DONOTSAVECHANGES)

 

코드로 작성해보면 위와 같은 형태가 되는거죠. 

열자마자 닫는 의미 없는 코드이기는 하지만 중간에 어떤 작업을 넣을 수 있겠습니다. 

물론 저렇게 저장하지 않고 닫을꺼면 의미는 없겠습니다. 

 

var imgPath = "D:\\images\\audi-a6-allroad-07.jpg"
var imgFile = File(imgPath)

var cDoc = app.open(imgFile)

// 뭔가 사용자가 필요한 코드 수행

cDoc.close (SaveOptionsType.SAVECHANGES)

요렇게 하면 이미지를 열어서 필요한 자동화 액션을 하고 저장하면서 닫는 코드가 되겠습니다.

 

 

참고로 어도비에서 제공하는 PDF로 되어있는 레퍼런스도 있으니 사용해 보시기 바랍니다. 상세하게 나와있고 예제로 작성된 스크립트도 약간 있으므로 처음 배우시는 분들께는 도움이 되실 수 있을 것으로 생각됩니다.

https://www.adobe.com/devnet/photoshop/scripting.html

 

Adobe Photoshop Scripting

 

www.adobe.com

궁금하신 부분은 뎃글 부탁드립니다.

 

공감 꾸욱~ 부탁드립니다.

반응형

+ Recent posts