땡큐엑셀vba & 엑셀매크로

 

 

'http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=102020101&docId=280473561
'
'H열과 I열의 합계를 J열에 자동으로 합계가 나오게 하려면 어떻게 해야하죠?
'행삽입이나 삭제 해도 J열에 자동으로 합계 나타내게.........
'수식넣지 않고 값만 자동으로 합계 나타날수 있게 하려면 어떻게 해야하는지 알려주세요~
'데이터는 계속 밑으로 더 늘어날수도 있어요 도와주세용~!



'Worksheet의 change이벤트를 사용합니다.
'H열,I열에 숫자를 넣으면 J열에 합계가 자동으로 출력됩니다.
'
'source by 땡큐엑셀vba & 엑셀매크로
'
Private Sub Worksheet_Change(ByVal Target As Range)
    On Error Resume Next

    'H열에 포함될때
    If Not Intersect(Target, Range("H:H")) Is Nothing Then
        h값 = Target
        i값 = Target.Offset(0, 1)
        
        Target.Offset(0, 2) = h값 + i값
    End If
    
    
    'I열에 포함될때
    If Not Intersect(Target, Range("I:I")) Is Nothing Then
        h값 = Target.Offset(0, -1)
        i값 = Target
        
        Target.Offset(0, 1) = h값 + i값
    End If
    
    
End Sub

 

Worksheet_Change이벤트를 이용한 자동합계-땡큐엑셀vba.xlsm
0.05MB

 

 

단어 시트

 

실행전

 

실행 결과

 

'https://kin.naver.com/qna/detail.nhn?d1id=1&dirId=102020101&docId=301558642
'
'
'
'여러 개의 단어들이 셀의 내용에 포함되어 있는지 알고 싶을 때 어떻게 해야할까요?
'예를들어, "aaa", "bbb", "ccc"가 포함되어 있는 셀을 찾고 싶을때,
'어떤 셀의 내용이 abcbccccc라면 true가 리턴되고,
'어떤 셀은 zbcd 라면 false가 결과값으로 나오게 하고 싶습니다.
'예시는 간단하게 들었지만, 찾아야 하는 단어수는 수백개이고,
'대상이 되는 문자열은 수십만개여서 VBA 함수를 작성하는 것이 필요합니다.
'문자열 처리에 관한 공부도 할겸 질문드리오니, 코드 작성 부탁드려요~^^


'
' Source by 땡큐엑셀vba & 엑셀매크로
'
Sub Main()

    'B열 clear
    Range("B:B").ClearContents
    
    
    Set rng단어 = Sheets("단어").Range("A1").CurrentRegion
    Set rng찾을범위 = Range("A1").CurrentRegion
    
    '모든 단어에 대해 검색
    For Each ea In rng단어
        
        찾을값 = ea
        
        
         '1.검색
         Set rng = rng찾을범위.Find(what:=찾을값, lookat:=xlPart)
    
        
         If Not rng Is Nothing Then '검색결과가 있다면
            strAddr = rng.Address  '첫 위치 주소
            
            '2.검색결과가 없을때 까지 루프
            Do

                If rng.Offset(0, 1) = "" Then
                    rng.Offset(0, 1) = 찾을값
                Else
                    rng.Offset(0, 1) = 찾을값 & "," & rng.Offset(0, 1) '검색 단어를 주~~욱 나열
                End If
                
                Set rng = rng찾을범위.FindNext(rng) '다음값으로
                
            Loop While Not rng Is Nothing And rng.Address <> strAddr
         End If
            
    
    Next
    
    
    MsgBox "완료되었습니다", vbInformation, "땡큐엑셀vba & 엑셀매크로"
    

End Sub

여러 개의 단어들이 셀의 내용에 포함되어 있는지 알고 싶을 때 어떻게 해야할까요-find_findnext-땡큐엑셀vba.xlsm
0.11MB

실행전

 

 

실행 결과

 

'변수를 선언하고 사용하기
Option Explicit

