'목록하단 광고 치환자(withSeok)
728x90
엑셀코딩스쿨 정렬 알고리즘(간단)

 

새파일을 연다
다름이름으로 저장
파일형식 : 매크로 사용 통합문서 (xlsm)

문서를 작성하며 수시로 저장한다.
A3셀과 A4셀에
30,29를 입력하고
검정십자 모양일 때 클릭하여





1이 되는 32행까지 
드래그 한다.
3행에서 32행 까지
행높이를 조정한다.
 
B 열에서 AF 열까지 
너비를 2로 설정한다.
C33에서 AF33까지
1에서 30까지 입력한다.
C35 셀에 
다음 수식을 입력한다.

=randbetween(1,30)

검정십자 모양을 통해
AF35까지 해당 수식을 복사한다.
 
수식을
마우스 검정십자 모양 활ㅇ
A35에 fix라고 입력
개발도구 - 매크로 기록
매크로 이름 : MD_Copy_Fix
 

A35 셀에서 부터 AF35 셀까지
복사(단축키 Ctrl + C)

 

1)  A33 셀 클릭
2)  마우스 우클릭
3)  선택하여 붙여넣기에서 값만 붙여넣기
4)  ESC 키 클릭
5)  B33셀 선택
기록 정지 클릭!!



 

랜덤함수로 인해
33행과 35행의 값이 달라진다.
33행은 값
35행은 함수
VBA 창을 열어
(단축키 Alt + F11)

왼쪽 프로젝트 창에서
Module1 더블 클릭

오른쪽 기록된 매크로 확인

 

왼쪽 아래 속성창에서
모듈 이름 변경

Copy_Module
프로젝트 창에서
마우스 우클릭
삽입
모듈
모듈1

이름 변경
Sort_Module
 
우측 창에

sub MD_Sort 라고만 치면
우측 그림 처럼 자동으로
End sub 까지 생성
 
아래와 같이 for 구문, if 구문 입력

Sub MD_Sort()
    
For k = 1 To 3
           
If 1 = 1 Then
Else
End If
           
Next k
    
End Sub
상단 메뉴바의
빈칸에서 
마우스 우클릭
편집 클릭!!





편집 도구탭 생성

 

아래 그림처럼
if 구문
세줄 선택
편집도구에서
들여쓰기 클릭
(단축키 Tab 키)
들여쓰기 됨

1=1을 지우고

Range("C33").Offset(, k - 1) > Range("C33").Offset(, k) 
으로 변경

Sub MD_Sort()
    
For k = 1 To 3
           
    If Range("C33").Offset(, k - 1) > Range("C33").Offset(, k) Then
    Else
    End If
           
Next k
    
End Sub

 

if 구문의 then 끝에서 엔터

Tab 키 한번 클릭(들여쓰기) 후 입력

        MsgBox Range("C33").Offset(, k - 1).Value
        MsgBox Range("C33").Offset(, k).Value
        MsgBox "앞에 수가 크다"



Sub MD_Sort()
    
For k = 1 To 3
           
    If Range("C33").Offset(, k - 1) > Range("C33").Offset(, k) Then
        MsgBox Range("C33").Offset(, k - 1).Value
        MsgBox Range("C33").Offset(, k).Value
        MsgBox "앞에 수가 크다"
    Else
    End If
           
Next k
    
End Sub
좌(VBA창) 우(엑셀창)으로
배치하여 구문 실행을 확인
MD_Sort 구문 내에
아무 곳에 마우스 클릭 후

F8 키를 눌러
매크로를 한 줄씩 실행함








그림과 같이 
실행되기 직전의 구문이
노랑으로 표시됨

 

F8키를 여러번 눌러
C33셀의 값 30 이
메세지박스로 표현 됨

확인 클릭하면 곧~
D34셀의 값 15 가
메세지 박스로 표현 됨

확인 클릭하면 곧~
메세지 박스 
앞에 수가 크다. 확인
위 과정을 세 번 반복한다.
두수를 비교했을 때,
앞의 수가 크다면 
메세지 박스가 팝업된다.

하지만 그렇지 않으면 
매크로는 조용히 끝난다.
 
메세지 박스 3줄 앞에 
모두 아프스트로피를 붙여
주석처리한다.
아래 그림처럼
다음 두 줄을 입력한다.

v_val_temp1 = Range("C33").Offset(, k - 1).Value
v_val_temp2 = Range("C33").Offset(, k).Value
MsgBox (v_val_temp1 & "," & v_val_temp2)
        
F8을 눌러 한줄씩 실행하면
앞의 수가 클 경우
앞의 수와 뒤의 수가 함께 출력됨
메세지박스를 주석처리하고
아래 두 줄을 입력하여
서로 값을 바꾸어 입력한다.

