10월 5 2015
엑셀(EXCEL) – 엑셀(Excel)과 워드(Word)의 연동을 통한 사용자 정의 사전 구현
매번 올리는 팁이 엑셀관련이라서 제 업무가 이 계통이라 생각하시는 분이 많으신가 봅니다.
오늘도 쪽지에 팁 관련 문의를 주셔서 나름대로 답변을 드렸는데 엑셀의 버전에 따라 동작을
안하는 루틴도 있는 모양입니다.
전 회사에서 지원된 버전이 2007버전이라 이것으로 팁란에 팁을 올려드리는데 다른 최신식?
버전에서 동작하지 않는 경우가 많은가 봅니다. 되도록이면 다 동작했으면 좋겠는데 환경이
열악하다 보니 제가 할 수 있는 부분은 답변을 드리도록 하겠습니다.
각설하고 매번 엑셀관련 팁만 올렸는데 이번에는 조금 더 발전시켜 오피스에서 엑셀, 파워포인트
다음으로 많이 사용하고 있다고 생각되는? 워드와의 콜라보를 통한 업무 향상 스킬에 대해서
조그마한 팁을 올려드리고자 합니다.
http://www.clien.net/cs2/bbs/board.php?bo_table=kin&wr_id=3545722
(책 번역 시 용어를 찾을 때마다 프로그램에 바로바로 추가할 수 있을까요?)
엑셀을 사용해서 번역문을 셀마다 입력하고 찾기/바꾸기를 해서 내장사전?을 만들어 사용할 수
있겠지만 제목처럼 번역문은 워드에다 직접 입력하고 단어를 찾아서는 엑셀에다 입력해서 서로
연동하면서 사용할 수 있도록 할 예정입니다.
우선 첨부된 그림처럼 엑셀 파일에다 단어와 뜻을 입력하여 저장을 합니다. 위치는 C:\에다
저장하는 것으로 하겠습니다. 포멧은 97-2003포멧으로 저장해 주세요. ADO를 사용하는데
연결 문자열이 2007버전이 제대로 동작하지 않아서 번거럽더라도 위 포멧으로 저장 바랍니다.
이제 워드 문서 하나 여시고 VBA Editor를 여시고 아래 루틴을 복사해 넣고 도구 > 참조에서
Microsoft AcitveX Data Objects 2.x Library를 추가해 주시기 바랍니다.
ption Explicit
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 단어, 뜻 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![단어]
.List(i, 1) = rst![뜻]
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
End Sub
간단하게 설명하면 문서가 열리면 C:\에 있는 UserDic.xls를 참조하여 UserFomr에다가 사전을
뛰우라는 명령입니다. UserForm1.Show vbModeless가 중요한데 이렇게 함으로써 사용자가 편집을
하면서 사전을 참조할 수 있도록 항상 Form이 최상단에 위치하도록 하는 것입니다.
UserForm 하나 만드시고 Command1, Command2, Textbox, Listbox 각각 하나 추가합니다.
그리고 아래 코드 붙여넣기합니다. Command1은 Textbox1의 내용을 와일드카드로 검색하고
Command2는 리프레시(초기화, 갱신) 버튼입니다.
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
fStr = “%” & UserForm1.TextBox1.Text & “%”
sqlstr = “select 단어, 뜻 from [DicList$] where 단어 like ‘” & fStr & “‘”
Set rst = conn.Execute(sqlstr)
‘ 데이터 체크
‘ 없으면 서브루틴 빠져 나감
If rst.BOF Or rst.EOF Then Exit Sub
rst.MoveFirst
i = 0
With UserForm1.ListBox1
.Clear
Do
.AddItem
.List(i, 0) = rst![단어]
.List(i, 1) = rst![뜻]
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 단어, 뜻 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![단어]
.List(i, 1) = rst![뜻]
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.TextBox1.Text = “”
End Sub
아래는 Listbox를 클릭하면 그 단어의 내용을 클립보드로 복사하는 루틴입니다. 결국 단어를
찾는다는 것을 그 뜻을 이용할 것이기 때문에 편의를 위해 넣은 코드입니다.
Private Sub ListBox1_Click()
Call CopyToClip
End Sub
VBA Editor에서 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
별로 어려운 내용이 아니지만 사실 업무를 하면서 굉장히 필요한 내용일 수도 있으므로 팁란에
올렸습니다. 추가로 검색/바꾸기 기능도 넣을 수도 있지만 워드에 충실한 기능이 있으므로
그 부분은 생략합니다.
첨부 화일 : 20151005 – 엑셀(Excel)과 워드(Word)의 연동을 통한 사용자 정의 사전 구현
3월 9 2016
엑셀[EXCEL] – 같은 셀 값 참조하여 두 시트 합침
아질게 게시판에 엑셀 관련 조금 복잡한 질문의 내용들이 나오지 않아
심심하던 차에? 조금 복잡한 내용이 나왔네요.
http://www.clien.net/cs2/bbs/board.php?bo_table=kin&wr_id=3673755
하루종일 검색해보았지만 알 수 없었던 엑셀문제ㅠ 혹시 아시는 분 계실까요?
질문의 내용이 더 어려워 해석하느라 시간이 좀 걸렸습니다. 한 칼럼을 기준으로
같은 내용이 있으면 두 시트를 일정 방법으로 합쳐달라는 요지더군요.
간단히 VLOOKUP함수로 처리할 수도 있지만 저는 함수를 잘 활용하지 못하고
정형화된 내용은 VBA로 해결하는 사람이라 VBA로 짧은 코드 한번 짜 보았습니다.
Option Explicit
Sub Mergy_By_Same_Value()
Dim cnt As Integer, i As Integer
Dim rngCell As Range, rngTgt As Range
Dim rngR As Range, rngRef As Range
Dim tgt As Worksheet
‘ 경고 메시지 금지 및 속도를 위해 업데이트 중지
Application.DisplayAlerts = False
Application.ScreenUpdating = False
‘ 추출해서 붙여넣기할 데이터 시트가 기존에 있으면 삭제
For Each tgt In Worksheets
If tgt.Name = “ExtData” Then
tgt.Delete
End If
Next tgt
‘ 새 시트를 워크시트 제일 마지막에 ExtData라는 이름으로 추가
Set tgt = Worksheets.Add(after:=Worksheets(Worksheets.Count))
tgt.Name = “ExtData”
‘ 추출할 데이터 영역과 추출할 참조 영역 설정
Set rngTgt = Worksheets(“Alpha”).Range(“G:G”).SpecialCells(xlTextValues)
Set rngRef = Worksheets(“Beta”).Range(“G:G”).SpecialCells(xlTextValues)
‘ 두 영역을 순환하면서 같은 데이터가 있으면 추출 시트에 복사
For Each rngCell In rngTgt
For Each rngR In rngRef
If rngCell = rngR Then
‘셀 병합하여 붙여넣을 위치 결정
For i = 0 To 6
tgt.Range(“A1”).Offset(cnt, i * 2).Value = rngCell.Offset(0, i – 6).Value
tgt.Range(“A1”).Offset(cnt, i * 2 + 1).Value = rngR.Offset(0, i – 6).Value
Next i
cnt = cnt + 1
Exit For
End If
Next rngR
Next rngCell
‘ 보기 좋게 자동 칼럼 맞춤
‘ tgt.Columns.AutoFit
‘ 경고 메시지 및 업데이트 갱신
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
참조 : 20160309-같은 셀값 참조하여 두 시트 합침
By vinipapa • 무른모 • 0 • Tags: Excel, 같은 셀, 시트 병합, 엑셀