読者です 読者をやめる 読者になる 読者になる

conf t

インフラエンジニアのメモ

エクセル 2010 条件付き書式が増える

VBA

エクセルで条件付き書式が含まれているセルをコピー&ペーストすると、条件付き書式が増殖する。


条件付き書式の増える条件は不明だが、検証の結果以下は確かめられた。

・行全体をコピー⇒貼り付け          増える

・1セルだけをコピー貼り付け         増えない

・F2で入力モードに移ってからコピー⇒貼り付け 増えない

・行全体をコピー⇒コピーしたセルの挿入    増える



条件付き書式の増殖によるデメリットとしては以下が挙げられる。

・条件付き書式を変更する際に手間がかかる。

・ファイルが重くなる(どのくらい重くなるか検証していない)



条件付き書式が増える事象を防ぐには形式を選択して「右クリック」⇒「貼り付け」⇒「条件付き書式の結合」するか、「値のみ貼り付け」するしかない。

しかし例えば、一つのエクセルをチームで編集していく場合、メンバにそのルールを周知し守らせるのは難しい。

一番楽な ctrl v で張り付けたがる。

そこで今回はマクロを使い、ctrl v をデフォルトで「条件付き書式の結合」にする。

また、条件付き書式は「コピーしたセルの挿入」でも増えるため、「コピーしたセルの挿入」は実行できないようにする。

コピー範囲を選択した状態でctrl +でも「コピーしたセルの挿入」が可能なため、ctrl + での「コピーしたセルの挿入」も防ぐ。



module1

Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Public Sub PasteJoken()
    Application.SendKeys "%", True
    Sleep (10)
    Application.SendKeys "h", True
    Sleep (10)
    Application.SendKeys "v", True
    Sleep (10)
    Application.SendKeys "g", True
End Sub

Public Sub RowsInsert()
    Application.CutCopyMode = False
    Selection.EntireRow.Insert

End Sub

Function ChangeEnableOfCommands _
           (ByVal argIdList As String, ByVal argEnabled As Boolean) As Integer
    Dim m_Return As Integer
    Dim m_CommandBar As CommandBar
    Dim m_CommandBarControl As CommandBarControl

    For Each m_CommandBar In Application.CommandBars
        For Each m_CommandBarControl In m_CommandBar.Controls
            If argIdList & "," Like "*" & m_CommandBarControl.ID & ",*" Then
                m_CommandBarControl.Enabled = argEnabled
                m_Return = m_Return + 1
            End If
        Next
    Next
    
    ChangeEnableOfCommands = m_Return
End Function

this workbook

Sub Auto_Open()
    Application.OnKey "^{107}", "RowsInsert"
     Application.OnKey "^v", "PasteJoken"
End Sub


Private Sub Workbook_Open()
    Call Auto_Open
    Call ChangeEnableOfCommands("3187", False)
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Call ChangeEnableOfCommands("3187", True)

End Sub

sendkey を使っているのは、ctrl z のやり直しを使いたいため。

vbaでセルをいじると、やり直しができなくなる。

そのため記入されているセルに間違えて上書きしてしまうともとに戻せなくなる。

挿入の操作の場合は元のセルを上書きししてしまうことはないため、すべてマクロにした。

またマクロで挿入操作をする際にコピー範囲を選択していると、挿入が自動的に「コピーしたセルの挿入」

になってしまうので、Application.CutCopyMode = Falseで選択を解除している。



参考:
http://veaba.keemoosoft.com/2013/08/704/

広告を非表示にする