[Excel] 엑셀 추가 기능 만들기 템플릿
Excel 추가 기능 정보
xla 파일: 설치하지 않고 일시적으로 사용할 수 있는 추가 기능. xla 파일을 직접 열면 작동 시작. Excel을 모두 닫으면 동작 종료한다.
내용은 Excel VBA의 매크로이지만 통합 문서 (xlsx, xlsm 파일)에 의존하지 않으므로 통합 문서를 복사하여 논리 복제되는 것을 피할 수 있습니다. 애드인 파일에 쓰기 잠금도 할 수 있으므로, 「모르고 모르게 Excel 편집하고 있는 동안에 실수로 매크로를 파괴해 버렸다」는 위험을 회피할 수 있습니다.
"xlax"가 아닌 것은 사정에 따라 · ·
추가 기능 추가 : xla 파일은 Excel을 모두 닫으면 종료되어 버리므로 다시 시작할 때마다 매번 열어야합니다. 그것이 귀찮은 경우는, 「애드인의 추가」를 실시하면 애드인의 삭제를 할 때까지 xla 파일의 동작이 유효하게 된다.
편지지
이하의 기술을 「표준 모듈」에 복사해 xla 파일로서 보존하면 완성. 이해할 수 있던 사람은 그대로 가져가 주세요. (xla 파일을 만드는 방법은 후술)
추가 기능 병아리Const HEAD_TITLE = "ハローワールド" 'コンテキストメニューのタイトル
Const MENU = "ハロー,ワールド" 'サブメニューのタイトル(カンマ区切り)
Const MENU_ACT = "hello,world" 'サブメニューのSub名(カンマ区切り)
'ここに関数挿入
Sub hello()
MsgBox "Hello," & Selection
End Sub
Sub world()
MsgBox Selection & " World!"
End Sub
'以降、共通処理
Sub Auto_Open()
AddMenu
End Sub
Sub Auto_Close()
End Sub
Sub EditCode()
SendKeys "%{F11}"
End Sub
Sub AddMenu()
On Error Resume Next
Dim aMenu() As String
Dim aMenuAct() As String
Dim codeEditName As String
codeEditName = "> マクロ編集"
If Not IsControl(HEAD_TITLE) Then
Set contextmenu = Application.CommandBars("Cell").Controls.Add(Type:=msoControlPopup, Temporary:=True)
With contextmenu
.Caption = HEAD_TITLE
.BeginGroup = False
End With
With contextmenu.Controls.Add(Temporary:=True)
.Caption = codeEditName
.OnAction = "EditCode"
.BeginGroup = True
End With
End If
Set contextmenu = Application.CommandBars("Cell").Controls(HEAD_TITLE)
With contextmenu
aMenu = Split(MENU, ",")
aMenuAct = Split(MENU_ACT, ",")
For i = 0 To UBound(aMenu)
If Not IsSubControl(aMenu(i)) Then
bidx = contextmenu.Controls(codeEditName).Index
With .Controls.Add(Temporary:=True, Before:=bidx)
.Caption = aMenu(i)
.OnAction = aMenuAct(i)
End With
End If
Next
End With
End Sub
Function IsControl(name As String) As Boolean
Dim found As Boolean
For Each c In Application.CommandBars("Cell").Controls
If c.Caption = name Then
found = True
End If
Next c
IsControl = found
End Function
Function IsSubControl(name As String) As Boolean
On Error GoTo ex
Dim found As Boolean
found = False
For Each c In Application.CommandBars("Cell").Controls(HEAD_TITLE).Controls
If c.Caption = name Then
found = True
End If
Next c
ex:
IsSubControl = found
End Function
xla 파일을 만드는 방법
Const HEAD_TITLE = "ハローワールド" 'コンテキストメニューのタイトル
Const MENU = "ハロー,ワールド" 'サブメニューのタイトル(カンマ区切り)
Const MENU_ACT = "hello,world" 'サブメニューのSub名(カンマ区切り)
'ここに関数挿入
Sub hello()
MsgBox "Hello," & Selection
End Sub
Sub world()
MsgBox Selection & " World!"
End Sub
'以降、共通処理
Sub Auto_Open()
AddMenu
End Sub
Sub Auto_Close()
End Sub
Sub EditCode()
SendKeys "%{F11}"
End Sub
Sub AddMenu()
On Error Resume Next
Dim aMenu() As String
Dim aMenuAct() As String
Dim codeEditName As String
codeEditName = "> マクロ編集"
If Not IsControl(HEAD_TITLE) Then
Set contextmenu = Application.CommandBars("Cell").Controls.Add(Type:=msoControlPopup, Temporary:=True)
With contextmenu
.Caption = HEAD_TITLE
.BeginGroup = False
End With
With contextmenu.Controls.Add(Temporary:=True)
.Caption = codeEditName
.OnAction = "EditCode"
.BeginGroup = True
End With
End If
Set contextmenu = Application.CommandBars("Cell").Controls(HEAD_TITLE)
With contextmenu
aMenu = Split(MENU, ",")
aMenuAct = Split(MENU_ACT, ",")
For i = 0 To UBound(aMenu)
If Not IsSubControl(aMenu(i)) Then
bidx = contextmenu.Controls(codeEditName).Index
With .Controls.Add(Temporary:=True, Before:=bidx)
.Caption = aMenu(i)
.OnAction = aMenuAct(i)
End With
End If
Next
End With
End Sub
Function IsControl(name As String) As Boolean
Dim found As Boolean
For Each c In Application.CommandBars("Cell").Controls
If c.Caption = name Then
found = True
End If
Next c
IsControl = found
End Function
Function IsSubControl(name As String) As Boolean
On Error GoTo ex
Dim found As Boolean
found = False
For Each c In Application.CommandBars("Cell").Controls(HEAD_TITLE).Controls
If c.Caption = name Then
found = True
End If
Next c
ex:
IsSubControl = found
End Function
주의점
배포된 추가 기능을 열면 반응하지 않고 움직이지 않는 현상
보안 제한이 걸려 있는 경우, 동작이 무반응이 되어, 빠져나갈 곳이 되고 있습니다.
덤. 추가 기능 추가를 수행하는 추가 기능
아래 코드를 마찬가지로 "xla 파일을 만드는 방법"과 같은 절차로 작성하면 설치 프로그램 제거 프로그램과 유사합니다.
※파일명을 기준으로 동작하므로, 파일명은 타이틀 기재대로 해 주세요.
※ 인스톨러는 xla 파일과 같은 위치에 배치해 주십시오.
※수동으로 할 수 있는 일(애드인의 추가・삭제)을 매크로로 하고 있을 뿐이므로, 동작하지 않는 경우는 수동으로 실시해 주세요.
Install_【설치할 xla의 파일명(확장자 제외)】.xlaSub Auto_Open()
On Error GoTo ex
If IsAddin(GetName()) Then
MsgBox "既にアドインが起動されているので、続行できません。"
Exit Sub
End If
If MsgBox(GetName() & "をExcelアドインに追加します。よろしいですか?", vbYesNo) = vbNo Then Exit Sub
Set fso = CreateObject("Scripting.FileSystemObject")
fso.CopyFile ThisWorkbook.Path & "\" & GetName() & ".xla", Application.UserLibraryPath & GetName() & ".xla"
Set fso = Nothing
Set myaddin = AddIns.Add(Filename:=Application.UserLibraryPath & GetName() & ".xla")
myaddin.Installed = True
MsgBox "Excelアドインを追加しました。次回起動時に有効になります。"
Exit Sub
ex:
MsgBox "アドインを追加できませんでした。Excelを開いた状態でInstallを実行してください。"
End Sub
Function IsAddin(name As String) As Boolean
On Error GoTo ex
IsAddin = False
If AddIns(name).Installed = True Then
IsAddin = True
End If
ex:
End Function
Function GetName()
Dim aNam() As String
aNam = Split(Split(ThisWorkbook.name, ".")(0), "_", 2)
GetName = aNam(1)
End Function
Uninstall_【제거할 xla의 파일명(확장자 제외)】.xlaSub Auto_Open()
On Error Resume Next
Dim name As String
name = GetName()
If MsgBox(name & "をExcelアドインから削除します。よろしいですか? ", vbYesNo) = vbNo Then Exit Sub
Application.AddIns(name).Installed = False
Set fso = CreateObject("Scripting.FileSystemObject")
fso.DeleteFile Application.UserLibraryPath & name & ".xla"
Set fso = Nothing
Application.CommandBars("Cell").Controls(name).Delete
MsgBox "削除が完了しました。もし削除されていない場合は、Excelをすべて閉じた後に再度実行してください。"
End Sub
Function GetName()
Dim aNam() As String
aNam = Split(Split(ThisWorkbook.name, ".")(0), "_", 2)
GetName = aNam(1)
End Function
Reference
이 문제에 관하여([Excel] 엑셀 추가 기능 만들기 템플릿), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/RAWSEQ/items/272ee7a976ba7f38e120
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Sub Auto_Open()
On Error GoTo ex
If IsAddin(GetName()) Then
MsgBox "既にアドインが起動されているので、続行できません。"
Exit Sub
End If
If MsgBox(GetName() & "をExcelアドインに追加します。よろしいですか?", vbYesNo) = vbNo Then Exit Sub
Set fso = CreateObject("Scripting.FileSystemObject")
fso.CopyFile ThisWorkbook.Path & "\" & GetName() & ".xla", Application.UserLibraryPath & GetName() & ".xla"
Set fso = Nothing
Set myaddin = AddIns.Add(Filename:=Application.UserLibraryPath & GetName() & ".xla")
myaddin.Installed = True
MsgBox "Excelアドインを追加しました。次回起動時に有効になります。"
Exit Sub
ex:
MsgBox "アドインを追加できませんでした。Excelを開いた状態でInstallを実行してください。"
End Sub
Function IsAddin(name As String) As Boolean
On Error GoTo ex
IsAddin = False
If AddIns(name).Installed = True Then
IsAddin = True
End If
ex:
End Function
Function GetName()
Dim aNam() As String
aNam = Split(Split(ThisWorkbook.name, ".")(0), "_", 2)
GetName = aNam(1)
End Function
Sub Auto_Open()
On Error Resume Next
Dim name As String
name = GetName()
If MsgBox(name & "をExcelアドインから削除します。よろしいですか? ", vbYesNo) = vbNo Then Exit Sub
Application.AddIns(name).Installed = False
Set fso = CreateObject("Scripting.FileSystemObject")
fso.DeleteFile Application.UserLibraryPath & name & ".xla"
Set fso = Nothing
Application.CommandBars("Cell").Controls(name).Delete
MsgBox "削除が完了しました。もし削除されていない場合は、Excelをすべて閉じた後に再度実行してください。"
End Sub
Function GetName()
Dim aNam() As String
aNam = Split(Split(ThisWorkbook.name, ".")(0), "_", 2)
GetName = aNam(1)
End Function
Reference
이 문제에 관하여([Excel] 엑셀 추가 기능 만들기 템플릿), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/RAWSEQ/items/272ee7a976ba7f38e120텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)