Range("C33").Offset(, k - 1) = v_val_temp2
Range("C33").Offset(, k) = v_val_temp1
F8키를 눌러 한 줄 씩
실행하여 결과를 확인해본다.
아래 이미지와 같이

v_ch_num = 0
를 상단에

v_ch_num = v_ch_num + 1
를 중간에 삽입한다.

아래 그림 처럼
영역을 선택하여 들여쓰기한다.

들여쓰기 단축키 Tab 키
아래 그림과 같이
상단에 
do

하단에 
until loop v_Ch_Num=0

중간 아래쪽 쯤에
doevents

를 적는다.

Sub MD_Sort()
        
Do
    v_Ch_Num = 0
    For k = 1 To 3
               
        If Range("C33").Offset(, k - 1) > Range("C33").Offset(, k) Then '값비교
            'MsgBox Range("C33").Offset(, k - 1).Value
            'MsgBox Range("C33").Offset(, k).Value
            'MsgBox "앞에 수가 크다"
            v_val_temp1 = Range("C33").Offset(, k - 1).Value    '각각 변수에
            v_val_temp2 = Range("C33").Offset(, k).Value        '값을 저장함.
            'MsgBox (v_val_temp1 & "," & v_val_temp2)
            Range("C33").Offset(, k - 1) = v_val_temp2  '서로 값을 바꾸어
            Range("C33").Offset(, k) = v_val_temp1      '입력함
            v_Ch_Num = v_Ch_Num + 1
            DoEvents
        Else
        End If
               
    Next k
Loop Until v_Ch_Num = 0
    
End Sub
하단에 
msgbox "성공!"

을 적는다.
F8을 눌러 한 줄씩 실행하면서
숫자들이 자리를 잘 바꾸는지 
점검한다.

크게 이상이 없을 경우 
정지 또는 빨리 감기 F5를 누른다.
from 구문의 3을
29로 변경한다.

from k=1 to 29

Sub MD_Sort()
        
Do
    v_Ch_Num = 0
    For k = 1 To 29
               
        If Range("C33").Offset(, k - 1) > Range("C33").Offset(, k) Then '값비교
            'MsgBox Range("C33").Offset(, k - 1).Value
            'MsgBox Range("C33").Offset(, k).Value
            'MsgBox "앞에 수가 크다"
            v_val_temp1 = Range("C33").Offset(, k - 1).Value    '각각 변수에
            v_val_temp2 = Range("C33").Offset(, k).Value        '값을 저장함.
            'MsgBox (v_val_temp1 & "," & v_val_temp2)
            Range("C33").Offset(, k - 1) = v_val_temp2  '서로 값을 바꾸어
            Range("C33").Offset(, k) = v_val_temp1      '입력함
            v_Ch_Num = v_Ch_Num + 1
            DoEvents
        Else
        End If
               
    Next k
Loop Until v_Ch_Num = 0
MsgBox "성공!"
    
End Sub
매크로 창에서 F5 키를 눌러
순수대로 잘 정령이 되는지 확인한다.
화면의 글자 크기에 따라 
숫자가 보이지 않고##으로 표시되는 경우는
칸에 비해 글자크기가 크기 때문이다.
아래 화면과 같이 영역을 선택 후
셀서식-맞춤
-셀에 맞춤으로 설정하면
글자 및 숫자가 모두 보인다.
* 조건부 서식 준비 작업 *

아래 그림과 같이
왼쪽 위 C3에서 부터 오른쪽 아래로
드래그 하여 영역을 잡는다.
(반드시 왼쪽 위에서 출발하여
오른쪽 아래로 영역을 잡는다.)
수식을 사용하여 서식을 지정할 셀 결정 수식칸에는
=$A3<=C$33

서식버튼을 눌러
채우기에서 적당한 색을 선택
아래 그림과 같이
선택한 색이 칠해져 
가각 숫자에 따른 높이로 표현되었다.

 

개발도구
-삽입
-단추(양식컨트롤)
적당한 곳에
적당한 크기로 드래그
매크로 지정 창이 뜨면
Copy 매크로를 클릭
확인
단추 모양에서
마우스 우클릭
텍스 편집
적당한 단추 이름을 적는다.

다시 한번 단추만들기하여
이번에는 매크로를 sort를 클릭
역시 적당한 이름을 붙인다.  
 
아래 그림과 같이
copy 모듈과 sort 모듈을 작동시켜
확인한다.

시도횟수를 AG33셀에 기록
색을 구간별로 나누어 적용하면
조금 더 화려하게 만들 수 있다.
더 많은 숫자로
더 화려하게...
엑셀 파일 다운로드

정렬알고리즘(간단)--220521.2310.xlsm
0.02MB

728x90

+ Recent posts