' 파일명의 앞글자와 일치하는 폴더로 이동하기
' 예를 들어 파일명이 aaasddf.txt인 경우 "a파트"라는 폴더로 이동
'           파일명이 1zsdfd.exe인 경우 "1파트"라는 폴더로 이동
'
'source by 땡큐엑셀vba & 엑셀매크로
'
Sub 파일이동()


    Dim strPath As String                              '폴더의 경로를 넣을 변수
    Dim fileName As String                             '각 파일 이름을 넣을 변수
    Dim i As Integer
    Dim msg As String
    Dim 이동폴더명 As String
    
    
    
    'Application.ScreenUpdating = False         '화면 업데이트 (일시) 정지
    Cells.Clear
    
    
    ' 폴더 선택창
    With Application.FileDialog(msoFileDialogFolderPicker)  '폴더선택
        .Show                                               '폴더 선택창 띄우기
 
        If .SelectedItems.Count = 0 Then          '취소 선택시
            Exit Sub
        Else                                      '폴더를 선택한 경우
            strPath = .SelectedItems(1) & "\"     '폴더 경로를 변수에 넣음
        End If
    End With
    
    
    ' 폴더내 파일 유무 확인
    fileName = Dir(strPath & "*.*")               '모든 파일
 
    If fileName = "" Then                         '파일이 없으면
        MsgBox "파일이 없습니다.", vbInformation, "땡큐엑셀vba"               '메시지 출력
        Exit Sub                                  '매크로 중단
    End If
            
            
    Do While fileName <> ""                       '파일이 존재하면
    
        i = i + 1

        '파일의 첫글자를 가지고 폴더명 만들기
        이동폴더명 = Left(fileName, 1) & "파트\"
        
        If Dir(strPath & 이동폴더명, vbDirectory) = "" Then '해당 폴더가 없다면
            MkDir strPath & 이동폴더명  '폴더생성
        End If
        
        
        '파일의 첫글자와 동일한 폴더로 이동
        If Dir(strPath & 이동폴더명 & fileName) <> "" Then           '동일한 파일이 있으면 이동하지 않음
            msg = "Fail"
        Else
            msg = "OK"
            Name strPath & fileName As strPath & 이동폴더명 & fileName    '파일 이동
        End If


        '전체경로
        Cells(i, "A") = strPath & fileName
        '처리결과
        Cells(i, "B") = msg
        
        
        fileName = Dir(strPath & "*.*") '다음 파일
        
    Loop

    '열너비 자동 맞춤
    Columns.AutoFit
    
    '종료 메시지창 출력
    MsgBox "완료되었습니다.", vbInformation, "땡큐엑셀vba & 엑셀매크로"
    
End Sub




 

같은철자로시작하는 폴더로 파일이동-FileDialog_Dir_MkDir_Left_AutoFit-땡큐엑셀vba.xlsm
0.05MB

 

실행전

 

실행후

'검색어가 포함된 모든 엑셀파일(파일명,시트명,셀주소,내용) 출력하기

'순서
'1. 폴더를 선택
'2. 폴더내에 존재하는 *.xls* 파일을 하나씩 오픈한후
'3. 1번 시트부터 마지막시트까지 검색하면서 결과 출력
'4. 파일닫고 다음파일
'5. 2~4번 반복수행

