vba (79)
vba - Scripting.Dictionary
반응형

 

1번 코딩방식 : Late Binding

 

   Dim Dict As Object
   Set Dict = CreateOject("Scripting.Dictionary")

 

위 문장을 아래의 한 문장으로 줄일 수 있다.

 

2번 코딩방식 : Early Binding

   Dim Dict  As New Scripting.Dictionary

https://raymond.tistory.com/2323

 

 

 

반응형
  Comments,     Trackbacks
vba - 고유목록 추출(New Collection,Add)
반응형

고유목록 추출

A열의 목록에서 '고유목록'을 추출하여,
B열에 있는 값들 중 '고유목록'에 해당하는 값들의 합계를 구해서 넣는 것으로
SUMIF함수를 이용하여 값을 구할 수 있다.

고유목록은 New Collection객체를 이용하여 추출할 수 있어서 For Each ~ Next문으로 Add매서드를 이용하여 구할 수 있다.
(New Collection객체는 중복된 항목을 제거하고 고유의 항목만 가지게 하는 객체로서
고유한 목록을 추가해 주는 Add매서드를 반드시 이용하여 작업해야 함)

New Collection객체의 변수 sj에 Add매서드를 이용하여, 공백제거된 문자화된 고유의 목록만 저장
sj.Add Trim(r),CStr(Trim(r))

'-----코드 시작
Dim sj As New Collection
Dim r As Range
Dim k As Long

On Error Resume Next   '중복된 값이 있으면 에러를 발생시킴으로 에러가 나면 그냥 넘어가라
For Each r in Range("A2:A21")
sj.Add Trim(r),CStr(Trim(r))    '고유항목만 뽑아서 공백을 제거하고, 텍스트화
Next
On Error Goto
'-----코드 끝



sj에 저장된 고유의 목록을 k변수의 순서에 따라 For문에 넣어 반복하고, 목록과 값이 들어갈 셀에 넣어주면 됨
(합계를 구하는 함수는 sumif을 이용하여 구해서 넣어줌)


