VBA 강의(2) - Flash Tank 계산 (2)

1. 계산서 엑셀 시트

   1.1 디자인

   1.2 VBA 코딩

       1.2.1 엑셀 옵셥 설정

       1.2.2 계산서 코드

2. 다중 계산 엑셀 시트

   2.1 디자인

   2.2 VBA 코딩

       2.2.1 엑셀 머리글/바닦글 쓰기

       2.2.2 Column 별로 계산하기


* 파일 다운로드 : Flash Tank Excel Rev. 1(엑셀 파일 열기시 "열기(매크로 포함)"으로 열어야 VBA 코드를 실행할 수 있습니다.)

 

이번 강의에서는 이전 강의에서 작성하엿던 Flash Tank의 엑셀 VBA 계산식과 코딩을 이용하여, 2 가지 다른 형태의 엑셀 출력물을 만드는 방법에 대해 강의하도록 하겠습니다.

하나는, 설계 출력물로 제출되는 계산서 엑셀 시트를 만드는 것이며, 다른 하나는 여러 경우의 계산을 하나의 엑셀 시트에서 수행하는 다중 계산 엑셀 시트를 만드는 것입니다.

이렇게 동일한 설계 VBA 코딩을 가지고 여러 형태의 엑셀 출력물을 만드는 것은, 설계적인 것이라기 보다는 단지 엑셀 VBA의 활용 기술에 지나지 않으므로, 이러한 엑셀 VBA 활용 강의는 이번 강의로 끝내고, 앞으로의 다른 설계 VBA 강의에서는 Flash Tank 1강의 내용에 해당하는 강의만을 다루기로 하겠습니다.   다른 설계 VBA 강의를 이용한 다양한 형태의 엑셀 출력물은 이번 강의를 토대로 사용자 분들께서 직접 작성해 보시기 바라며, 그렇게 작성된 엑셀 출력물을 VBA 게시판에 올려 다른 사용자 분들이 공유할 수 있도록 해 주시면 감사하겠습니다.

 

차례

1. 계산서 엑셀 시트

1.1 디자인

Flash Tank 계산서 엑셀 시트는 다음과 같이 디자인하였습니다.

 

위의 엑셀 시트는 셀 구분선을 표시하지 않았으며, 쪽 구분을 표시하고 25개 Column의 폭을 2로 설정하였습니다.

이러한 엑셀 옵션 설정을 엑셀 [도구]-[옵션]-[화면 표시]-[창 옵션] 메뉴를 사용해 설정할 수도 있으나, VBA 코딩을 통해서도 할 수 있습니다.  

1.2 VBA 코딩

1.2.1 엑셀 옵션 설정

엑셀 옵션 설정을 위한 VBA 코딩이 아래 [Worksheet]-[Activate] 이벤트 창에 기술되어 있습니다.

이러한 옵션 설정은 한번만 실행한 후에 엑셀 시트를 저장하면 설정 값이 그대로 유지되므로, Worksheet를 한번 활성화(Activate)시켜 코드를 한번 실행시킨 후에는 문장 앞에 컴마를 삽입해 주석문으로 만들어, Worksheet가 활성화될 때마다 코드가 실행되지 않도록 하는 것이 바람직합니다.  이러한 이유로, 아래 코드 그림에서 코드 문장들이 주석문인 녹색 글씨로 표시되어 있습니다.

 

위 코드 그림에 표시된 코드 문장들은 설계를 위한 VBA 문장들이 아니고, 단순 엑셀 VBA 문장들이므로 여기서는 별도로 설명하지 않겠습니다.  코드 문장의 구성이나 문법에 대해서는 VBA 도움말을 참고하시기 바랍니다.  VBA 문장들이 일반 영어 단어를 그대로 사용하므로, 문장만 보아도 대강 그 내용을 알 수 있습니다.

1.2.2 계산서 코드

계산서 시트(Sheet2)는 앞 강의에서 설명한 그림 계산서 시트(Sheet1)의 값들을 엑셀의 "=" 함수를 사용해 그대로 가져오도록 엑셀 시트에서 함수 작업을 하였습니다.  즉, Sheet2를 위한 별도의 VBA 계산 코드는 필요 없으며, 단지 Sheet1에서 표시되지 않았던 값들을 Sheet1 계산 시(즉, Sheet1의 Worksheet Change 이벤트 수행 시) Sheet2에 표시하도록 Sheet1의 Worksheet Change 이벤트 코드에 일부 코드를 추가하였습니다.

Sheet2 를 위해 Sheet1에 추가한 VBA 코드는 다음과 같습니다.

1) Sheet2 셀 N33 에 비체적 단위 넣기