'
'Source by 땡큐엑셀vba & 엑셀매크로
'
Sub 폴더내검색()
    Dim sht As Worksheet
    Dim wsht As Worksheet '결과기록 시트
    Dim strAddr As String
    Dim rng As Range
    Dim findString As String '찾을값
    
    findString = Cells(1, "B") '찾을값
    Set wsht = ActiveSheet '결과기록 시트
    
     
    If findString = "" Then Exit Sub '검색어를 입력안한 경우 종료
    Application.ScreenUpdating = False '화면 업데이트 정지
    
    
    Range("A2:Z" & Rows.Count).Clear '검색결과를 기록하기 위하여 b1:Z 마지막 셀까지 Clear
    

    
    '1.폴더 선택
    With Application.FileDialog(msoFileDialogFolderPicker)  '폴더선택
        .Show                                               '선택창 띄우기
 
        If .SelectedItems.Count = 0 Then          '취소 선택시 종료
            Exit Sub
        Else                                      '폴더를 선택한 경우
            strPath = .SelectedItems(1) & "\"     '폴더 경로를 변수에 넣음
        End If
    End With
    
    
    ' 폴더내 파일 유무 확인
    fileName = Dir(strPath & "*.xls*")            '엑셀파일만 검색
 
    If fileName = "" Then                         '파일이 없으면
        MsgBox "파일이 없습니다.", vbInformation, "땡큐엑셀vba"               '메시지 출력후 종료
        Exit Sub
    End If
    
    
    
    Do While fileName <> ""                       '파일이 존재하면
        xlfile = strPath & fileName     '파일명을 포함한 전제경로를 변수에 넣음
        
        '2.파일오픈
        Workbooks.Open fileName:=xlfile, UpdateLinks:=False, ReadOnly:=True '읽기 전용및 업데이트 안하는 조건으로 파일오픈
    
    
        '3.전체 시트를 돌면서 검색
        For Each sht In Sheets
            With sht.Cells '시트의 전체셀
            
                Set rng = .Find(what:=findString, lookat:=xlPart) '검색

                
                If Not rng Is Nothing Then '검색결과가 있다면
                    strAddr = rng.Address  '첫 위치를 기록
                    
                    '한 시트에서 검색결과가 없을때 까지 루프
                    Do
                        
                        wsht.Cells(Rows.Count, "A").End(3)(2) = fileName    'A열 : 파일명
                        wsht.Cells(Rows.Count, "B").End(3)(2) = sht.Name    'B열 : 시트명
                        wsht.Cells(Rows.Count, "C").End(3)(2) = rng.Address 'C열 : 셀주소
                        wsht.Cells(Rows.Count, "D").End(3)(2) = rng         'D열 : 셀내용
                        
                        Set rng = .FindNext(rng)    '다음으로
                    Loop While Not rng Is Nothing And rng.Address <> strAddr
                End If
                
            End With
        Next
        
    
        '4.파일닫기
        Workbooks(fileName).Close savechanges:=False '파일닫기
    
        fileName = Dir                               '다음파일
        
    Loop
    
    
    wsht.Columns.AutoFit              '열너비 자동 맞춤
    Application.ScreenUpdating = True '화면 업데이트 재개
    
    



    '종료 메시지
    MsgBox "완료되었습니다.", vbInformation, "땡큐엑셀vba & 엑셀매크로"
    
End Sub
    


폴더에서 검색어가 포함된 모든엑셀파일 출력하기-땡큐엑셀vba.xlsm
0.02MB

 

 

실행전

 

실행후

'http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=102020101&docId=279757774
'
'안녕하세요.
'엑셀 관련 문의드립니다.
'첨부파일 "test.xls"의  B열(주문번호) 값을 기준으로
'동일한 값의 위아래에만 굵은 테두리를 넣으려면 어떤 방법이 있을까요?
'첨부파일 "test-테두리선작업.xls"처럼 작업되면 됩니다.
'자료가 1만건 이상인데 일일이 테두리선 넣기를 하다보니 너무 시간이 오래걸려서요.
'엑셀고수님께 조언 부탁드립니다.
'감사합니다.




'주문번호가 정렬되어 있다는 가정하에 아래의 코드를 수행하세요.
'
'source by 땡큐엑셀vba & 엑셀매크로
'
Sub 블럭별테두리()
    Dim 범위 As Range
    Dim Rng As Range
    
    
    '화면갱신 중지
    Application.ScreenUpdating = False
    
    마지막행 = Cells(Rows.Count, "A").End(xlUp).Row
    
    '이중루프를 사용함
    '2행부터 마지막행까지 루프
    For i = 2 To 마지막행
        '주문번호를 기준으로 비교
        주문번호 = Cells(i, "B")
        시작행 = Cells(i, "B").Row
        
        '같은 주문번호의 끝을 찾아 굵은 테두리 그리기
        For j = i To 마지막행
            다음주문번호 = Cells(j, "B")
            
            '같을경우 동일행 업데이트
            If 주문번호 = 다음주문번호 Then
                동일행 = Cells(j, "B").Row
            Else
                '주문번호가 다른값인 경우 테두리 그리기
                Set Rng = Range(시작행 & ":" & 동일행)

                '윗줄 굵은 테두리
                With Rng.Borders(xlEdgeTop)
                    .LineStyle = xlContinuous
                    .ColorIndex = 0
                    .TintAndShade = 0
                    .Weight = xlMedium
                End With
                
                '밑줄 굵은 테두리
                With Rng.Borders(xlEdgeBottom)
                    .LineStyle = xlContinuous
                    .ColorIndex = 0
                    .TintAndShade = 0
                    .Weight = xlMedium
                End With
                
                
                i = j - 1
                Exit For
            End If
            
        Next j
        
    
    Next i
    
    
    '화면갱신 재계
    Application.ScreenUpdating = True
    
    
    MsgBox "완료되었습니다", vbInformation, "땡큐엑셀vba & 엑셀매크로"
    