'----코드 시작
For k = 1 to sj.count
Cells(k+1,"d") = sj(k)
Cells(k+1,"e") = Application.Sumif(Range("A2:A21"),sj(k),Range("B2:B21")
Next
'-----코드 끝





Range("A2:A21")와 Range("B2:B21")을 변수처리하여 문장을 조금 더 간단하게 만들어 주어도 될 것 같네요

'----코드 시작-
Dim tk As Range, kr As Range
Set tk = Range("A2:A21")
Set kr = Range("B2:B21")

For k = 1 To sj.count
Cells(k+1,"d") = sj(k)
Cells(k+1,"e") = Applcation.Sumif(tk,sj(k),kr)
Next
'-----코드 끝



https://blog.naver.com/romyok12/222930690848



반응형
  Comments,     Trackbacks
vba - Array(배열)1
반응형

Array(배열)1

[개념]
1개의 변수에 여러 개의 값을 저장하여 활용할 수 있는 자료 구조
Array미적용시
5개 과목(국어,영어,수학,과학,체육)이 있는데, 과목명을 변수에 담아봅시다.
과목이 모두 5개이고 과목명이 문자이니까...
5개의 문자변수를 정의해야 하겠죠
 Dim Subject1 As String
 Dim Subject2 As String
 ....
 ....
 Dim Subject5 As String
 Subject1 = "국어"
 ....
 ....
 Subject5 = "체육"

Array적용시
 Dim Subject(1 to 5) As String
 Subject(1) = "국어"
 ....
 ....
 Subject(5) = "체육"

[Array변수를 정의하는 방법]
방식1 : 
Dim 배열변수(배열크기) As 변수타입
Dim MayArray(5) As String


방식2 :
Dim 배열변수(시작번호 to 끝번호) As 변수타입
Dim MyArray(1 to 5) As String


[Array변수에 값을 저장하는 방법]
방식1(Dim MayArray(5) As String)로 한 경우 :
MyArray(0) = "국어"    '처음 시작번호는 0,  1이 아님!!!!
....
MyArray(4) = "체육"

방식2(Dim MyArray(1 to 5) As String)로 한 경우 :
MyArray(1) = "국어"     '처음 시작번호는 내가 지정한 1!!!
....
MyArray(5) = "체육"


[Array변수에 저장된 값을 불러오는 방법]
Option Explicit 
Sub 배열값 불러오기()
  Dim MyArray(5) As String
         MyArray(0) = "국어"
         MyArray(1) = "영어"
         MyArray(2) = "수학"
         MyArray(3) = "과학"
         MyArray(4) = "체육"
         MsgBox MyArray(1)     '영어가 출력됨
End Sub

 

https://blog.naver.com/mydarlingharbour/223007267848

반응형
  Comments,     Trackbacks
VBA - 중복값 제거(New Collection)
반응형

Sub test()

 

Dim rngA As Range '전체 범위변수
Dim rngB As Range   'For Each를 위한 단일 셀 변수
Dim C As New Collection   '원하는 데이터를 담아줄 Collection선언

Set rngA = Range("C3", Cells(Rows.Count, "c").End(xlUp))
'ranA에는 C3부터 C열 마지막 행까지의 범위를 담아줘
'반복문을 통한 Collection에 값 담아주기

On Error Resume Next


For Each rngB In rngA
'rngA에서 하나의 셀씩 반복해줘
    If Len(rngB) Then  'rngB에 데이타가 있다면
                C.Add Trim(rngB), CStr(Trim(rngB))
               'C라는 Collection에 rngB의 앞뒤 공백을 제거하고 추가해주고,
                         'Key값으로는 CStr을 이용하여 앞뒤공백을 제거해준 rngB값으로 해줘
        End If
Next



Dim i As Long 'Collection을 반복문으로 값을 뿌려주기 위한 변수
     For i = 1 To C.Count ' Collecdtion C의 갯수만큼 반복해줘
     Cells(2 + i, "f") = C(i) '2+i행,f열에 C의 i번째 아이템을  넣어줘
Next

End Sub   '출처 :https://blog.naver.com/mrdjrblog/222456575897

 

[엑셀 VBA 매크로] - 47강 중복값제거 (removeduplicate,고급필터, collection) with 엑셀디자인

[중복값제거] 이번 47강의에서는 중복값을 제거하는 3가지 방법을 공부해보았는데요 3가지 모두 유용하더라...

blog.naver.com

 

 

반응형
  Comments,     Trackbacks
엑셀팁 - 특정 셀의 입력값에 따라 시트이름 자동 변환
반응형

앞선 글 "엑셀팁 - 특정 셀의 클릭시 새로운 시트 생성 & 이름 자동"과는

달리 이번 글은 이미 생성되어 있는 시트의 이름을 특정셀의 값으로 가져오는 것이다.

 

예를들면 홍길동의 자료가 담긴 시트가 있다면, A5셀에  '홍길동'입력하면 그 시트 이름이 '홍길동'으로 자동변환하게 된다.

엑셀에서 '홍길동' 시트 복사하면 시트 이름이 '홍길동 (2)'이 된다.

여기서 A5셀에 '이순신'을 입력하면 시트 이름이 '이순신'으로 자동변환된다.

 


Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
ActiveSheet.Name = ActiveSheet.Range("A5").Value
End Sub


특정 셀의 입력값에 따라 시트이름 자동변환.txt
0.00MB

반응형
  Comments,     Trackbacks
엑셀팁 - 특정 셀의 클릭시 새로운 시트 생성 & 이름 자동
반응형

본 글의 내용은 네이버 지식IN에 올려진 것을 그대로 옮겨왔다.

아래의 코드는 특정 셀에 입력된 내용을 '시트이름'으로 그대로 인용할 수 있는 코드다.

본 코드문에서의 특정 셀은 A2:A1100로 정하였으나 사용자의 의도에 따라 셀 범위를 변경가능하다.

 

주의할 점은 A2:A1100의 셀을 두번 클릭해야만 새로운 시트 생기면서 셀의 내용이 시트이름이 된다는 점이다.

 

 


Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    If Not Application.Intersect(Range("A2:A1100"), Target) Is Nothing Then
        On Error Resume Next
        Dim sh As Worksheet
        Dim shA As Worksheet
        If Target.Value = "" Then Exit Sub
        Set shA = ActiveSheet
        Set sh = Worksheets(CStr(Target.Value))
        If sh Is Nothing Then
            Set sh = Worksheets.Add(, Worksheets(Sheets.Count), 1)
            sh.Name = CStr(Target.Value)
        End If
        shA.Activate
        Cancel = True
    End If
End Sub


더블클릭시 시트생성 코드.txt
0.00MB

반응형
  Comments,     Trackbacks
특정 셀의 값을 시트 이름으로 자동 변경
반응형

요즘 손해평가사 활동을 하면서 한 동안 등한시 했던 엑셀을 다시 활용하기 시작했다.

현장 조사 후 계약자에게 조사결과를 설명해야 하는데, 그 결과값을 엑셀을 활용하여 산출하게 된다.  물론 관련 엑셀파일은 농재협에서 대부분 제공하여 준다.

 

하지만 농재협이 제공한 엑셀파일은 현장에서 사용하기에 약간 부족한 면이 있어 약간 수정할 필요가 있다.

오늘 그 일환으로 인터넷 검색을 통해서 얻은 정보를 내 입맛에 맞게 각색해 정리한다.

 

특정 셀의 값을 시트 이름으로 자동 설정되도록 하는 방법을 인터넷에서 찾았다.

VBA 코드는 다음과 같다.

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
ActiveSheet.Name = ActiveSheet.Range("A3").Value
End Sub

위 코드를 엑셀 비쥬얼 베이직 에디터('Alt + F11'키를 동시 누르면 됨)에 입력하는 방법은 아래 그림을 대체한다.

 

특정 셀의 값을 시트 이름으로 자동 변경

 

특정 셀의 값을 시트 이름으로 자동 변경

 

특정 셀의 값을 시트 이름으로 자동 변경

 

 

코드 입력 후 엑셀파일을 저장시 파일형식을 아래처럼 'Excel 매크로 사용 통합 문서'로 해야 한다.

 

특정 셀의 값을 시트 이름으로 자동 변경

 

이렇게 만든 엑셀 파일이 제대로 작동하는지 확인해 보자.

특정 셀의 값을 시트 이름으로 자동 변경

위 사진은 A3셀에 '홍길동'을 입력한 상태로서 엔터키를 누르기 전의 모습이다.

 

 

엔터키를 누르면~

특정 셀의 값을 시트 이름으로 자동 변경

위 사진에서 보는 것 처럼 Sheet1의 이름이 A3셀 값인 '홍길동'으로 변했다.

 

만약 A3셀이 아닌 다른 셀의 값을 시트이름으로 하고 싶다면, VBA코드의 값을 변경하면 된다.

 

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
ActiveSheet.Name = ActiveSheet.Range("A3").Value
End Sub

 

 

 

반응형
  Comments,     Trackbacks
레이의 VBA정복기8- Vlookup 사용하기
반응형

엑셀 함수 중에서 가장 유용한 함수가 Vlookup함수 아닐까 싶다.

그렇다면 Vlookup기능을 엑셀VBA에서도 구현 가능할까.....?

당연히 가능하다.


앞으로 엑셀VBA를 다시 배워볼 요량이기에 이 글은 메모 차원에서 발행한다.



위 조견표를 기준으로 해서 D3과 D4셀의 입력된 값에 따라 E3,E4에 해당 되는 값을 연결해 주는 함수가 Vlookup이다.


이를 VBA로 코딩하면 아래와 같이 나온다.


각각의 의미는 다른 예제를 통해서 서서히 익혀 나가보자.



이전 관련글 보기  

 - 레이의 VBA정복기7- 숫자를 영어로 변환하는 방법


 - 레이의 VBA정복기6- 숫자를 한글 또는 한자로 변환하는 법


 - 레이의 VBA정복기5- 엑셀 개체 다루기1


 - 레이의 VBA 정복기4 - 개체와 컬렉션 알아보기


 - 레이의 VBA 정복기3 - 프로시저의 종류


 - 레이의 VBA 정복기2 - VBA 구성요소


 - 레이의 VBA 정복기1 - VBA란 무엇인가?



반응형
  Comments,     Trackbacks
최근 작성 글
최근 작성 댓글
최근 작성 트랙백
프로필
공지사항
글 보관함
캘린더
«   2024/12   »
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 28
29 30 31
TODAY TOTAL