위 그림과 같이 Sheet1의 Worksheet Activate 이벤트 창의 코드 하단에 Sheet2의 셀 N33 에 비체적 단위를 넣는 코딩, Sheet2.Range("n33") = xlsStable.sSVOL 을 추가 하였습니다.

 

2) Sheet2 셀 J33 에 비체적 값 넣기 등

위 그림과 같이 Sheet1의 Worksheet Change 이벤트 창의 코드 하단에 Sheet2의 셀 J33 에 비체적 값을 넣는 코딩, Sheet2.Range("j33") = FlashSVOL 을 추가 하였습니다.   FlashSVOL 변수는, 이전의 코드에서 Flash Steam의 비체적 값이 저장된 변수입니다.

계산서 시트에서 Flash Tank 직경을 계산하는 공식을 보여주는데, 사용자의 선정 단위에 관계없이 동일한 공식을 사용하기 위해서 단위 환산 계수를 사용하였습니다.   그 아래의 코드 문장은 동 환산 계수를 계산하는 코드입니다.   계산된 환산 계수는 Sheet2의 셀 G59 에 입력됩니다.

 

2. 다중 계산 엑셀 시트

2.1 디자인

Flash Tank 다중 계산 엑셀 시트는 다음과 같이 디자인하였습니다.  다중 계산 시트란 여러 가지 경우의 계산을 하나의 엑셀 시트에서 수행하는 것을 의미합니다.

2.2 VBA 코딩

2.2.1 엑셀 머리글/바닦글 쓰기

Sheet1과 Sheet2의 머리글과 바닦글은 엑셀의 [페이지 설정] 메뉴에서 직접 써 넣었습니다.   Sheet3에서도 직접 써 넣을까 하다가, 앞으로 작성될 Sheet에서도 계속 사용하기 위하여, VBA 코드로 머리글과 바닦글 쓰는 방법을 찾았습니다.

머리글과 바닦글도 한번 써 넣은 다음 엑셀 파일을 저장하면 그 다음에는 다시 써 넣을 필요가 없으므로, 아래 코드에서와 같이 한번 실행한 다음 주석문으로 바꾸어 놓았습니다.

& ""Times New Roman""은 글자체를 지정하는 형식이며, &16은 글자 크기, &E는 이중 실선 밑줄, &B는 Bold, &F는 파일 이름, &P는 페이지 번호, &N 총 페이지 수, &D는 날짜를 나타냅니다.   자세한 내용은 엑셀 VBA 도움말을 참조 바랍니다.

 

위의 코드로 실행한 머리글/바닦글 쓰기를 보기 위해 미리보기를 한 그림은 다음과 같습니다.

 

2.2.2 Column 별로 계산하기

다중 계산 시트에서는 Column 별로 계산을 해야 합니다.  한 셀의 값을 사용자가 변경하면, 그 셀에 해당하는 Column의 계산만 수행하도록 코딩해야 합니다.

Range 개체를 나타낼 때 Range 문장을 사용하면, 셀을 지칭할 때 Column을 지칭하는 알파벳 글자를 사용해야 하는데, 이는 VBA 코드에서 임의의 Column을 지칭하기에는 부적합 합니다.  그래서 다중 계산 시트에서는 Range 문장 대신에, Range 개체를 나타내는 또 다른 속성인 Cells 속성을 사용합니다.

Sheet3의 코드는 Sheet1의 코드와 동일합니다.  단지 다른 점은 Range 문장 대신에 Cells 속성을 사용한 것입니다.   Sheet1과 Sheet3의 코드를 비교해 보면, 모두 똑 같고 단지 Range 문장이 Cells 문장으로 바뀌었다는 것을 알 수 있습니다.

예를 들어, 아래 그림의 코드 맨 아래 부분의 Sheet1 코드는 다음과 같습니다.

CondPress = Range("e11")

Sheet1에서는 셀 E11에 사용자가 입력한 Saturated Condensate Pressure를 읽어 오기 위하여 위와 같이 코딩을 하였습니다.

Sheet3에서는 사용자가 입력한 Saturated Condensate Pressure가 모든 Column의 Row 5에 있습니다.   사용자가 입력한 셀 개체(Target)의 Column에서 Row 5의 값을 Cells 속성을 사용해 표시하면 다음과 같습니다. (아래 그림의 코드 맨 아래 부분)

CondPress = Cells(5, Target.Column)

엑셀 계산에서 위와 같이 Column 별로 계산하는 경우가 많습니다.   이때 Target.Column 속성을 사용하면 이러한 Column 별 계산을 쉽게 할 수 있습니다.   Row 별로 계산하는 경우에는 Target.Row 속성을 사용하면 되겠지요.(끝)

 


Copyright (c) 2004 ENGSoft Inc., Seoul, Korea, All right reserved.