우리가 만드는 미로에서는 직접 방향키를 이용해 캐릭터를 움직여가며 미로를 풀어나갈 겁니다.

 

그러기 위해서는 각 방향키를 눌렀을 때 이벤트가 발생하도록 만들어야 합니다.

 

키보드 이벤트를 발생시키기 위해서는 Application.OnKey() 함수를 사용해도 되지만 필자가 사용하는 한셀2018버전에서는 Application.OnKey()함수가 작동하지 않습니다.

 

따라서 Worksheet_SelectionChange 프로시저를 사용할 예정입니다. 

 

Worksheet_SelectionChange는 해당 워크시트의 선택된 셀이 바뀔 때마다 실행이 됩니다.

 

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
	With Target.Cells
		MsgBox "행: " & .Row & " 열: "& .Column
	End With
End Sub

셀이 선택될 때마다 SelectionChange 프로시저가 실행되어서 선택된 셀의 행과 열을 MsgBox로 보여주는 예제입니다.

 

이를 이용해 키보드 이벤트를 만들어 보겠습니다.

 

먼저 아래의 논리구조로 선택된 셀이 바뀌었을 때 무슨 방향키를 눌렀는지 알 수 있습니다.

 

1. 기준 셀을 하나 정해둔다.

  1) 위쪽 방향키를 눌러서 선택된 셀은 기준 셀보다 행의 값이 1이 작다.

  2) 아래쪽 방향키를 눌러서 선택된 셀은 기준 셀보다 행의 값이 1이 크다.

  3) 왼쪽 방향키를 눌러서 선택된 셀은 기준 셀보다 행의 값이 1이 작다.

  4) 오른쪽 방향키를 눌러서 선택된 셀은 기준 셀보다 행의 값이 1이 크다.

 

무슨 방향키를 눌렀는지 알 수 있따면 각각의 방향키에 맞는 프로시저를 실행시킬 수 있습니다.

 

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
	Dim row, col As Integer
	row = 2
	col = 2
	With Target.Cells
		If .Row = row-1 Then
			MsgBox "UP"
		ElseIf .Row = row+1 Then
			MsgBox "Down"
		ElseIf .Column = col-1 Then
			MsgBox "Left"
		ElseIf .Column = col+1 Then
			MsgBox "Right"
		End If
		Cells(row, col).Select
	End With
End Sub

기준 셀을 B2로 잡고 상하좌우로 움직인 예제입니다.

 

위의 예제처럼 각각의 방향키를 인식할 수 있습니다.

 

MsgBox를 띄우는 대신 MoveUp프로시저를 만든 다음에 MsgBox "UP" 대신 Call MoveUp 으로 대체한다면 위쪽 방향키가 눌렸을 때 원하는 코드를 실행시키도록 할 수 있습니다.

 

하지만 여기서 만약 마우스로 C10을 선택하여도 Right이라는 MsgBox가 뜨게 되고, D1을 선택하면 Up이라는 MsgBox가 뜨게 됩니다. 이런 예외를 처리하기 위해서 기준 셀과 상하좌우의 셀이 포함된 행렬을 숨겨주시면 됩니다.

 

여기서 행의 높이나 열의 너비를를 0으로 지정해 완전히 숨기게 되면 셀 선택이 불가능하게 됩니다. 따라서 완전히 숨기기보단 행의 높이는 1, 열의 너비는 0.1 정도로 보이지만 않게 설정해주시면 됩니다.

(ps. 위의 코드를 작성한 상태에서는 셀 선택이 되지 않습니다. 15번째 줄의 'Cells(row, col).Select'를 주석처리 해주시면 됩니다.)

 

위의 사진과 같이 깔끔하게 키보드 이벤트를 구현할 수 있습니다.


WRITTEN BY
컴공학도

,