Option Explicit
Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, _
ByVal hdc As Long) As Long
Declare Function GetDeviceCaps Lib "gdi32" (ByVal hdc As Long, _
ByVal nIndex As Long) As Long
Const HWND_DESKTOP As Long = 0
Const LOGPIXELSX As Long = 88
Const LOGPIXELSY As Long = 90
'--------------------------------------------------
Function TwipsPerPixelX() As Single
'--------------------------------------------------
'Returns the width of a pixel, in twips.
'--------------------------------------------------
Dim lngDC As Long
lngDC = GetDC(HWND_DESKTOP)
TwipsPerPixelX = 1440& / GetDeviceCaps(lngDC, LOGPIXELSX)
ReleaseDC HWND_DESKTOP, lngDC
End Function
'--------------------------------------------------
Function TwipsPerPixelY() As Single
'--------------------------------------------------
'Returns the height of a pixel, in twips.
'--------------------------------------------------
Dim lngDC As Long
lngDC = GetDC(HWND_DESKTOP)
TwipsPerPixelY = 1440& / GetDeviceCaps(lngDC, LOGPIXELSY)
ReleaseDC HWND_DESKTOP, lngDC
End Function
건축환경 및 설비 분야에서 공기의 상태값(psychrometrics)을 아는 것이 매우 중요하다.
(Excepted from Wikipedia) Although the principles of psychrometry apply to any physical system consisting of gas-vapor mixtures, the most common system of interest is the mixture of water vapor and air, because of its application in heating, ventilating, and air-conditioning and meteorology. In human terms, our thermal comfort is in large part a consequence of not just the temperature of the surrounding air, but (because we cool ourselves via perspiration) the extent to which that air is saturated with water vapor.
공기 상태를 계산하는 엑셀 프로그램을 여기에 올린다.
사용전 엑셀 보안 설정
– 도구 -> 매크로 -> 보안 -> “보안 수준” 탭에서 “보통”을 선택 (Excel 2003이하)
사용법
1) 시트 안에 있는 “계산기” 단추를 누른다. 2) 알고 있는 두 값을 선택해서 그 값을 입력한 다음 “계산” 단추를 누른다.
예) 건구온도 20도, 상대습도 55%를 입력해서 나머지 값을 구하고자 할 경우 다음과 같이 입력한다.
3) 계산결과는 엑셀 시트와 대화상자 동시에 출력이 된다. 4) 첨부 엑셀 파일(You can download the following file)
공기의 물리적인 상태값은 공기와 관련한 수치계산의 기본이 된다. 공조 설비에서 취급하는 공기는 습공기이기 때문에, 공기조화에 관한 계산은 습공기의 성질을 충분히 파악한 상태에서 가능하다. 이런 습공기의 상태값에는 밀도, 수증기압, 절대습도, 상대습도, 노점온도, 습구온도 등과 함께 습공기가 안고 있는 열량인 엔탈피가 있다.
습공기의 상태값은 표로 제시되기도 하지만, 모든 경우에 대한 자료를 주지 못한다. 이에 가장 기본적인 자료로서 습공기선도를 사용하게 되는데, 습공기의 상태값을 구하는데 사용됨과 동시에 공기조화 프로세스를 설계, 해석하는데도 사용된다.
따라서, 습공기에 대한 이론적인 것을 살펴보고, 상태값을 계산하는 함수와 함께 습공기선도를 그리는 함수를 작성하는 프로그램을 만들었다.
프로그램 제작은 사용자 인터페이스가 좋은 윈도우 환경에서 쓸 수 있게 Visual Basic 6.0 Professional Version으로 하였다.
프로그래밍을 하다보면 기계적으로 반복해야 할 일들이 생긴다. 이런 일들로 일일이 타이핑을 한다는 것은 매우 지루하고 따분한 일이다. 그래서 코드을 자동으로 생성하도록 할 필요가 생긴다. 곧 개발환경의 매크로를 이용하거나, Perl과 같은 문자열 처리기를 통하여 코드를 자동처리하도록 한다. 다음의 사이트도 그 중의 하나이다.
Sub InsertHorizontalLine()
Dim lineString = "//----------------------------------------------------------------------------" + vbCrLf
Dim sel As TextSelection = DTE.ActiveDocument().Selection()
sel.Text() = lineString
End Sub
' Inserts name and date
Sub Signature()
Dim sel As TextSelection = DTE.ActiveDocument.Selection
sel.Insert("// Seungwoo Oh ")
sel.Insert(Format(Date.Today, "yyyy-MM-dd"))
sel.Insert(".")
End Sub
Function Strip(ByVal strLine As String)
If Len(strLine) > 0 Then
nBegin = 1
nEnd = Len(strLine)
For i = 1 To Len(strLine)
c = Mid(strLine, i, 1)
If c <> " " And c <> Tab And c <> Lf And c <> Cr Then
nBegin = i
Exit For
End If
Next
For i = 1 To Len(strLine)
c = Mid(strLine, Len(strLine) - i + 1, 1)
If c <> " " And c <> Tab And c <> Lf And c <> Cr Then
nEnd = Len(strLine) - i + 1
Exit For
End If
Next
Return Mid(strLine, nBegin, nEnd - nBegin + 1)
Else
Return ""
End If
End Function
Sub SortCollection(ByRef oCollection As Collection, Optional ByVal bSortAscending As Boolean = True)
Dim lSort1 As Integer
Dim lSort2 As Integer
Dim vTempItem1 As Object Dim vTempItem2 As Object Dim bSwap As Boolean
For lSort1 = 1 To oCollection.Count - 1
For lSort2 = lSort1 + 1 To oCollection.Count
If bSortAscending Then
If oCollection(lSort1) > oCollection(lSort2) Then
bSwap = True
Else
bSwap = False
End If
Else
If oCollection(lSort1) < oCollection(lSort2) Then
bSwap = True
Else
bSwap = False
End If
End If
If bSwap Then
vTempItem1 = oCollection(lSort1)
vTempItem2 = oCollection(lSort2)
oCollection.Add(vTempItem1, Nothing, lSort2)
oCollection.Add(vTempItem2, Nothing, lSort1)
oCollection.Remove(lSort1 + 1)
oCollection.Remove(lSort2 + 1)
End If
Next
Next
End Sub
Sub SortAndRemoveDuplicatedLine()
Dim objLines As New Collection Dim objSel As TextSelection = ActiveDocument().Selection
Dim objRanges As TextRanges = objSel.TextRanges Dim objStartPt As EditPoint = objRanges.Item(1).StartPoint.CreateEditPoint()
Dim objStream As New StringBuilder
For Each strLine In objSel.Text.Split(Lf)
strLine = Strip(strLine)
If objLines.Contains(strLine) = False Then
objLines.Add(strLine, strLine)
End If
Next
SortCollection(objLines)
For Each strLine In objLines
objStream.AppendLine(strLine)
Next
objSel.Text = ""
objStartPt.Insert(objStream.ToString())
End Sub
2. App.Path 사용시 주의할 점
– 루트 디렉토리일 경우 “\”를 함께 반환한다.
– 루트 디렉토리가 아닐 경우, 끝에 “\”가 없다.
3. 더 좋은 App.Path (출처 : http://www.freevbcode.com/ShowCode.asp?ID=878)
항상 끝에 “\”가 붙게 한다.
[vb]Public Function AppPath() As String
Dim NewPath As String
NewPath = App.Path
If Right(App.Path, 1) <> “\” Then NewPath = NewPath & “\”
AppPath = NewPath
End Function[/vb]
사용예
[vb]’Open “C:\IA Program\입력값\FormData_5장.txt” For Input As #1
Open AppPath & “입력값\FormData_5장.txt” For Input As #1[/vb]
4. 프로그램 시작 경로에서 파일명 가져오기
[vb]Function GetFileName(sFileName As String) As String
Dim FullFilename As String
‘
‘파일이름
If Right$(Trim$(App.Path), 1) = “\” Then
FullFilename = App.Path + sFileName
Else
FullFilename = App.Path + “\” + sFileName
End If
‘
GetFileName = FullFilename
‘
End Function[/vb]
사용예 : FormData_5장.txt를 프로그램시작경로에서 찾는다.
[vb]myFile = GetFileName(“FormData_5장.txt”)[/vb]
5. 전체파일명에서 경로만 뽑아내기
[vb]Function GetPath(strFullFilename As String) As String
‘
Dim strPath As String
strPath = Mid(strFullFilename, 1, InStrRev(strFullFilename, “\”, , vbTextCompare) – 1)
If Len(strPath) = 0 Then
strPath = App.Path
End If
GetPath = strPath
‘
End Function[/vb]
비주얼 베이직 6.0에서 작업을 하다보면 뜻밖에도 이런 것이 안 되다니 하고 느끼는 것이 있다. 바로 마우스의 휠이 먹히지 않는다는 것이다. 마우스로 화면을 스크롤할 수 없다는 것은 정말이지 뜻밖의 복병이다. 윈도우에서 아무런 문제 없이 사용하던 것이 비주얼베이직에만 오면 딱 그 기능이 멎어버린다. (놀라운 MS사의 센스가 아닐 수 없다!)
이 문제를 해결하려고 하면 아래의 파일을 내려받아서 설치하면 간단하게 해결된다.(왜 이것은 VB6에 기본적으로 포함하지 않는 것도 이상하다. 더군다나 패치에서도 해결할 노력이 없다. SP6까지 오면서 개선된 것이 없다. 다행히도 VB.NET에서는 된다.)
2. 내려 받은 실행 파일을 클릭하여 실행시킨다. 3. 압축을 풀 폴더를 임의로 선택한다. (단, 위치는 기억한다. 그리고 설치 폴더를 지우면 안 된다.) 4. 다음과 같이 명령어를 입력하여 등록한다. regsvr32 <압축을 푼 폴더>\VB6IDEMouseWheelAddin.dll 등록되었다는 메시지가 나오면 OK버튼을 클릭한다.
5. Visual Basic 6.0를 실행한다. 6. 메뉴에서 ‘추가기능(Add-Ins)’->추가기능관리자(Add-in Manager)를 선택한다.
7. ‘사용가능한 추가기능’목록 중에서 ‘MouseWheel Fix’를 선택한다. 8. ‘로드 동작’에서 ‘로드/언로드’항목과 ‘시작할 때 로드’항목을 체크(선택)한다. 9. ‘확인’ 버튼을 눌러서 종료한다.
처리해야 할 정보의 양에 맞게 변수를 선언하는 것이 프로그래밍의 기본이다.
그러나, 프로그램을 작성하다보면 처리해야 할 정보의 양이 고정되어 있지 않고 상황에 따라 변하는 경우를 자주 만나게 된다. 그렇다면 정보량이 변하는 경우는 어떻게 변수를 선언하고 관리할 것인가?
비주얼베이직에서는 정보량 변화를 수용하기 위하여 변수 크기에 대하여 동적으로 할당할 수 있는 장치를 마련하였다. 그것이 바로 ReDim이다.
그 사용법을 보면 다음과 같다.
1) 최초 변수를 선언할 때, 그 크기를 비워둔다.
[vb]Dim Data() As Single[/vb]
보통 배열을 선언할 때, 그 크기를 “1 To 10″과 같이 그 크기를 명시하지만, 여기서는 크기를 비워두는 것이 핵심이다.
2) 상황에 따라 배열의 크기를 설정한다.
[vb]ReDim Data(10) As Single
…..
ReDim Preserve Data(100) As Single
ReDim Preserve Data(NumberOfData) As Single[/vb]
상황에 따라 10개가 필요하면 10을 100개가 필요하면 100을, 아니면 특정 변수만큼 필요하면 해당 변수(여기서는 NumberOfData)를 넣어서 그 크기만큼 변수를 만들 수 있다.
이 방법을 사용하는 데 있어서 유의할 것도 있다.
1) 프로그램의 속도가 느려진다.
특히 ReDim을 루프와 같이 반복 계산되는 곳에 두면 프로그램의 속도는 눈에 띄게 느리게 될 것이다. 따라서, 변수의 양이 루프 밖에서도 알 수 있다면 꼭 밖에 두는 것이 현명한 처사이다.
2) 다차원배열의 동적할당
다차원 배열의 동적할당에 있어서는 맨마지막 차원에 대해서만 적용된 것을 명심하자.
[vb]Dim MultiData() As Single
….
ReDim MultiData(NumberOfData,3,4) As Single
ReDim MultiData(NumberOfData+1,3,4) As Single ‘=> 오류발생
ReDim MultiData(3,4,NumberOfData) As Single
ReDim MultiData(3,4,NumberOfData+1) As Single ‘=> 정상작동[/vb]