9월 22 2015
엑셀(EXCEL) – 엑셀에서 실시간 철자 검사(Spelling Check)하면서 입력하는 방법
요사이 워드보다 더 워드 같은 엑셀을 사용하여 내용, 표, 그래프 등을 배치, 자유자재로 쓸 수 있는 엑셀을
선호하는 분들이 많으신 것 같더군요. 마이크로소프트의 Office Suite에서 Word는 실시간으로 철자 체크가
가능하지만 엑셀에서는 아직까지는 되지않는 것으로 알고 있습니다.
그래서 열심히 구걸했습니다. 언제나 세상에는 필요한 사람이 있고 그것을 해결하는 천재적인 분들이 많이
계시더군요. 외국 자료라 한글에 대한 옵션 부분이 들어가 있지 않아서 제가 수정해서 팁으로 올립니다.
딱히 설명할 내용도 없습니다. 시트의 셀의 내용이 변하면 전체를 Spellcheck Engine을 사용해서 True이면
그냥 입력하고 False이면 그 부분을 붉은색으로 글꼴을 바꾸는 것입니다. 다른 형식들을 지정해도 상관이
없지만 철자를 교정하고 나도 형식지정된 부분이 남아서 색깔이나 형식 등 하나만을 사용해서 표시를 해야
수정 후 원래 형식대로 돌아갈 수 있습니다.
그래서 별도로 전체 시트에 대해 철차 체크를 하는 루틴을 만들어 두었습니다. 실시간이 아닌 기존 입력된
시트의 철자 체크를 하시려면 Spell_Correction Routine을 한 번 실행하시면 오타나 잘못된 부분을 붉은색으로
변경해 줍니다. 물론 예시로 올린 그림에서 왼쪽 상단의 맞춤법검사 버튼을 눌러 실시간으로 확인하면서
수정할 수 있지만 이 루틴을 돌리면 틀린 부분을 바로 알 수 있어 수작업으로 바로 바로 바꿀때 사용하세요.
VBA Editor 여시고 Module 하나 삽입하시고 아래 코드 붙여넣기 합니다.
Option Explicit
Sub View_Color_Spell_Check_Err(SelRng As Range)
Dim Rng As Range
Dim arr() As String
Dim i As Long, j As Long
With Application.SpellingOptions
.IgnoreCaps = True
.IgnoreFileNames = True
.IgnoreMixedDigits = True
.KoreanCombineAux = True ‘ 이 부분 보조용언 붙여쓰기 추가
.KoreanProcessCompound = True ‘ 복합명사 처리 추가
End With
For Each Rng In SelRng
If Not Rng.HasFormula And VarType(Rng.Value) = vbString Then
arr = Split(Replace(Rng.Value, Chr(160), ” “), ” “)
j = 1
Rng.Font.ColorIndex = xlColorIndexAutomatic
For i = 0 To UBound(arr)
If Not Application.CheckSpelling(Word:=arr(i)) Then
Rng.Characters(j, Len(arr(i))).Font.ColorIndex = 3
End If
j = j + 1 + Len(arr(i))
Next i
End If
Next Rng
End Sub
Sub Spell_Correction()
Dim Rng As Range, SelRng As Range
Dim arr() As String
Dim i As Long, j As Long
With Application.SpellingOptions
.IgnoreCaps = True
.IgnoreFileNames = True
.IgnoreMixedDigits = True
.KoreanCombineAux = True ‘ 이 부분 보조용언 붙여쓰기 추가
.KoreanProcessCompound = True ‘ 복합명사 처리 추가
End With
‘ 현재 시트의 입력된 부분 선택
Set SelRng = ActiveSheet.UsedRange
‘ 셀에 지정된 형식 리셋
SelRng.ClearFormats
For Each Rng In SelRng
If Not Rng.HasFormula And VarType(Rng.Value) = vbString Then
arr = Split(Replace(Rng.Value, Chr(160), ” “), ” “)
j = 1
Rng.Font.ColorIndex = xlColorIndexAutomatic
For i = 0 To UBound(arr)
If Not Application.CheckSpelling(Word:=arr(i)) Then
Rng.Characters(j, Len(arr(i))).Font.ColorIndex = 3
End If
j = j + 1 + Len(arr(i))
Next i
End If
Next Rng
End Sub
그리고 문서 입력용 시트(예, Sheet1을 VBA Editor에서 더블 클릭하시고 아래 코드를 붙여 넣습니다.
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Call View_Color_Spell_Check_Err(Target)
End Sub
이제 셀에 입력을 할 때 마다 맞춤법 검사를 하면서 오타나 복합명사, 보조용언이 잘못되면 셀이 단어가
아닌 문장이라도 잘못된 부분을 붉은색으로 보여줍니다. 색상을 필요하시면 ColorIndex를 바꾸어 가면서
편한 색상으로 사용하시면 됩니다.
위 코드를 보시면 아시겠지만 Sheet1의 내용이 변하면 지속적으로 체크를 하므로 대용량으로 삽입, 삭제 등의
변경이 일어나면 컴퓨터가 느려지므로 순수하게 Sheet1은 입력, 철자 체크용으로 사용 후 새 시트로 이동해서
문서 작업을 하시면 좋겠습니다.
제가 직접 만들 것이 아니라 팁으로 올리기는 그렇지만 수정, 보완을 해서 올리고 이 글을 읽는 또 다른 분이
조금이라도 업무에 도움이 되었으면 하는 마음에 올립니다.
첨부 화일 : 20150921-엑셀에서 실시간 철자 검사(Spelling Check)
10월 6 2015
엑셀(EXCEL) – 워드(Word)의 연동을 통한 사용자 정의 사전 구현(기능 다수 추가)
http://www.clien.net/cs2/bbs/board.php?bo_table=lecture&wr_id=290227
(엑셀(EXCEL) – 엑셀(Excel)과 워드(Word)의 연동을 통한 사용자 정의 사전 구현)
팁으로 올렸던 것을 이왕이면 실제 사용할 수 있고 편하게 사용하고자 수정해서 올립니다.
기존 것은 단순히 Excel에서 입력하고 Word에서 조회만 가능해서 두 프로그램을 실행하여
추가, 삭제 등을 해야 했으나 이 업그레이드 버전은 엑셀 파일을 열지않고 Word에서 단어들을
바로 추가, 수정 및 영문을 번역 단어로 전체 대치를 할 수 있도록 수정했습니다.
그리고 단어를 선택해서 바로 유저폼에서 조회할 수 있도록 하였습니다. 오른쪽 버튼을 누르면
팝업 메뉴를 구현(이것은 구걸…)하여 편의성을 올렸습니다. 일반적인 직장인?분이 MySQL이나
기타 DataBase프로그램을 이용하면 쉬울 것이라고 하지 말아주세요. 몰라서 안하는 것이 아니라
순수하게 Office Suite를 이용해서 이런 것도 할 수 있다는 것을 보여주는 것이기 때문입니다.
단어 대치 기능은 개별로 선택된 단어를 대치할 수도 있고 아래 붉은 글씨의 주의사항대로
문서 전체에서 등록된 단어들로 대치하는 기능입니다. 되돌릴 수 없는 기능이니 주의하세요.
쓰다 보니 되돌리기 기능이 너무 쉬워서 추가했습니다 ㅠㅠ.
Option Explicit
Private Sub CommandButton1_Click()
Dim i As Long
Dim fstr As String, sqlstr As String
Dim conn As ADODB.Connection
Dim rst As ADODB.Recordset
Dim sConnString As String
‘ 연결 문자열 : Excel 2003
sConnString = “Provider=Microsoft.Jet.OLEDB.4.0;excel 8.0;DATABASE=C:\UserDic.xls;”
‘ 새로운 연결과 레코드셋 설정
Set conn = New ADODB.Connection
Set rst = New ADODB.Recordset
‘ 연결
conn.Open sConnString
If Len(UserForm1.TextBox1.Text) = 0 Then Exit Sub
fstr = “%” & UserForm1.TextBox1.Text & “%”
sqlstr = “select Word, Trans, Mean from [DicList$] where Word like ‘” & fstr & “‘”
Set rst = conn.Execute(sqlstr)
‘ 데이터 체크
‘ 없으면 서브루틴 빠져 나감
If rst.BOF Or rst.EOF Then
UserForm1.ListBox1.Clear
Exit Sub
End If
rst.MoveFirst
i = 0
With UserForm1.ListBox1
.Clear
Do
.AddItem
.List(i, 0) = rst!Word
.List(i, 1) = rst!Trans
.List(i, 2) = rst!Mean
i = i + 1
rst.MoveNext
Loop Until rst.EOF
End With
‘ 연결 끊기와 메모리 비움
If CBool(conn.State And adStateOpen) Then conn.Close
Set conn = Nothing
Set rst = Nothing
End Sub
Private Sub CommandButton2_Click()
Dim i As Long
Dim conn As ADODB.Connection
Dim rst As ADODB.Recordset
Dim sConnString As String
‘ 연결 문자열 : Excel 2003
sConnString = “Provider=Microsoft.Jet.OLEDB.4.0;excel 8.0;DATABASE=C:\UserDic.xls;”
‘ 새로운 연결과 레코드셋 설정
Set conn = New ADODB.Connection
Set rst = New ADODB.Recordset
‘ 연결
conn.Open sConnString
Set rst = conn.Execute(“select Word, Trans, Mean from [DicList$] “)
‘ 데이터 체크
‘ 없으면 서브루틴 빠져 나감
If rst.BOF Or rst.EOF Then Exit Sub
rst.MoveFirst
i = 0
With UserForm1.ListBox1
.Clear
Do
.AddItem
.List(i, 0) = rst!Word
.List(i, 1) = rst!Trans
.List(i, 2) = rst!Mean
i = i + 1
rst.MoveNext
Loop Until rst.EOF
End With
‘ 연결 끊기와 메모리 비움
If CBool(conn.State And adStateOpen) Then conn.Close
Set conn = Nothing
Set rst = Nothing
‘ 검색할 값 초기화
TextBox1.Text = “”
TextBox2.Text = “”
TextBox3.Text = “”
End Sub
Private Sub CommandButton3_Click()
Dim sqlstr As String, fstr As String
Dim conn As ADODB.Connection
Dim rst As ADODB.Recordset
Dim sConnString As String
‘ 연결 문자열 : Excel 2003
sConnString = “Provider=Microsoft.Jet.OLEDB.4.0;excel 8.0;DATABASE=C:\UserDic.xls;”
‘ 새로운 연결과 레코드셋 설정
Set conn = New ADODB.Connection
‘ 연결
conn.Open sConnString
fstr = Trim(UserForm1.TextBox1.Text)
If Len(fstr) = 0 Then Exit Sub
sqlstr = “SELECT * FROM [DicList$] WHERE Word='” & fstr & “‘”
Set rst = conn.Execute(sqlstr)
If rst.BOF Or rst.EOF Then
‘ 데이터 추가
sqlstr = “INSERT INTO [DicList$] VALUES (‘” & TextBox1.Text & “‘,'” &
TextBox2.Text & “‘,'” & TextBox3.Text & “‘)”
Call conn.Execute(sqlstr)
Else
MsgBox “동일 단어가 있습니다”
End If
‘ 연결 끊기와 메모리 비움
If CBool(conn.State And adStateOpen) Then conn.Close
Set conn = Nothing
TextBox1.Text = “”
TextBox2.Text = “”
TextBox3.Text = “”
Call CommandButton2_Click
End Sub
Private Sub CommandButton4_Click()
Dim sqlstr As String, fstr As String, frstr As String
Dim tstr As String, mstr As String
Dim conn As ADODB.Connection
Dim sConnString As String
‘ 연결 문자열 : Excel 2003
sConnString = “Provider=Microsoft.Jet.OLEDB.4.0;excel 8.0;DATABASE=C:\UserDic.xls;”
‘ 새로운 연결과 레코드셋 설정
Set conn = New ADODB.Connection
‘ 연결
conn.Open sConnString
fstr = UserForm1.ListBox1.List(UserForm1.ListBox1.ListIndex, 0)
If Len(fstr) = 0 Then
MsgBox “단어를 선택하세요”
Exit Sub
End If
‘ 데이터 수정
frstr = UserForm1.TextBox1.Text
tstr = UserForm1.TextBox2.Text
mstr = UserForm1.TextBox3.Text
sqlstr = “UPDATE [DicList$] SET Trans = ‘” & tstr & “‘” & ” , Mean = ‘” & mstr & “‘” & ”
WHERE Word = ‘” & fstr & “‘”
Call conn.Execute(sqlstr)
‘ 디비를 변형적으로 업데이트
sqlstr = “UPDATE [DicList$] SET Word = ‘” & frstr & “‘” & ” WHERE Trans = ‘” & tstr &
“‘” & ” AND Mean = ‘” & mstr & “‘”
Call conn.Execute(sqlstr)
‘ 연결 끊기와 메모리 비움
If CBool(conn.State And adStateOpen) Then conn.Close
Set conn = Nothing
TextBox1.Text = “”
TextBox2.Text = “”
TextBox3.Text = “”
Call CommandButton2_Click
End Sub
‘ 개별 단어 대치
Private Sub CommandButton5_Click()
Dim myRange As Range
Set myRange = ActiveDocument.Content
myRange.Find.Execute FindText:=UserForm1.TextBox1.Text, MatchCase:=True,
MatchWholeWord:=True, _
ReplaceWith:=UserForm1.TextBox2.Text, Replace:=wdReplaceAll
End Sub
‘ 사전에 등록된 단어 전체 대치
Private Sub CommandButton6_Click()
Dim i As Integer
Dim myRange As Range
Set myRange = ActiveDocument.Content
For i = 0 To UserForm1.ListBox1.ListCount – 1
myRange.Find.Execute FindText:=UserForm1.ListBox1.List(i, 0), MatchCase:=True,
MatchWholeWord:=True, _
ReplaceWith:=UserForm1.ListBox1.List(i, 1), Replace:=wdReplaceAll
Next i
End Sub
‘ 사전에 등록된 단어 전체 환원
Private Sub CommandButton7_Click()
Dim i As Integer
Dim myRange As Range
Set myRange = ActiveDocument.Content
For i = 0 To UserForm1.ListBox1.ListCount – 1
myRange.Find.Execute FindText:=UserForm1.ListBox1.List(i, 1), MatchCase:=True,
MatchWholeWord:=True, _
ReplaceWith:=UserForm1.ListBox1.List(i, 0), Replace:=wdReplaceAll
Next i
End Sub
Private Sub ListBox1_Click()
TextBox1.Text = ListBox1.List(ListBox1.ListIndex, 0)
TextBox2.Text = ListBox1.List(ListBox1.ListIndex, 1)
TextBox3.Text = ListBox1.List(ListBox1.ListIndex, 2)
Call CopyToClip
End Sub
Module 하나를 추가해서 붙여넣기 합니다.
Option Explicit
Sub CopyToClip()
Dim obj As New DataObject
Dim Cliptxt As String
Cliptxt = UserForm1.ListBox1.List(UserForm1.ListBox1.ListIndex, 1)
obj.SetText Cliptxt
obj.PutInClipboard
End Sub
Sub Open_UserDic()
UserForm1.Show vbModeless
‘ 선택된 단어의 마지막 스페이스 문자 제거
UserForm1.TextBox1.Text = Trim(Selection.Text)
Dim i As Long
Dim fstr As String, sqlstr As String
Dim conn As ADODB.Connection
Dim rst As ADODB.Recordset
Dim sConnString As String
‘ 연결 문자열 : Excel 2003
sConnString = “Provider=Microsoft.Jet.OLEDB.4.0;excel 8.0;DATABASE=C:\UserDic.xls;”
‘ 새로운 연결과 레코드셋 설정
Set conn = New ADODB.Connection
Set rst = New ADODB.Recordset
‘ 연결
conn.Open sConnString
If Len(UserForm1.TextBox1.Text) = 0 Then Exit Sub
fstr = “%” & UserForm1.TextBox1.Text & “%”
sqlstr = “select Word, Trans, Mean from [DicList$] where Word like ‘” & fstr & “‘”
Set rst = conn.Execute(sqlstr)
‘ 데이터 체크
‘ 없으면 서브루틴 빠져 나감
If rst.BOF Or rst.EOF Then
UserForm1.ListBox1.Clear
UserForm1.TextBox2.Text = “”
UserForm1.TextBox3.Text = “”
Exit Sub
End If
rst.MoveFirst
i = 0
With UserForm1.ListBox1
.Clear
Do
.AddItem
.List(i, 0) = rst!Word
.List(i, 1) = rst!Trans
.List(i, 2) = rst!Mean
i = i + 1
rst.MoveNext
Loop Until rst.EOF
End With
‘ 연결 끊기와 메모리 비움
If CBool(conn.State And adStateOpen) Then conn.Close
Set conn = Nothing
Set rst = Nothing
End Sub
Sub BuildControls()
Dim oBtn As CommandBarButton
Dim oPopUp As CommandBarPopup
Dim oCtr As CommandBarControl
‘Make changes to the Normal template
CustomizationContext = NormalTemplate
‘Prevent double customization
Set oPopUp = CommandBars.FindControl(Tag:=”custPopup”)
If Not oPopUp Is Nothing Then GoTo Add_Individual
‘Add PopUp menu control to the top of the “Text” short-cut menu
Set oPopUp = CommandBars(“Text”).Controls.Add(msoControlPopup, , , 1)
With oPopUp
.Caption = “추가 기능”
.Tag = “custPopup”
.BeginGroup = True
End With
Set oBtn = oPopUp.Controls.Add(msoControlButton)
With oBtn
.Caption = “사용자 정의 사전”
.FaceId = 940
.Style = msoButtonIconAndCaption
.OnAction = “Open_UserDic”
End With
Set oBtn = Nothing
Add_Individual:
‘Or add individual commands directly to menu
Set oBtn = CommandBars.FindControl(Tag:=”custCmdBtn”)
If Not oBtn Is Nothing Then Exit Sub
‘Add control using built-in ID 758 (Boo&kmarks…)
Set oBtn = Application.CommandBars(“Text”).Controls.Add(msoControlButton, 758, , 2)
oBtn.Tag = “custCmdBtn”
If MsgBox(“This action caused a change to your Normal template.” _
& vbCr + vbCr & “Recommend you save those changes now.”, vbInformation +
vbOKCancel, _
“Save Changes”) = vbOK Then
NormalTemplate.Save
End If
Set oPopUp = Nothing
Set oBtn = Nothing
lbl_Exit:
Exit Sub
End Sub
Module 하나를 추가해서 붙여넣기 합니다. 코드가 충돌해서 Module을 분리하였습니다.
Option Explicit
Sub RemoveContent_MenuItem()
Dim oPopUp As CommandBarPopup
Dim oCtr As CommandBarControl
‘Make command bar changes in Normal.dotm
CustomizationContext = NormalTemplate
On Error GoTo Err_Handler
Set oPopUp = CommandBars(“Text”).Controls(“추가 기능”)
‘Delete individual commands on the PopUp menu
For Each oCtr In oPopUp.Controls
oCtr.Delete
Next
‘Delete the PopUp itself
oPopUp.Delete
‘Delete individual custom commands on the Text menu
For Each oCtr In Application.CommandBars(“Text”).Controls
If oCtr.Caption = “Boo&kmark…” Then
oCtr.Delete
Exit For
End If
Next oCtr
If MsgBox(“This action caused a change to your Normal template.” _
& vbCr + vbCr & “Recommend you save those changes now.”, vbInformation +
vbOKCancel, _
“Save Changes”) = vbOK Then
NormalTemplate.Save
End If
Set oPopUp = Nothing
Set oCtr = Nothing
Exit Sub
Err_Handler:
End Sub
추가> 문서 열고 닫을 때 사용자 정의 팝업 메뉴의 실행 및 제거 루틴이 빠졌어요.
저는 한 번 해서 계속 사용할 수 있어서 루틴을 깜빡 했습니다. 첨부된 화일에서 VBA Editor에서
ThisDocument 더블 클릭하시고 아래 코드 넣어세요.
Option Explicit
Private Sub Document_Close()
‘ 모듈이 오류가 나서 RemoveContentMenuItem를 RemoveContent_MenuItem로 바꾸세요.
Call RemoveContent_MenuItem
End Sub
Private Sub Document_Open()
Dim i As Long
Dim conn As ADODB.Connection
Dim rst As ADODB.Recordset
Dim sConnString As String
Dim sqlstr As String
‘ 연결 문자열 : Excel 2003
sConnString = “Provider=Microsoft.Jet.OLEDB.4.0;excel 8.0;DATABASE=C:\UserDic.xls;”
‘ 새로운 연결과 레코드셋 설정
Set conn = New ADODB.Connection
Set rst = New ADODB.Recordset
‘ 연결
conn.Open sConnString
Set rst = conn.Execute(“select Word, Trans, Mean from [DicList$] “)
‘ 데이터 체크
‘ 없으면 서브루틴 빠져 나감
If rst.BOF Or rst.EOF Then Exit Sub
rst.MoveFirst
i = 0
With UserForm1.ListBox1
.Clear
Do
.AddItem
.List(i, 0) = rst!Word
.List(i, 1) = rst!Trans
.List(i, 2) = rst!Mean
i = i + 1
rst.MoveNext
Loop Until rst.EOF
End With
‘ 연결 끊기와 메모리 비움
If CBool(conn.State And adStateOpen) Then conn.Close
Set conn = Nothing
Set rst = Nothing
‘ 사용자 정의폼을 모달리스 즉 플로팅 윈도우로 뛰어서
‘ 사용자가 수정,입력을 하면서 사전 참조할 수 있도록 함
UserForm1.Show vbModeless
‘ 사용자 편의를 위해 어짜피 영어 사전이므로 영어를 기본으로 입력하게 함
UserForm1.TextBox1.IMEMode = fmIMEModeAlpha
‘ 사용자 팝업 메뉴 생성
Call BuildControls
End Sub
수정 첨부 화일 : 20151006 – 워드(Word)의 연동을 통한 사용자 정의 사전 구현(기능 다수 추가)
By vinipapa • 무른모 • 0 • Tags: 사용자 정의 사전, 엑셀(EXCEL), 워드(Word), 팁