End Sub

같은 주문번호별 테투리-ScreenUpdate_Rows.count_End_Border_xlMedium-땡큐엑셀vba.xlsm
0.05MB

7/3에 필터적용

 

31시트에 보이는 값만 복사

 

'http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040103&docId=280190504
'
'vba 초보입니다 그림과 파일과 같이 해당 열로 필터 후 값이 보이는 행만 복사하는 vba를 만들고자합니다


'
'source by 땡큐엑셀vba & 엑셀매크로
'
Sub 보이는셀만복사()
    
    '출력행의 시작
    i = 7
    k = 0
    iDay = Range("A1") '선택열
    'iDay = Range("A1") '날짜
    'iStart = 13 '13은 M열.. 1:A, 2:B ....
    
    마지막행 = Range("C" & Rows.Count).End(xlUp).Row
    For Each rngC In Range("C4:C" & 마지막행)       'C4셀부터 마지막셀까지 순환
    
        If Rows(rngC.Row).Hidden = True Then        '만약 행이 숨겨져 있다면
            'Skip
        Else
            '31시트의 8행부터 시작
            i = i + 1
            
            'No번호
            k = k + 1
            Sheets("31").Cells(i, "A") = k
            Sheets("31").Cells(i, "D") = rngC
            Sheets("31").Cells(i, "E") = rngC.Offset(0, 1)
            'Sheets("31").Cells(i, "F") = Cells(rngC.Row, iStart + iDay)
            Sheets("31").Cells(i, "F") = Cells(rngC.Row, iDay)
        End If
     Next rngC


     MsgBox "완료되었습니다", vbInformation, "땡큐엑셀vba & 엑셀매크로"

End Sub

필터후보이는값만복사하기-Hidden_Offset-땡큐엑셀vba.xlsm
0.09MB

 

실행전

 

실행후

 

'데이터 값을 입력하고 저장버튼을 누르면 아래 최근기록란에 순차적으로 기록할 수 있게 도와주세요 ㅠ

'
'source by 땡큐엑셀vba & 엑셀매크로
'
Sub 저장()

    '7행을 삽입한후
    Rows("7:7").Select
    Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove

    '7행으로 복사
    Range("A2:E2").Copy Destination:=Range("A7")
    Range("A7").Select


    MsgBox "완료되었습니다", vbInformation, "땡큐엑셀vba & 엑셀매크로"
    
End Sub

 

저장버튼누르면최근기록란추가하기-땡큐엑셀vba.xlsm
0.05MB

 

 

 

'http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=102020101&docId=280229761
'
'개인 근태 관련 1월~12월 까지 각각의 시트가 있습니다.
'각 시트별 지각시 "1지", "2지" (1시간지각, 2시간지각)
'로 표기 합니다. 지각에대한 연장시 "1지연", "2지연" 씩으로 표기하는데요.
'
'마지막 시트에서 월별 지각 및 지각연장에 대한 합계를 구하고
'싶습니다.



'
' source by 땡큐엑셀vba & 엑셀매크로
'
' 사용자정의함수
Function 지각(r1 As Range) As Integer
    On Error Resume Next
    

    For Each c In r1
        
        구분문자 = Right(c, 1) '오른쪽 한글자
        
        If 구분문자 = "지" Then
                지각합계 = 지각합계 + Int(Left(c, Len(c) - 1))
        End If
            
    Next

    지각 = 지각합계

