본문 바로가기
ITC

EXCEL-VBA 겉핥기

by Un光 2014. 9. 26.
728x90
반응형

변수
Dim (변수명/(배열명(크기)) [As 데이터형]
  데이터 형
  정수    Byte, Integer, Long
  실수    Single, Double
  문자    String
  날짜    Date
  논리    Boolean
  모든데이터    Variant(Default)
  워크북    Workbook
  워크시트    WorkSheet
  셀 범위    Range
Dim Arr1(10) As Double ; (주의)인덱스의 시작0, 끝10, 원소의 개수 11

ReDim 변수재정의
ReDim yld(2 To 11)  인덱스의 시작 2~ 끝11 (default : 0에서 시작)


연산자
+, -, *, /
\        정수나누기    11\5 --> 2
Mod        나머지 
-(수)    부호바꿈
&        문자열 연결    "AB" & "CD"  -->  "ABCD"
>,<,>=,<=,<>
=        (주의)같다
Like        비슷하다        "VBA" Like "V?A"  --> TRUE
(주의) 영문대문자는 영문소문자보다 작다
And,Or,Not,Xor
Eqv        동일값
Imp        A가 TRUE, B가 FALSE일때만 False, 나머지 TRUE, (A imply B;A이면 B이다)


If 문
If 조건1 Then
    (실행1)
[ElseIf 조건2 Then]
    (실행2)
[Else]
    (나머지 실행)
End If


Select Case (조건식 / 변수)
Case 조건1
    (실행1)
Case 조건2
    (실행2)
...
Case Else
    (나머지 실행)
End Select


For 문
For (카운터 변수 = 시작값) To (끝 값)
    (실행)
Next [카운터 변수]

For each sht In ThisWorkBook.Sheets
    (실행)
Next


Do While(조건이 TRUE인 동안)/Until(조건이 TRUE가 될때까지)
    (실행)
Loop

Do
~
Loop While/Until (조건)


문자열 함수
StrComp(비교대상1,비교대상2,[비교방식]) ; 문자열 (크기)비교
  비교방식            값    방식
  vbBinaryCompar        0    이진비교
  vbTextCompare        1    Text비교
  결과값    설명
  -1        비교대상1 < 2
  0        1 = 2
  1        1 > 2
  
StrConv(입력문자열, 변환옵션) ; 문자열을 대소문자나 유니코드 등으로 변환
  변환옵션        값    설명                    
  vbUpperCase    1    대문자로            
  vbLowerCase    2    소문자로
  vbProperCase    3    첫글자만 대문자로
  vbWide            4    1byte 문자를 2byte로    
  vbNarrow        8    2byte -> 1byte
  vbKatakana        16    히라가나->가타가나    (only 일본어버전)
  vbHiragana        32    가타가나->히라가나    (only 일본어버전)
  vbUnicode        64    ANSI->Unicode
  vbFromUnicode    128    Unicode->ANSI
  
Len(문자열) ; 문자열의 길이를 구함

Format()
  플레이스홀더(placeholde ; 포맷을 지시하는 단일문자)
  @        해당위치에 문자가 있으면 표시, 없으면 공백표시
  &        해당위치에 문자가 있으면 표시, 없으면 표시 않음
  >        모든 문자를 대문자로 표시
  <        모든 문자를 소문자로 표시
  !        플레이스홀더를 왼쪽에서 오른쪽으로 채움, (default 오른쪽에서 왼쪽)
  ex
  MsgBox Format("5643300","(@@@)@@@-@@@@") ; ()안의 @@@는 공백으로 채워진다
  MsgBox Format("025653300","(@@@)@@@-@@@") ; 맨앞의 @만 공백
  MsgBox Format("5643300","(&&&&)&&&-&&&&") ; ()564-3300
  MsgBox Format("025653300","(&&&)&&&-&&&&") ; (02)565-3300
  MsgBox Format("5653300","!(@@@)@@@-@@@@") ; (565)330-0
  
InStr([시작위치],string1,string2, 찾는방식) ; 대소문자를 구별하여 어떤 문자를 포함하는지의 여부를 판단하는 함수, 지정된 위치에서 시작(default 첫문자)
(주의)찾는 방식이 지정되면 반드시 시작위치를 지정해 주어야 한다.
  조건                결과
  Len(string1) --> 0    0
  string1=Null            Null
  Len(string2) --> 0    start
  string2=Null            Null
  not exist string2        0
  string2가 string1 내에서 발견    일치된 지점의 위치
  start > string2        0
  ex
  InStr( 1, "Tech on the Net", "the") --> 9
  InStr( "Tech on the Net", "the") --> 9
  Instr( 10, "Tech on the Net", "t" ) --> 15
  
Left(문자열, 추출문자수) ; 문자열로부터 왼쪽에서 문자수만큼의 문자를 반환
  MsgBox Left( "This is a Test", 2) --> "Th"
  
Mid(문자열, 시작위치, 추출문자수) ; 문자열 시작위치에서 추출문자수만큼의 문자를 뽑아 반환
  MsgBox Mid("This is a Test", 6, 2) --> "is"
  
Right(문자열, 추출문자수) ; 문자열의 오른쪽에서 추출문자수만큼 문자를 뽑아 반환
  MsgBox Right("This is a Test", 2) --> "st"
  
LTrim, Trim, RTrim ; 문자내의 공백제거
LTrim ; 문자가 시작되기 전의 왼쪽 공백제거
RTrim ; 문자열의 오른쪽 공백제거
Trim     ; 문자열의 양쪽 공백 제거
(주의)문자열 내의 공백은 제거하지 않음

InStrRev() ; 문자열 내에서 지정한 문자열의 위치를 오른쪽에서 지정한 위치부터 찾는다
Split() ; 지정된 문자열을 기준으로 문자열을 나누어 배열을 반환
Join() ; 문자열 변수의 배열을 연결한 문자열을 반환
Replace() ; 문자열 내의 문자를 지정한 문자로 바꿈
Space() ; 지정한 수 만큼의 공백 문자열을 반환
StrReverse() ; 문자열의 순서를 거꾸로 만들어서 반환
MonthName() ; 해당 숫자를 월로 표기 1~12
WeekDayName() ; 해당 숫자를 요일로 반환 1~7/월~토
UCase() ; 문자를 모두 대문자로 반환
LCase() ; 문자를 모두 소문자로 반환


날짜
1998년 8월 22일 오후3시 --> 36029.625
36029 ; 1899년 12월 30일 이후부터 1998년 8월 22일은 36029번째 날
.625 ; 15시 / 24시, 24시를 100으로 보고 소수로 표시한다

날짜 literal
VBA에서는 날짜표시를 # #로 묶어 표현한다
  ex
  #8/22/1998#
  #03:00 PM#
  #8/22/98 3:00:00 PM#
  
Now        현재의 날짜와 시간
Date    현재 날짜
Time    현재시간
  ex 
  Msg Now & Chr(13) & Date & Chr(13) & Time ; VBA에서 개행은 Chr(13) -->
  위의 함수를 이용해서 현재의 날짜와 시간을 바꿀 수도 있다.
  
날짜 추출함수
DatePart(날짜값) ; 모두
Year(날짜값) ; 년도
Month(날짜값) ; 월
Day(날짜값) ; 날
WeekDay(날짜값) ; 요일
Hour(날짜값) ; 시간
Minute(날짜값) ; 분
Second(날짜값) ; 초
  
WeekDay( 날짜, 옵션)
  옵션 ; 주의 시작 요일을 결정
  vbUseSystem    0    NLS API 설정 사용
  vbSunday        1    일요일 ; default
  vbMonday        2    월요일
  vbTuesday        3    화요일
  vbWednesDay    4    수요일
  vbThursDay        5    목요일
  vbFriday        6    금요일
  vbSaturday        7    토요일
  
DatePart(옵션, 날짜값)
  옵션    설명
  yyyy    년도
  q        분기
  m        달
  y        년중 몇번째 날인지
  d        날짜
  w        요일
  ww    년중 몇번째 주인지
  h        시
  n        분
  s        초

날짜와 시간 연결 함수
DateSerial( 년도, 월, 일)
TimeSerial( 시, 분, 초)

날짜 연산
DateAdd(Interaval 옵션, 더할 값, 날짜값) ;
  Interaval 옵션 ; 연산할 시간의 단위 지정 -> DatePart와 같음
  ex
  DateAdd("yyyy", 1, Now) --> 내년

DateDiff(Interval 옵션, 날짜값1, 날짜값2 [, FirstDayOfWeek][, FirstWeekOfYear]) ; 날짜값1 -> 날짜값2이 과거이면 음수, 미래이면 양수
  FirstDayOfWeek ; 한주를 시작하는 요일
  FirstWeekOfYear ; 일년을 시작하는 주
  ex
  Dim TheDate As Date
  TheDate = InputBox("Enter a date")
  MsgBox "Days from today : " & DateDiff("d", Now, TheDate)
  (주의)Interval 옵션보다 작은 시간단위에 대해서는 고려하지 않음


수학함수
Exp() ; E(== ~2.718282....)^2, Exp함수는 Log 함수의 여함수이며 역로그함수이다. 입력값이 709.782712893보다 크면 에러를 일으킨다.
Log() ; 자연로그값, 입력값 > 0 이어야 한다.
Sqr() ; 제곱근 값, 입력값 > 0 이어야 한다.
Sgn() ; 부호(-1 | 1), 0이면 0

삼각함수 ; 각의 단위로 라디안(=각 x Pi / 180)을 사용한다.
Sin()
Cos()
Tan()
Atn() ; 아크탄젠트
이외의 것은 유도해서 사용한다.
Secant                Sec(X) = 1 / Cos(X)
Cosecant            Cosec(X) = 1 /Sin(X)
Cotangent            Cotan(X) = 1 /Tan(X)
Inverse Sine            Arcsin(X) = Atn(X / Sqr(-X * X + 1))
Inverse Cosine        Arccos(X) = Atn(-X / Sqr(-X * X + 1)) + 2 * Atn(1)
Inverse Secant        Arcsec(X) = Atn(X / Sqr(X * X ?1)) + Sgn((X) ?1) * (2 * Atn(1))
Inverse Cosecant        Arccosec(X) = Atn(X / Sqr(X * X - 1)) + (Sgn(X) ?1) * (2 * Atn(1))
Inverse Cotangent    Arccotan(X) = Atn(X) + 2 * Atn(1)
Hyperbolic Sine        HSin(X) = (Exp(X) ?Exp(-X)) / 2
Hyperbolic Cosine    HCos(X) = (Exp(X) + Exp(-X)) / 2
Hyperbolic Tangent    HTan(X) = (Exp(X) ?Exp(-X)) / (Exp(X) + Exp(-X))
Hyperbolic Secant    HSec(X) = 2 / (Exp(X) + Exp(-X))
Hyperbolic Cosecant    HCosec(X) = 2 / (Exp(X) ?Exp(-X))
Hyperbolic Cotangent    HCotan(X) = (Exp(X) + Exp(-X)) / (Exp(X) ?Exp(-X))
Inverse Hyperbolic Sine        HArcsin(X) = Log(X + Sqr(X * X + 1))
Inverse Hyperbolic Cosine        HArccos(X) = Log(X + Sqr(X * X ?1))
Inverse Hyperbolic Tangent    HArctan(X) = Log((1 + X) / (1 ?X)) / 2
Inverse Hyperbolic Secant        HArcsec(X) = Log((Sqr(-X * X + 1) + 1) / X)
Inverse Hyperbolic Cosecant    HArccosec(X) = Log((Sgn(X) * Sqr(X * X + 1) + 1) / X)
Inverse Hyperbolic Cotangent    HArccotan(X) = Log((X + 1) / (X ?1)) / 2
Logarithm to base N    LogN(X) = Log(X) / Log(N)

진법변환 ; 2진변환을 위한 함수는 없다
Hex    
Oct
Val ; &H, &O로 시작하는 16진수, 8진수 값을 Double형 10진수로 변환


텍스트 파일 핸들링
  FreeFile([rangenumber])
  rangenumber, default 0 --> 1~255범위의 파일 번호를 반환, 1--> 256~ 511
  ex
  Dim hFile As Long ; hFile이라는 정수형 변수를 선언
  hFile=FreeFile ; FreeFile함수를 사용하여 파일 번호를 얻음
  
파일 열기/닫기
Open pathname For mode [Access access] [lock] As [#] filenumber [Len=reclength]
  pathname ; 파일의 전체 경로 및 이름을 지정하는 문자열
  mode ; Appen, Binary, Input(읽기), Output(새로쓰기), Randim(default. 램덤 액세스파일)
  access ; 열려있는 파일에서 허용하는 작업을 지정 Read, Write, Read Write, 네트워크나 OS의 보안설정과 관련하여 설정
  lock ; 다른 프로세스에 의해 열려 있는 파일에 허용하는 작업 Shared, Lock Read, Lock Write, Lock Read Write
  filenumber ; 1~511의 유효한 파일 번호 FreeFile함수로 사용가능한 파일 번호를 얻는다
  reclength ; -32767 보다 작은 수, 랜덤 액세스파일의 경우 이 값은 레코드 길이가 되며 순차 파일의 경우 이 값은 버퍼에 있는 문자의 수
  ex
  Open "TESTFILE" For Input As #1 ; 순차파일, 읽기용
  ` 파일의 다른 모드로 다시 열기 전에 닫습니다..
  Close #1
  Open "TESTFILE" For Output Shared As #1 ; 순차파일 출력용, 어떤 프로세스에서도 읽기나 쓰기가 가능
  ' 파일을 다른 모드로 다시 열기 전에 닫습니다.
  Close #1
  Open "TESTFILE" For Binary Access Write As #1 ; 쓰기 작업만을 위해 이진 모드로 파일을 연다
  ' 파일을 다른 모드로 다시 열기 전에 닫습니다.
  Close #1
  Open "TESTFILE" For Binary Access Read Lock Read As #1
  
파일의 읽기와 쓰기 ; 파일의 오픈 모드에 따라 사용하는 읽기/쓰기 구문이 다르다
Open모드            Read작업                Write작업
Input,Output,Appen    Input.Input #, Line Input #    Print #, Write #
Random                Get                        Put
Binary                Input,Get                    Put

Input(number,[#]filenumber) ; 한 개의 문자를 읽음
  number ; 읽을 문자의 갯수를 지정
Input #filenumber(seperator) varname1(seperator) varname2(seperator) ... ; 한 줄을 읽어들인 후 분리하여 각각의 변수에 저장
  ex
  ' 사용가능한 파일번호 얻기
  iFileNum = FreeFile
  ' 현재 디렉토리에 있는 person.txt파일 열기
  Open "person.txt" For Input As iFileNum
  ' 데이터 읽기
  Iput #iFileNum, strNume,strNumber,strDepart
  ' 데이터 출력
  txtName.Text = strName : txtNumber.Text = strNumber : txtDepart.Text = strDepart

Line Input # 문
Line Input#문은 열려 있는 순차 파일에서 하나의 행을 읽어서 String 변수에 저장한다.
Line Input #filenumber, varname
  ex
  fn = FreeFile
  ' 파일 읽을 수 있도록 열어준다.
  Open "test.txt" For Input As #fn
  ' 파일의 내용을 읽어 온다.
  Do While Not EOF(fn)
    Line Input #fn, File_Line
    File_Line = File_Line & vbCrLf
    File_Data = File_Data & File_Line
  Loop
  ' 파일을 닫아 준다.
  Close #fn
  ' 읽어온 내용을 직접실행창에 출력한다.
  Debug.Print File_Data
  
Print # 문
Print #filenumber, output ; 파일에 데이터를 쓰기 위해서는 Print # 문을 사용한다.
여러 개의 output을 사용하는 경우 컴마(,) 또는 세미콜론(;)으로 구분한다. 컴마를 사용하면 출력하는 데이터 사이에 탭 (Tab)을 두는 것이고 세미콜론(;)을 사용하면 바로 붙여서 출력한다. 출력시 형식을 지정하려면 Spc(), Tab()함수등을 같이 사용한다.
  Sub demo_Print()
    Open "TESTFILE.txt" For Output As #1 ' 출력을 위해 파일을 엽니다.
    Print #1, "This is a test" ' 텍스트를 파일에 출력합니다.
    Print #1, ' 파일에 공란을 출력합니다.
    Print #1, "Zone 1"; Tab; "Zone 2" ' 두 인쇄 영역에 출력합니다.
    Print #1, "Hello"; " "; "World" ' 문자열을 공백으로 구분합니다.
    Print #1, Spc(5); "5 leading spaces " ' 5개의 공백으로 문자열을 구분합니다.
    Print #1, Tab(10); "Hello" ' 10열에 단어를 인쇄합니다.
    ' Boolean, Date, Null과 Error 값을 할당합니다.
    Dim MyBool, MyDate, MyNull, MyError
    MyBool = False
    MyDate = #2/12/1969#
    MyNull = Null
    MyError = CVErr(32767)
    ' True, False, Null과 Error 시스템 설정에 따라 번역합니다
    ' 날짜 문자열은 표준 약식 날짜 형식을 사용하여 적습니다.
    Print #1, MyBool; " is a Boolean value"
    Print #1, MyDate; " is a date"
    Print #1, MyNull; " is a null value"
    Print #1, MyError; " is an error value"
    Close #1 ' 파일을 닫습니다
  End Sub


Write # 문
데이터를 순차 파일에 기록한다.
Write #filenumber, outputlist
Write # 문으로 기록된 데이터는 일반적으로 Input #을 사용하여 읽는다. 이것은 Print#과 달리 출력하는 데이터의 형식에 맞추어 파일에 기록한다. 가령 문자열 데이터를 출력하면 쌍따옴표안에 데이터를 입력한다. 숫자 데이터는 항상 마침표를 소수 구분 기호로 사용하여 파일에 기록된다. Boolean 데이터의 경우 #TRUE# 또는 #FALSE#가 파일에 기록되고. Date 데이터는 일반적인 날짜 형식을 사용하여 파일에 기록된다.
  Sub demo_Write()
    Open "TESTFILE.txt" For Output As #1 ' 출력을 위해 파일을 엽니다.
    Write #1, "Hello World", 234 ' 쉼표로 구분된 데이터를 작성합니다.
    Write #1, ' 비어있는 행을 작성합니다.
    Dim MyBool, MyDate, MyNull, MyError
    ' Boolean, Date, Null과 Error 값을 할당합니다.
    MyBool = False
    MyDate = #2/12/1969#
    MyNull = Null
    MyError = CVErr(32767)
    ' Boolean 데이터는 #TRUE#나 #FALSE#로 작성됩니다. 날짜 문자열은
    ' 일반적인 날짜 형식으로 작성됩니다. 예를 들면 #1994-07-13#
    ' 1994년 7월 13일을 나타냅니다. Null 데이터는 #NULL#로 작성됩니다.
    ' Error 데이터는 #ERROR errorcode#로 작성됩니다.
    Write #1, MyBool; " is a Boolean value"
    Write #1, MyDate; " is a date"
    Write #1, MyNull; " is a null value"
    Write #1, MyError; " is an error value"
    Close #1 ' 파일을 닫습니다.
  End Sub
  
기타 순차파일 관련 구문
LOF(filenumber) ; 파일의 크기를 바이트단위로 알려줌
  ex
  Dim FileLength
  Open "TESTFILE" For Input As #1 ' 파일을 엽니다.
  FileLength = LOF(1) ' 파일의 길이를 구합니다.
  Close #1 ' 파일을 닫습니다.
  
FileLen(파일명) ; 파일의 길이(바이트)를 알아냄
  ex
  MySize = FileLen("TESTFILE") ' 파일길이(바이트)를 반환

EOF(filenumber) ; 파일의 끝인가를 Boolean 값으로 반환
  ex
  Dim InputData
  Open "MYFILE" For Input As #1 
  Do While Not EOF(1)
    Line Input #1, InputData
    Debug.Print InputData
  Loop
  Close #1
  
파일열기 대화상자
GetOpenFilename(FileFilter, FilterIndex, Title, ButtonText,MultiSelect)
  FileFilter
  열려는 파일의 종류를 지정하는 요소 (default : "모든 파일(*.*),*.*")
    ex
    "텍스트(*.txt),*,txt,추가 기능(*.xla),*,xla" --> 두 종류의 파일에 대한 필터를 지정, 
  FilterIndex
  위의 파일필터에서 가장 먼저 보일 필터의 번호를 지정, 1부터 지정한 개수까지 기본 파일 필터링 조건의 인덱스 번호를 지정
  생략(default)나 현재 파일 필터 수보다 크면 첫 번째 필터가 사용됨(1)
  Title
  대화 상자 제목을 지정, (default  : 열기)
  MultiSelect 
  default : FALSE ; 하나의 파일 이름만 선택할 수 있다.
  TRUE이면 여러개의 파일 이름을 사용할 수 있다.
  ex
  fileToOpen = Application.GetOpenFilename("Text Files (*.txt),*.txt")
  If fileToOpen <> False Then
    MsgBox "Open " & fileToOpen  ' 연 파일의 이름을 출력
  End If

파일저장 대화상자
GetSaveAsFilename(FileFilter, FilterIndex, Title, ButtonText,MultiSelect)


Example 1
Sheet1에 $B$16:$C$20 셀 영역에 콜 옵션 이론가격 계산(블랙숄즈 방정식)에 필요한 데이터가 s, k, r, T,v의 순서로 입력되어있고 "계산" 버튼을 클릭하면 방정식을 계산하여 $C$22에 콜옵션 이론가격을 출력한다.
    Sub black_scholes()
        Dim Sht    As Worksheet    'Object형 변수
        Dim col    As Long
        Dim s, k, T, r, v    As Double
        Dim d1, d2, c    As Double
        col = 3
        ' Object형 변수 Worksheet의 입력 방식 ; Set 변수명 = 값
        ' Sheet1의 이름이 연습1이라면 Set sht = Worksheets("연습1")로 사용할 수도 있다
        Set sht = Sheet1        
        Sheet1.Cells(row,columns)
        s = Sheet1.Cells(16, col).Value
        k = Sheet1.Cells(17, col).Value
        r = Sheet1.Cells(18, col).Value
        T = Sheet1.Cells(19, col).Value
        v = Sheet1.Cells(20, col).Value
        d1 = Log(s / k) + (r + Application.WorkSheetFunction.Power(v, 2) * 0.5 ) * T
        d1 = d1 / (v * Sqr(T))
        d2 = d1 - v * Sqr(T)
        
        With Application.WorksheetFunction
            c = s * .NormSDist(d1) - k * Exp(-r * T) * .NormSDist(d2)
        End With
        ' 셀에 결과를 입력
        Sheet1.Cells(22, col) = c
    End Sub 


????
response
With Application.WorksheetFunction ~ End With

+ 엑셀에 범위 지정을 잘못하면 10만줄까지 쓴다. 


반응형

'ITC' 카테고리의 다른 글

오라클 클라우드 항시 무료 인스턴스의 회수  (0) 2023.10.15
SSL 보안 서버 설치 방법  (0) 2018.12.20
OS별 시리얼 확인  (0) 2016.06.22
OneNote 2013 무료화  (0) 2014.09.17
Chrome 클래스가 등록되지 않았습니다.  (0) 2014.06.18