【Excel】 일괄 적으로 같은 분류끼리의 셀을 결합하거나 같은 값으로 메우기 - Classmerge.xla
개요
좋은 타이틀 표현이 생각나지 않았기 때문에 그림으로 표현합니다. 어쩐지 아는 분은 도움을주십시오.
Excel 테이블에서 자주 볼 수 있는 위와 같은 분류 표현을 상호 변환할 수 있는 추가 기능을 만들어 보았습니다. 추출·정렬로 부모의 분류를 모르는 현상을 회피할 수 있습니다.
간단하게 만든 것이므로 제어가 이르지 않을지도 모릅니다. 더 좋은 것이 있으면 알려주세요.
타이틀이나 설명은, 정말로 마음대로 리츠이·리포스트등으로 포착해 주시면 고맙습니다.
사용하는 것
선택하고 오른쪽 클릭 메뉴에서 조작할 수 있습니다.
다운로드
h tp : // l ぃ에서. 이 m/pgm/C㎁s메르게. 지 p
동봉 readme 파일도 확인해 주십시오.
이용방법
선택하고 오른쪽 클릭 메뉴에서 조작할 수 있습니다.
다운로드
h tp : // l ぃ에서. 이 m/pgm/C㎁s메르게. 지 p
동봉 readme 파일도 확인해 주십시오.
이용방법
이용 방법(추가 기능 추가)
추가 기능 삭제
출처
VB 매크로이므로 조인 규칙과 동작을 개선하고 싶다면 다음과 같이 소스에서 수정을 추가하여 사용할 수 있습니다. (※메뉴의 이름 등을 바꾸고 싶은 경우는 반드시 일단 메뉴를 삭제하고 나서 실시해 주세요.)
Classmerge.bas
Const CLASS_CONTROL = "分類制御(&R)"
Const CLASS_MERGE = "分類結合(&R)"
Const UNMERGE_CELL = "結合解除(&U)"
Const CLASS_FILL = "分類フィル(&Y)"
Const REMOVE_MENU = "メニューを削除"
Const INSTALL_ME = "Excelアドインに追加する"
Const UNINSTALL_ME = "Excelアドインから削除する"
Const CLASS_CONTROL_CT = "アドイン制御"
Public isInstalling As Boolean
Function Version()
If Not IsControl(CLASS_CONTROL) Then
Version = MsgBox("CLASS_MERGE (C)RAWSEQ" & vbCr & vbLf & "この追加機能を用いて実行した内容は「元に戻す」ことができません。" & vbCr & vbLf & "著作者はこの機能に関わる一切の責任を問われない事をご了承ください。" & vbCr & vbLf & " " & vbCr & vbLf & "※ この画面は単体起動時とアドイン追加後のExcel初回起動時に出現しますが、アドイン追加後の画面を了承していただいた後は出現しません。", vbYesNo)
End If
End Function
Sub InstallMe()
If IsAddin("Classmerge") Then
MsgBox "既に追加されているので、続行できません。"
Exit Sub
End If
If MsgBox("Excelアドインに追加します。よろしいですか?", vbYesNo) = vbNo Then Exit Sub
RemoveMenuCore 1
isInstalling = True
Set fso = CreateObject("Scripting.FileSystemObject")
fso.CopyFile ThisWorkbook.FullName, Application.UserLibraryPath & "Classmerge.xla"
Set fso = Nothing
Set myaddin = AddIns.Add(Filename:=Application.UserLibraryPath & "Classmerge.xla")
myaddin.Installed = True
MsgBox "Excelアドインを追加しました。次回起動時に有効になります。"
End Sub
Sub UninstallMe()
MsgBox "Excelを全て終了し、UninstallClassmerge.xlaを実行してください。"
End Sub
Sub RemoveMenu()
RemoveMenuCore 0
End Sub
Sub RemoveMenuCore(mode)
If mode = 0 Then
If IsAddin("Classmerge") Then
MsgBox "Excelアドインとして追加されているのでアドインから削除してください"
Exit Sub
End If
If MsgBox("分類メニューを削除します。よろしいですか?", vbYesNo) = vbNo Then Exit Sub
End If
If IsControl(CLASS_CONTROL) Then
Application.CommandBars("Cell").Controls(CLASS_CONTROL).Delete
End If
End Sub
Sub Auto_Open()
If isInstalling Then Exit Sub
If Version() = vbNo Then Exit Sub
AddMenu
End Sub
Sub Auto_Close()
If Not IsAddin("Classmerge") Then
If IsControl(CLASS_CONTROL) Then
Application.CommandBars("Cell").Controls(CLASS_CONTROL).Delete
End If
End If
End Sub
Sub AddMenu()
If Not IsControl(CLASS_CONTROL) Then
Set contextmenu = Application.CommandBars("Cell").Controls.Add(Type:=msoControlPopup)
With contextmenu
.Caption = CLASS_CONTROL
.BeginGroup = False
With .Controls.Add()
.Caption = CLASS_MERGE
.OnAction = "ClassMerge"
.FaceId = 798
End With
With .Controls.Add()
.Caption = UNMERGE_CELL
.OnAction = "UnMerge"
.FaceId = 800
End With
With .Controls.Add()
.Caption = CLASS_FILL
.OnAction = "ClassFill"
.FaceId = 800
End With
With .Controls.Add(Type:=msoControlPopup)
.Caption = CLASS_CONTROL_CT
.BeginGroup = False
With .Controls.Add()
.Caption = INSTALL_ME
.OnAction = "InstallMe"
End With
With .Controls.Add()
.Caption = UNINSTALL_ME
.OnAction = "UninstallMe"
End With
With .Controls.Add()
.Caption = REMOVE_MENU
.OnAction = "RemoveMenu"
End With
End With
End With
End If
End Sub
Sub ClassMerge()
Selection.UnMerge
Call ClassTrim
Dim r As Range
Dim first_row As Integer
Dim first_col As Integer
first_row = Selection(1).Row
first_col = Selection(1).Column
For Each r In Selection
If r.Value = "" And r.Row > first_row Then
If r.Column > first_col Then
If Not r.Offset(, -1).MergeCells Then
GoTo continue
End If
End If
Range(r.Offset(-1), r).Merge
End If
continue:
Next
End Sub
Sub ClassFill()
Call UnMerge
Dim r As Range
Dim first_row As Integer
Dim first_col As Integer
first_row = Selection(1).Row
first_col = Selection(1).Column
For Each r In Selection
If r.Value = "" And r.Row > first_row Then
If r.Column > first_col Then
If r.Offset(, -1).Value <> r.Offset(-1, -1).Value Then
GoTo continue
End If
End If
r.Value = r.Offset(-1).Value
End If
continue:
Next
End Sub
Sub ClassTrim()
Dim r As Range
Dim first_row As Integer
Dim first_col As Integer
first_row = Selection(1).Row
first_col = Selection(1).Column
end_row = Selection(Selection.Count).Row
end_col = Selection(Selection.Count).Column
For c_row = end_row To first_row + 1 Step -1
For c_col = end_col To first_col Step -1
If c_col > first_col Then
If Cells(c_row, c_col - 1).Value <> Cells(c_row - 1, c_col - 1).Value Then
GoTo continue
End If
End If
If Cells(c_row, c_col).Value = Cells(c_row - 1, c_col).Value Then
Cells(c_row, c_col).Value = ""
End If
continue:
Next
Next
End Sub
Sub UnMerge()
Selection.UnMerge
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 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
중첩이 심한 것은 VBA라면 AndAlso나 OrElse의 표현을 이용할 수 없어, 면식 받았기 때문이라고 일단 변명해 둡니다·・w
주의점
Const CLASS_CONTROL = "分類制御(&R)"
Const CLASS_MERGE = "分類結合(&R)"
Const UNMERGE_CELL = "結合解除(&U)"
Const CLASS_FILL = "分類フィル(&Y)"
Const REMOVE_MENU = "メニューを削除"
Const INSTALL_ME = "Excelアドインに追加する"
Const UNINSTALL_ME = "Excelアドインから削除する"
Const CLASS_CONTROL_CT = "アドイン制御"
Public isInstalling As Boolean
Function Version()
If Not IsControl(CLASS_CONTROL) Then
Version = MsgBox("CLASS_MERGE (C)RAWSEQ" & vbCr & vbLf & "この追加機能を用いて実行した内容は「元に戻す」ことができません。" & vbCr & vbLf & "著作者はこの機能に関わる一切の責任を問われない事をご了承ください。" & vbCr & vbLf & " " & vbCr & vbLf & "※ この画面は単体起動時とアドイン追加後のExcel初回起動時に出現しますが、アドイン追加後の画面を了承していただいた後は出現しません。", vbYesNo)
End If
End Function
Sub InstallMe()
If IsAddin("Classmerge") Then
MsgBox "既に追加されているので、続行できません。"
Exit Sub
End If
If MsgBox("Excelアドインに追加します。よろしいですか?", vbYesNo) = vbNo Then Exit Sub
RemoveMenuCore 1
isInstalling = True
Set fso = CreateObject("Scripting.FileSystemObject")
fso.CopyFile ThisWorkbook.FullName, Application.UserLibraryPath & "Classmerge.xla"
Set fso = Nothing
Set myaddin = AddIns.Add(Filename:=Application.UserLibraryPath & "Classmerge.xla")
myaddin.Installed = True
MsgBox "Excelアドインを追加しました。次回起動時に有効になります。"
End Sub
Sub UninstallMe()
MsgBox "Excelを全て終了し、UninstallClassmerge.xlaを実行してください。"
End Sub
Sub RemoveMenu()
RemoveMenuCore 0
End Sub
Sub RemoveMenuCore(mode)
If mode = 0 Then
If IsAddin("Classmerge") Then
MsgBox "Excelアドインとして追加されているのでアドインから削除してください"
Exit Sub
End If
If MsgBox("分類メニューを削除します。よろしいですか?", vbYesNo) = vbNo Then Exit Sub
End If
If IsControl(CLASS_CONTROL) Then
Application.CommandBars("Cell").Controls(CLASS_CONTROL).Delete
End If
End Sub
Sub Auto_Open()
If isInstalling Then Exit Sub
If Version() = vbNo Then Exit Sub
AddMenu
End Sub
Sub Auto_Close()
If Not IsAddin("Classmerge") Then
If IsControl(CLASS_CONTROL) Then
Application.CommandBars("Cell").Controls(CLASS_CONTROL).Delete
End If
End If
End Sub
Sub AddMenu()
If Not IsControl(CLASS_CONTROL) Then
Set contextmenu = Application.CommandBars("Cell").Controls.Add(Type:=msoControlPopup)
With contextmenu
.Caption = CLASS_CONTROL
.BeginGroup = False
With .Controls.Add()
.Caption = CLASS_MERGE
.OnAction = "ClassMerge"
.FaceId = 798
End With
With .Controls.Add()
.Caption = UNMERGE_CELL
.OnAction = "UnMerge"
.FaceId = 800
End With
With .Controls.Add()
.Caption = CLASS_FILL
.OnAction = "ClassFill"
.FaceId = 800
End With
With .Controls.Add(Type:=msoControlPopup)
.Caption = CLASS_CONTROL_CT
.BeginGroup = False
With .Controls.Add()
.Caption = INSTALL_ME
.OnAction = "InstallMe"
End With
With .Controls.Add()
.Caption = UNINSTALL_ME
.OnAction = "UninstallMe"
End With
With .Controls.Add()
.Caption = REMOVE_MENU
.OnAction = "RemoveMenu"
End With
End With
End With
End If
End Sub
Sub ClassMerge()
Selection.UnMerge
Call ClassTrim
Dim r As Range
Dim first_row As Integer
Dim first_col As Integer
first_row = Selection(1).Row
first_col = Selection(1).Column
For Each r In Selection
If r.Value = "" And r.Row > first_row Then
If r.Column > first_col Then
If Not r.Offset(, -1).MergeCells Then
GoTo continue
End If
End If
Range(r.Offset(-1), r).Merge
End If
continue:
Next
End Sub
Sub ClassFill()
Call UnMerge
Dim r As Range
Dim first_row As Integer
Dim first_col As Integer
first_row = Selection(1).Row
first_col = Selection(1).Column
For Each r In Selection
If r.Value = "" And r.Row > first_row Then
If r.Column > first_col Then
If r.Offset(, -1).Value <> r.Offset(-1, -1).Value Then
GoTo continue
End If
End If
r.Value = r.Offset(-1).Value
End If
continue:
Next
End Sub
Sub ClassTrim()
Dim r As Range
Dim first_row As Integer
Dim first_col As Integer
first_row = Selection(1).Row
first_col = Selection(1).Column
end_row = Selection(Selection.Count).Row
end_col = Selection(Selection.Count).Column
For c_row = end_row To first_row + 1 Step -1
For c_col = end_col To first_col Step -1
If c_col > first_col Then
If Cells(c_row, c_col - 1).Value <> Cells(c_row - 1, c_col - 1).Value Then
GoTo continue
End If
End If
If Cells(c_row, c_col).Value = Cells(c_row - 1, c_col).Value Then
Cells(c_row, c_col).Value = ""
End If
continue:
Next
Next
End Sub
Sub UnMerge()
Selection.UnMerge
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 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
MIT 라이센스를 준수합니다.
따라서, 동봉되어 있는 파일을 이용했을 경우에 발생한 트러블에 관해서, 이하 제작자의 책임은 묻지 않는 것으로 합니다.
(C)RAWSEQ h tp : // l ぃ에서. 이 m
「편집을 유효」 「콘텐츠의 유효화」(매크로의 실행)는 상기 제작자의 소행을 확인 후, 스스로 판단을 부탁합니다.
Reference
이 문제에 관하여(【Excel】 일괄 적으로 같은 분류끼리의 셀을 결합하거나 같은 값으로 메우기 - Classmerge.xla), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/RAWSEQ/items/30c072c301eeb1a9b2d0텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)