Sibainu Relax Room

愛犬の柴犬とともに過ごす部屋

EXCEL の狭小な列幅のシートの編集を簡単に

朝の散歩も暑い。9月なのにこの暑さはどうなっているという顔をしている柴犬です。

概要

次の画像のような列幅の狭小な excel のシートを編集は、そのまま人力で行おうとすると結構気を使います。

年寄りには、目がチカチカしてとても困難な仕事になります。

そこで、少しでも楽ができる編集ツールを考えてみました。

私が使っている教科書です。

ツールの方針

1.フォーム操作で行えること

2.選択した領域の列幅が変更できること

3.領域がフォームから指定選択できること

4.罫線、アライメント、マージができること

5.選択範囲が左右上下、移動できること など

6.1紙面の推測範囲は、シートの左から列幅が0.5未満の範囲とします。0.5はコードの中で適宜変えることができます。

7.編集のセルの列範囲は、1紙面の推測範囲のパーセントで指定できるようにする。

以上により、次のようなフォームとしました。

Visual Basic エディターでのフォームの編集がめんです。

フォーム上のコントロールの種類と名前は次のようにしています。

ソースコード

シートに書くコードになります。

フォームから選択範囲が読み取れるように、プロパティを作成しています。

マウスのダブルクリックまたは右クリックでフォーム「UserForm1」が開くようにしています。

ただ、通常のメニューが開くようにしたいので、ここではセル「A1」が何かデータが入っていればフォームが開くようにしています。

copy

Option Explicit

Private memAreatop      As Long
Private memArealeft     As Long
Private memAreawidth    As Long
Private memAreaheight   As Long

Public Property Get Areatop() As Long
    Areatop = memAreatop
End Property

Public Property Get Arealeft() As Long
    Arealeft = memArealeft
End Property

Public Property Get Areawidth() As Long
    Areawidth = memAreawidth
End Property

Public Property Get Areaheight() As Long
    Areaheight = memAreaheight
End Property

Public Property Get ColWidth() As String
    ColWidth = Format(Selection.Item(1).ColumnWidth, "0.###")
End Property

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

    If Cells(1, 1).Value = "" Then
        Exit Sub
    End If

    Cancel = True
    
    With Selection
        memAreatop = .Item(1).Row
        memArealeft = .Item(1).Column
        memAreawidth = .Item(.Count).Column - .Item(1).Column + 1
        memAreaheight = .Item(.Count).Row - .Item(1).Row + 1
    End With

    UserForm1.Show

End Sub

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)

    If Cells(1, 1).Value = "" Then
        Exit Sub
    End If

    Cancel = True
    
    With Selection
        memAreatop = .Item(1).Row
        memArealeft = .Item(1).Column
        memAreawidth = .Item(.Count).Column - .Item(1).Column + 1
        memAreaheight = .Item(.Count).Row - .Item(1).Row + 1
    End With

    UserForm1.Show

End Sub

フォーム「UserForm1」に書くコードになります。

copy

Option Explicit

Private scol            As Long
Private ecol            As Long
Private VarAlign        As Dictionary
Private HoriAlign       As Dictionary
Private Target          As Range

Private Sub di_Click()

    Call incRangeSet("down")

End Sub

Private Sub ui_Click()

    Call incRangeSet("up")

End Sub

Private Sub li_Click()

    Call incRangeSet("left")

End Sub

Private Sub ri_Click()

    Call incRangeSet("right")

End Sub

Private Sub UserForm_Initialize()
    Dim i           As Long

    With ActiveSheet
        Me.tval.Value = .Areatop
        Me.lval.Value = .Arealeft
        Me.wval.Value = .Areawidth
        Me.hval.Value = .Areaheight
        Me.cval.Value = .ColWidth
    End With

    Call ColSet

    Set HoriAlign = New Dictionary
    With HoriAlign
        .Add "標準", xlGeneral
        .Add "左詰め", xlLeft
        .Add "中央揃え", xlCenter
        .Add "右詰め", xlRight
        .Add "繰り返し", xlFill
        .Add "両端揃え", xlJustify
        .Add "選択範囲内で中央", xlCenterAcrossSelection
        .Add "均等割り付け", xlDistributed
    End With

    Set VarAlign = New Dictionary
    With VarAlign
        .Add "上詰め ", xlTop
        .Add "中央揃え ", xlCenter
        .Add "下詰め ", xlBottom
        .Add "繰り返し ", xlFill
        .Add "両端揃え ", xlJustify
        .Add "均等割り付け ", xlDistributed
    End With

    Dim val As Variant
    With Me.halign
        For Each val In HoriAlign.Keys
            .AddItem val
        Next val
    End With

    With Me.valign
        For Each val In VarAlign.Keys
            .AddItem val
        Next val
    End With

    Call RangeSet

    Me.content.Value = Target.Cells(1, 1).Value

End Sub

Private Sub lp_DblClick(ByVal Cancel As MSForms.ReturnBoolean)

    If IsNumeric(Me.lp.Value) Then
        Me.lval.Value = Int(CDbl(Me.lp.Value) * (ecol - scol + 1) / 100)
    End If

    Call RangeSet

