列の表示/非表示をコントロール(続き)

こちら ↓ で作成したユーザーフォームについて、「列のコピーに使用できないか」というコメントがありました。

infoment.hatenablog.com

非表示列をそのままコピーすると貼り付け先でも非表示のままであるため、一手間必要になります。そこでチェックボックスを設け、表示化/非表示化を選択可能にしたうえで、リストボックス内で選択した列をコピーするところまで作ってみました。

Private Sub CommandButton1_Click() ' 閉じるボタン
    Unload Me
End Sub

Private Sub CommandButton2_Click() ' 全選択ボタン

    Dim myFlag  As Boolean
    Dim i       As Long
    
    Select Case CommandButton2.Caption
        Case "全選択"
            myFlag = True
            CommandButton2.Caption = "全解除"
        Case "全解除"
            myFlag = False
            CommandButton2.Caption = "全選択"
    End Select
    
    If CheckBox1.Value = True Then
        Range("A:" & getColumnLetter(100)).EntireColumn.Hidden = myFlag
    End If
    
    For i = 0 To ListBox1.ListCount - 1
        ListBox1.Selected(i) = myFlag
    Next

End Sub

Private Sub CommandButton3_Click() ' 選択コピーボタン
    
    Dim copyRange As Range
    Dim i As Long
    
    For i = 0 To ListBox1.ListCount - 1
        If ListBox1.Selected(i) = True Then
            If copyRange Is Nothing Then
                Set copyRange = Columns(i + 1)
            Else
                Set copyRange = Union(copyRange, Columns(i + 1))
            End If
        End If
    Next
    
    copyRange.Copy

End Sub

Private Sub ListBox1_Mouseup(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)

    Dim i As Long
    
        If CheckBox1.Value = False Then Exit Sub
    
        Columns.Hidden = False
        For i = 1 To ListBox1.ListCount
            Columns(i).Hidden = ListBox1.Selected(i - 1)
        Next

End Sub

Private Sub UserForm_Initialize()

    Dim seq(1 To 100) As Variant
    Dim i As Long
    Dim j As Long
    
    j = 0
    
    For i = 1 To 100
        ListBox1.AddItem StrConv(getColumnLetter(i) & "列(" & i & "列)", vbWide)
        If Columns(i).Hidden = True Then
            ListBox1.Selected(i - 1) = True
        Else
            j = j + 1
        End If
    Next
    
    If j = 100 Then
        CommandButton2.Caption = "全選択"
    Else
        CommandButton2.Caption = "全解除"
    End If


End Sub

' akashi-keirin さんから紹介いただいた関数を使用
' http://akashi-keirin.hatenablog.com/entry/2017/08/27/171615

Public Function getColumnLetter(ByVal columnNumber As Long) As String
On Error GoTo errorHandler
  Dim Sh As Worksheet    '……(1)'
  Set Sh = ActiveSheet
  Dim tmpStr As String
  tmpStr = Sh.Cells(1, columnNumber).Address    '……(2)'
  Dim tmpArray As Variant
  tmpArray = Split(tmpStr, "$")   '……(3)'
  getColumnLetter = tmpArray(1)    '……(4)'
  Exit Function
errorHandler:
  getColumnLetter = ""
End Function

f:id:Infoment:20180712064256p:plain

コピーすることもあるので、ボタンの表示を一部変更しています。

  • 全表示  ⇒ 全解除
  • 全非表示 ⇒ 全選択

選択すると見えなくなるので、人によっては用語と処理の認識が逆転して、操作ミスが起きるかもしれません。また、すでに非表示化されているセルの処理も未検討のままですので、このあたり、さらなる工夫が必要です。

選択列の追加についは、Union を使用しています。copyRange が存在しなければ、選択列をそのままセットし、存在する(=既に一つ以上の列がセットされている)ならば、Union で追加していきます。

チェックボックスを使う以外では、マルチページで機能を分割する方法もあります。

f:id:Infoment:20180712065305p:plain

参考まで。