End Function


Function 지연(r1 As Range) As Integer

    For Each c In r1
        
        구분문자 = Right(c, 1)
        
        If 구분문자 = "연" Then
                지연합계 = 지연합계 + Int(Left(c, Len(c) - 2))
        End If
            
    Next

    지연 = 지연합계

End Function

월별지각및지각연장합계구하기-사용자정의함수-땡큐엑셀vba.xlsm
0.20MB

실행전

 

실행후

 

'http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=102020101&docId=280324882
'
'엑셀로하는건지 모르겟지만 데이터 정리하는데 있어서 도움이 필요합니다.
'정리하구 연산같은거 해야되가지구요 ㅠ 정리부터 막히네요..
'파일올리겟습니다.

'파일을 열어보시면 세로로된 많은 데이터들을 왼쪽 목록에 딱딱 맞게 넣고싶은데
'일일이 노다가해서는 답이  없어 보이구요 ㅠ 메크로를 쓰든 함수를 넣든 딱딱 정렬 되게 하고싶습니다.
'도와주십시오.. 꼭 엑셀아니라도 좋으니 좋은 프로그램 있으시면 알려주시면 감사하겠습니다.


' 한개의 열값을 8개의 열로 정리하기
'
'source by 땡큐엑셀vba & 엑셀매크로
'
Sub 정리하기()

    마지막행 = Cells(Rows.Count, "L").End(xlUp).Row
    몫 = 8 '8개로 나누기 위하여
    j = 1
    
    '마지막까지 루프돌며 붙여넣기
    For i = 1 To 마지막행
        나머지 = i Mod 몫
    
        '나머지가 1이 나올때마다 +1행 증가
        If 나머지 = 1 Then
            j = j + 1
        End If
           
        'A~H열까지 반복하면서 셀복사
        Cells(j, IIf(나머지 = 0, 8, 나머지)) = Cells(i, "L")
        
    Next i


    MsgBox "완료되었습니다", vbInformation, "땡큐엑셀vba & 엑셀매크로"
    
End Sub

 

한개의열데이터 여러열로 정리하기-mod_iif-땡큐엑셀vba.xlsm
0.23MB

잔량과 지수합계가 다른셀 색칠

 

빨간색인 행 삭제

'http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040103&docId=280216079
'
'각 행의 O와 Q셀에있는 데이터 비교하여 값 차이가날경우 Q셀에 색칠
'그후 색칠되어있는 값 찾아서 행전체삭제 하고싶은데 서치해도 코드 찾기가 어렵네요 ㅠㅠ.
'부탁드립니다



'
' source by 땡큐엑셀vba & 엑셀매크로
'
Sub 색칠()
    
    마지막행 = Cells(Rows.Count, "O").End(xlUp).Row
    
    '2행부터 데이터가 있는 마지막행까지 루프
    For i = 2 To 마지막행
        잔량 = Cells(i, "O")
        지수 = Cells(i, "Q")
        
        '잔량과 지수합계가 다르면 색칠(빨간색)
        If 잔량 <> 지수 Then
            Cells(i, "Q").Interior.Color = vbRed '빨강색
        End If
        
    Next i
    
    
    MsgBox "완료되었습니다", vbInformation, "땡큐엑셀vba & 엑셀매크로"

End Sub




'
' source by 땡큐엑셀vba & 엑셀매크로
'
' 행삭제
Sub 행삭제()

    마지막행 = Cells(Rows.Count, "O").End(xlUp).Row
    
    '마지막행부터 2행까지 루프
    For i = 마지막행 To 2 Step -1
        
        '바탕색이 빨강색이면 행삭제
        If Cells(i, "Q").Interior.Color = vbRed Then
            Cells(i, "Q").EntireRow.Delete
        End If
        
    Next i


    MsgBox "완료되었습니다", vbInformation, "땡큐엑셀vba & 엑셀매크로"
    
End Sub

데이터비교후색칠-색칠되어있는 행 삭제-Interior_EntireRow-땡큐엑셀vba.xlsm
0.05MB