エクセルで条件付き書式が含まれているセルをコピー&ペーストすると、条件付き書式が増殖する。
条件付き書式の増える条件は不明だが、検証の結果以下は確かめられた。
・行全体をコピー⇒貼り付け 増える
・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で選択を解除している。