PERT/CPM을 계산하는 엑셀 파일이다.
[VBA]PERT/CPM를 위한 엑셀 (Spreadsheet for Critical Path Mathod)
건물 에너지, IT와 여러 가지 글들
This is a very simple program for PERT/CPM.
Features
1) Calculate activity times : Earliest Start Time (EST); Earliest Finish Time (EFT); Latest start time (LST); Latest Finish Time (LFT).
2) Calculate the float times(TF, DF, FF) of each activity : Total Float (TF); Dependant Float(DF); Free Float (FF).
3) Determine Critical Path of activities
4) Draw a Gantt Chart
Sheets of program
1) Manual sheet -> includes user manual and warnings.
2) Input sheet -> has input-data area and calculation button.
3) Gantt Chart sheet
Screenshot
Download a file : CriticalPathEng.xls
If you need a korean version file, please click here. (한국어 파일이 필요하면 여기를 누르시오.
VBA Function | 역할 |
---|---|
Abs | 숫자의 절대값을 반환한다. |
Array | 배열을 담고 있는 variant를 반환한다. |
Asc | 문자열의 첫 글자의 ASCII 값을 반환한다. |
Atn | 숫자의 아크탄젠트(arctangent) 값을 반환한다. |
CBool | 부울(boolean) 형식으로 변환한다. |
CByte | 바이트(byte) 형식으로 변환한다. |
CCur | (currency)형식으로 변환한다. |
CDate | Converts an expression to date data type |
CDbl | Converts an expression to double data type |
CDec | Converts an expression to decimal data type |
Choose | Selects and returns a value from a list of arguments |
Chr | Converts an ANSI value to a string |
CInt | Converts an expression to integer data type |
CLng | Converts an expression to long data type |
Cos | Returns the cosine of a number |
CreateObject | Creates an OLE Automation object |
CSng | Converts an expression to single data type |
CStr | Converts an expression to string data type |
CurDir | Returns the current path |
CVar | Converts an expression to variant data type |
CVDate | Converts an expression to date data type |
CVErr | Returns a user-defined error number |
Date | Returns the current system date |
DateAdd | Returns a date with a specific date interval added to it |
DateDiff | Returns a date with a specific date interval subtracted from it |
DatePart | Returns an integer containing a specific part of a date |
DateSerial | Converts a date to a serial number |
DateValue | Converts a string to date |
Day | Returns the day of the month of a date |
Dir | Returns the name of a file or directory that matches a pattern |
DoEvents | Yields execution so the operating system can process other events |
EOF | Returns True if the end of a text file has been reached |
Error | Returns the error message that corresponds to an error number |
Exp | Returns the base of the natural logarithms (e) raised to a power |
FileAttr | Returns the file mode for a text file |
FileDateTime | Returns the date and time when a file was last modified |
FileLen | Returns the number of bytes in a file |
Fix | Returns the integer portion of a number |
Format | Displays an expression in a particular format |
Format Currency | Returns a number as a string, formatted as currency |
FormatDateTime | Returns a number as a string, formatted as a date and/or time |
Format Number | Returns a number as a formatted string |
Format Percent | Returns a number as a string, formatted as a percentage |
FreeFile | Returns the next file number available for use by the Open statement |
GetAll | Returns a list of key settings and their values (originally created with SaveSetting) from an application’s entry in the Windows registry |
GetAttr | Returns a code representing a file attribute |
GetObject | Retrieves an OLE Automation object from a file |
GetSetting | Returns a key setting value from an application’s entry in the Windows registry |
Hex | Converts from decimal to hexadecimal |
Hour | Returns the hour of a time |
IIf | Returns one of two parts, depending on the evaluation of an expression |
Input | Returns a specific number of characters from an open text file |
InputBox | Displays a box to prompt a user for input |
InStr | Returns the position of a string within another string |
InStrRev | Returns the position of a string within another string, beginning at the back end of the string |
Int | Returns the integer portion of a number |
IsArray | Returns True if a variable is an array |
IsDate | Returns True if a variable is a date |
IsEmpty | Returns True if a variable has been initialized |
IsError | Returns True if an expression is an error value |
IsMissing | Returns True if an optional argument was not passed to a Procedure |
IsNull | Returns True if an expression contains no valid data |
IsNumeric | Returns True if an expression can be evaluated as a number |
IsObject | Returns True if an expression references an OLE Automation object |
Join | Returns a string created by joining a number of substrings contained in an array |
LBound | Returns the lower bound of an array |
LCase | Returns a string converted to lowercase |
Left | Returns a specified number of characters from the left of a string |
Len | Returns the length of a string, in characters |
Loc | Returns the current read or write position of a text file |
LOF | Returns the number of bytes in an open text file |
Log | Returns the natural logarithm of a number |
LTrim | Returns a copy of a string with no leading spaces |
Mid | Returns a specified number of characters from a string |
MidB | Returns a specified number of bytes from a string |
Minute | Returns the minute of a time |
Month | Returns the month of a date |
MonthName | Returns a string indicating the specified month |
MsgBox | Displays a modal message box |
Now | Returns the current system date and time |
Oct | Converts from decimal to octal |
Replace | Returns a string in which one substring is replaced with another |
RGB | Returns a number representing an RGB color value |
Space | Returns a string with a specified number of spaces |
Split | Returns an array consisting of a number of substrings |
Sqr | Returns the square root of a number |
Str | Returns a string representation of a number |
Right | Returns a specified number of characters from the right of a string |
Rnd | Returns a random number between 0 and 1 |
Round | Rounds a number to a specific number of decimal places |
RTrim | Returns a copy of a string with no trailing spaces |
Second | Returns the second of a time |
Seek | Returns the current position in a text file |
Sgn | Returns an integer that indicates the sign of a number |
Shell | Runs an executable program |
Sin | Returns the sin of a number |
StrComp | Returns a value indicating the result of a string comparison |
StrConv | Returns a string variant converted as specified |
String | Returns a repeating character or string |
StrReverse | Reverses the character order of a string |
Switch | Evaluates a list of expressions and returns a value associated with the first expression in the list that is True |
Tab | Positions output in an output stream |
Tan | Returns the tangent of a number |
Time | Returns the current system time |
Timer | Returns the number of seconds since midnight |
TimeSerial | Returns the time for a specified hour, minute, and second |
TimeValue | Converts a string to a time serial number |
Trim | Returns a string containing a copy of a specified string without leading spaces and trailing spaces |
TypeName | Returns a string that describes the data type of a variable |
UBound | Returns the upper bound of an array |
UCase | Converts a string to uppercase |
Val | Returns the numbers contained in a string |
VarType | Returns a value indicating the subtype of a variable |
Weekday | Returns a number representing a day of the week |
Weekday Name | Returns a string indicating the specified weekday |
Year | Returns the year of a date |
[Solver의 원리]
1. Solver Uses Generalized Reduced Gradient Algorithm
2. Design and Use of the Microsoft Excel Solver
[Solver의 사용법]
솔버는 여러 가지 용도로 사용할 수 있다. 다음은 여러 영역에서 솔버를 사용한 예이다.
0. https://support.office.com/ko-kr/article/%ED%95%B4-%EC%B0%BE%EA%B8%B0%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC-%EB%AC%B8%EC%A0%9C-%EC%A0%95%EC%9D%98-%EB%B0%8F-%ED%92%80%EA%B8%B0-9ed03c9f-7caf-4d99-bb6d-078f96d1652c
1. Microsoft Excel Solver add-in Examples
2. Quantitative Approaches for Decision Making
[VBA 활용]
VBA를 이용해서 직접 솔버를 호출해서 사용할 수도 있다.
1. Creating Visual Basic Macros that Use Microsoft Excel Solver
엑셀 함수(정확히는 워크시트 함수)에는 분야별로 많은 함수들이 내장되어 있다. 통계, 공학, 재무, 수학/삼각, 논리 등등 많이 있다. 이것을 내 VBA코드에서 활용할 방법은 없을까?
1) VBA 코드 안에서 풍부한 워크시트 함수를 호출하는 방법
1 |
Application.WorksheetFunction.워크시트함수명(범위) |
2) A열 전체 중에서 가장 큰 값을 B1에 읽어오기
1 |
Range("B1")= Application.WorksheetFunction.Max(Range("A:A")) |
3) A열 전체 중에서 가장 큰 값을 가진 셀을 활성화하기
1 |
Range("A:A").Find(Application.WorksheetFunction.Max(Range("A:A"))).Activate |
을 반복법으로 풀어라.
먼저, 주어진 식을 형식으로 변형시킨다.
즉, 으로 변형시킨다. 따라서 가 된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
Option Explicit '허용오차(allowable error) Private Const EPS As Double = 0.00001 'epsilon의 약자. 매우 작은 값 그러나 0은 아니다. 'which stands for epsilon, mean very small but nonzero Sub SolveEquation() Dim x0 As Double Dim x1 As Double ' ' '1) 초기값 x0를 적당히 정한다. x0 = Range("A3") '2) x1 = G(x0)를 계산한다. x1 = G(x0) ' Do Until (Abs(x1 - x0) < EPS) '수렴할 때까지 계산해라. x0 = x1 '//새로 계산한 값(x1)을 이전 값(x0)으로 대체한다. x1 = G(x0) '//다시 새로운 값(x1)을 계산한다. Loop ' ' Range("C3") = x1 End Sub |
풀어야 할 방정식은 다음과 같다.
1 2 3 4 |
Function G(x As Double) As Double ' 계산할 방정식 f(x) = 0 를 x = g(x) 형식으로 변환시킨 것 G = Exp(x) - 5 * Sin(x) + 2.36 * x End Function |
벡터 계산을 위한 구조체 선언
1 2 3 4 5 6 7 |
Option Explicit Type Vector3D '3차원 벡터를 위한 자료 구조 X As Double Y As Double Z As Double End Type |
내적 계산하기
1 2 3 |
Function DotProduct(v1 As Vector3D, v2 As Vector3D) As Double DotProduct = v1.X * v2.X + v1.Y * v2.Y + v1.Z * v2.Z End Function |
벡터의 합
1 2 3 4 5 6 7 8 9 |
Function VectorAddition(v1 As Vector3D, v2 As Vector3D) As Vector3D Dim c As Vector3D ' c.X = v1.X + v2.X c.Y = v1.Y + v2.Y c.Z = v1.Z + v2.Z ' VectorAddition = c End Function |
외적
1 2 3 4 5 6 7 8 9 |
Function CrossProduct(v1 As Vector3D, v2 As Vector3D) As Vector3D Dim c As Vector3D ' c.X = v1.Y * v2.Z - v1.Z * v2.Y c.Y = v1.Z * v2.X - v1.X * v2.Z c.Z = v1.X * v2.Y - v1.Y * v2.X ' CrossProduct = c End Function |
벡터의 크기
1 2 3 |
Function Norm(v1 As Vector3D) As Double Norm = Sqr(v1.X * v1.X + v1.Y * v1.Y + v1.Z * v1.Z) End Function |
벡터의 차를 위한 함수
1 2 3 4 5 6 7 8 9 |
Function MinusVector(v1 As Vector3D) As Vector3D Dim r As Vector3D ' r.X = -v1.X r.Y = -v1.Y r.Z = -v1.Z ' MinusVector = r End Function |
벡터의 비교
1 2 3 4 5 6 7 |
Function Equals(v1 As Vector3D, v2 As Vector3D) As Boolean If (v1.X = v2.X And v1.Y = v2.Y And v1.Z = v2.Z) Then Equals = True Else Equals = False End If End Function |
모든 프로그래밍 언어에는 자신들만의 데이터 형식을 갖고 있다.
다음은 엑셀의 도움말에 있는 내용이다.
데이터 형식 | 저장 용량 | 범위 |
---|---|---|
Byte | 1바이트 | 0부터 255까지 |
Boolean | 2바이트 | True 또는 False |
Integer | 2바이트 | -32,768부터 32,767까지 |
Long (긴 정수) | 4바이트 | -2,147,483,648부터 2,147,483,647까지 |
Single (단정도 부동 소수점) | 4바이트 | -3.402823E38부터 -1.401298E-45까지(음수값). 1.401298E-45부터 3.402823E38까지(양수값) |
Double (배정도 부동 소수점) | 8바이트 | -1.79769313486232E308부터 -4.94065645841247E-324까지(음수값). 4.94065645841247E-324부터 1.79769313486232E308까지(양수값) |
Currency (정수 값 잘림) | 8바이트 | -922,337,203,685,477.5808부터 922,337,203,685,477.5807까지 |
Decimal | 14바이트 | +/-79,228,162,514,264,337,593,543,950,335(소수점 이하 없음); +/-7.9228162514264337593543950335(숫자의 오른쪽으로부터 28번째); +/-0.0000000000000000000000000001(0이 아닌 최소 숫자) |
Date | 8바이트 | 100년 1월 1일부터 9999년 10월 31까지 |
Object | 4바이트 | 모든 개체 참조 |
String (가변 길이) | 10바이트 +문자열 길이 | 0부터 약 20억까지 |
String (고정 길이) | 문자열 길이 | 1부터 약 65,400까지 |
Variant (숫자) | 16바이트 | Double형 범위 내의 모든 숫자 |
Variant (문자) | 22바이트 + 문자열 길이 | 변수 길이 String과 같은 범위 |
사용자 정의 형식 (Type 사용) | 요소가 사용하는 숫자 | 해당 데이터 형식의 범위값과 각 요소의 범위값이 같음 |
메모 모든 데이터 형식의 배열은 20바이트 + 각 차원당 4바이트 + 데이터 자체가 차지하는 바이트 만큼의 메모리를 차지하며, 각 항목의 수에 항목의 크기를 곱하면 데이터가 차지하는 메모리의 용량을 구할 수 있습니다. 예를 들면 2바이트를 차지하는 4개의 Integer 데이터 요소로 된 1차원 배열은 8바이트를 차지합니다. 데이터의 8바이트와 오버헤드 24바이트를 더하면 배열에 필요한 메모리 양은 32바이트가 됩니다.
Variant는 배열 자체보다 12바이트를 더 차지하는 배열을 가지고 있습니다.
메모 StrConv 함수는 문자열 데이터를 다른 형식의 문자열 데이터로 변환할 때 사용된다.
도움말 끝
<개인 생각>
개인적으로 실수는 Double을, 엑셀의 셀을 참조하기 위한 행, 열 관련 변수는 Long으로 하는 것이 좋다.
이 함수들을 호출하는 서브 프로시저는 다음과 같다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
Sub CalculateStastic() ' Dim myScore() As Double '동적 배열 선언. 크기가 결정되어 있지 않음. Dim i As Long Dim 평균 As Double Dim 분산 As Double Dim 표준편차 As Double ' '입력 i = 1 Do While Cells(i, 2) <> "" ReDim Preserve myScore(1 To i) '동적 배열의 크기 재설정(ReDim). 이전에 할당된 값을 보존(Preserve). 'Preserve를 하지 않으면, 크기가 재설정되면서 기존의 값은 모두 초기화 ^^; myScore(i) = Cells(i, 2) i = i + 1 Loop ' '계산 평균 = GetMean(myScore) 분산 = GetVariance(myScore) 표준편차 = GetStandardError(myScore) ' '출력 Cells(1, 4) = 평균 Cells(2, 4) = 분산 Cells(3, 4) = 표준편차 End Sub |
위 코드에는 불필요한 중복이 있다. 어떻게 할 것인가?
You must be logged in to post a comment.