End Sub

Private Sub wp_DblClick(ByVal Cancel As MSForms.ReturnBoolean)

    If IsNumeric(Me.wp.Value) Then
        Me.wval.Value = Int(CDbl(Me.wp.Value) * (ecol - scol + 1) / 100)
    End If

    Call RangeSet

End Sub

Private Sub セット_Click()

    With ActiveSheet
        .Range(.Cells(1, CInt(Me.lval.Value)), _
               .Cells(1, CInt(Me.lval.Value) + CInt(Me.wval.Value) - 1)).ColumnWidth = CDbl(Me.cval.Value)
    End With

    Call ColSet

    Me.cval.Value = Target.Cells(1, 1).ColumnWidth

End Sub

Private Sub 実行_Click()

    Call RangeSet(True)

    With Target.Borders(xlEdgeTop)
    Select Case True
    Case Me.tlh
        .Weight = xlHairline
    Case Me.tlm
        .Weight = xlThin
    Case Me.tlb
        .Weight = xlMedium
    Case Me.tlno
        .LineStyle = xlNone
    Case Me.tlf.Value
        '何もしません
    End Select
    End With

    With Target.Borders(xlEdgeRight)
    Select Case True
    Case Me.rlh
        .Weight = xlHairline
    Case Me.rlm
        .Weight = xlThin
    Case Me.rlb
        .Weight = xlMedium
    Case Me.rlno
        .LineStyle = xlNone
    Case Me.rlf.Value
        '何もしません
    End Select
    End With

    With Target.Borders(xlEdgeBottom)
    Select Case True
    Case Me.blh
        .Weight = xlHairline
    Case Me.blm
        .Weight = xlThin
    Case Me.blb
        .Weight = xlMedium
    Case Me.blno
        .LineStyle = xlNone
    Case Me.blf.Value
        '何もしません
    End Select
    End With

    With Target.Borders(xlEdgeLeft)
    Select Case True
    Case Me.llh
        .Weight = xlHairline
    Case Me.llm
        .Weight = xlThin
    Case Me.llb
        .Weight = xlMedium
    Case Me.llno
        .LineStyle = xlNone
    Case Me.llf.Value
        '何もしません
    End Select
    End With

    With Target
        .MergeCells = Me.merg.Value
        .WrapText = Me.rap.Value
        .ShrinkToFit = Me.fit.Value
        If Me.halign.Value = "" Then
            .HorizontalAlignment = xlGeneral
        Else
            If HoriAlign.Exists(Me.halign.Value) Then
                .HorizontalAlignment = HoriAlign(Me.halign.Value)
            Else
                .HorizontalAlignment = xlGeneral
            End If
        End If
        If Me.valign.Value = "" Then
            .VerticalAlignment = xlCenter
        Else
            If VarAlign.Exists(Me.valign.Value) Then
                .VerticalAlignment = VarAlign(Me.valign.Value)
            Else
                .VerticalAlignment = xlCenter
            End If
        End If
        .AddIndent = False
        .IndentLevel = 0
    End With

    Target.Cells(1, 1).Value = Me.content.Value

End Sub

Private Sub 閉じる_Click()

    Unload Me

End Sub

Private Sub ColSet()
    Dim i               As Long

    With ActiveSheet

        scol = 0
        ecol = 0
        For i = 1 To .Columns.Count
            If .Cells(1, i).ColumnWidth < 0.5 Then
                If scol = 0 Then
                    scol = i
                End If
                ecol = i
            Else
                If scol > 0 Then
                    i = .Columns.Count
                End If
            End If
        Next i
    End With

End Sub

Private Sub RangeSet(Optional ByVal resetflg As Boolean = False)

    If resetflg Then
        With Target
            .MergeCells = False
            .ClearContents
        End With
    End If

    With ActiveSheet
        Set Target = .Range(.Cells(CInt(Me.tval.Value), _
                                   CInt(Me.lval.Value)), _
                            .Cells(CInt(Me.tval.Value) + CInt(Me.hval.Value) - 1, _
                                   CInt(Me.lval.Value) + CInt(Me.wval.Value) - 1))
    End With

    Target.Select

End Sub

Private Sub incRangeSet(ByVal flg As String)
    Dim h As Long
    Dim v As Long

    With Target
        .MergeCells = False
        .ClearContents
    End With

    h = 0
    v = 0
    Select Case flg
    Case "left"
        If CInt(Me.lval.Value) >= 2 Then
            h = -1
        End If
    Case "right"
        h = 1
    Case "up"
        If CInt(Me.tval.Value) >= 2 Then
            v = -1
        End If
    Case "down"
        v = 1
    End Select

    Me.tval.Value = CInt(Me.tval.Value) + v
    Me.lval.Value = CInt(Me.lval.Value) + h

    With ActiveSheet
        Set Target = .Range(.Cells(CInt(Me.tval.Value), _
                                   CInt(Me.lval.Value)), _
                            .Cells(CInt(Me.tval.Value) + CInt(Me.hval.Value) - 1, _
                                   CInt(Me.lval.Value) + CInt(Me.wval.Value) - 1))
    End With

    Target.Select

End Sub