Excel (一般機能)

Excelの一般機能に関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : その他)
条件付き書式がペーストによって崩されない方法
投稿日時: 20/10/29 17:35:44
投稿者: Alice87

Microsoft Excel for Office 365を使用しています。
 
条件付き書式を設定しているセルに、そのままペーストされてしまうと設定がなくなってしまうので(コピーした方の書式がいかされてしまう)、VBAを使用せずに制御できる方法がないかと思いまして書き込みました。
(条件付き書式を壊されない為に、強制的にペーストは値のみになるようVBA設定していたのですが、これが機能すると「「元に戻る」がきかなくなってしまうのが困る。」ということになりまして。
いろんなサイトを見ると「元に戻る」がきかなくなるのはVBAによる動作だからと記載されていたのですが。)
 
「シートの保護」にある「このシートのすべてのユーザーに許可する操作」の「セルの書式設定」のチェックははずれていますが、本件を制御する機能はありませんでした。
 
ちなみに、「ThisWorkbook」に下記コードを入れるとペーストの制御ができていました。
かなりいろんなサイトで調べましたが、何か良い知恵をお持ちの方がいらっしゃいましたら、アドバイスをいただけると幸いです。
 
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
 
'シートの保護がされている時は値でペーストだけにする
If Sh.ProtectContents = True Then
 
    If Sh.Name = "ダミー" Then
     
        On Error Resume Next
        Target.PasteSpecial xlPasteValues
        Application.CutCopyMode = True
     
    End If
     
End If
 
End Sub

回答
投稿日時: 20/10/30 11:00:44
投稿者: WinArrow
投稿者のウェブサイトに移動

対応策は2つ
 
(1)条件付き書式が設定されているセルにが壊されているかチェックできるならば、
VBAで再設定することができますよね?
 
(2)「もとに戻す」の対処としては、
VBAの場合、元に戻すことは困難です。
早めに、うア書き保存せずに閉じることです。

回答
投稿日時: 20/10/30 11:40:32
投稿者: んなっと

「元に戻す」をVBAで追加する方法もありますが、それではだめなのですか?
例えば下の方法です。
 
不具合もあり抜け道だらけなので、私なら絶対に使いませんが...
 
●ThisWorkbookに
 
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
  Dim Str As String
  'If Sh.ProtectContents = False Then Exit Sub
  'If Sh.Name <> "ダミー" Then Exit Sub
  On Error Resume Next
  Str = Application.CommandBars("Standard").FindControl(ID:=128, Recursive:=True).List(1)
  On Error GoTo 0
  If Str <> "貼り付け" Then Exit Sub
  With Application
    .ScreenUpdating = False
    .EnableEvents = False
    .Undo
    Set Rng = Target
    Valu = Rng.Value
    Rng.PasteSpecial Paste:=xlPasteValues
    .OnUndo "値貼付", "UndoPastespecial"
    .CutCopyMode = False
    .ScreenUpdating = True
    .EnableEvents = True
  End With
End Sub
 
●標準モジュールの一番上に
 
Public Rng As Range
Public Valu
Sub UndoPastespecial()
  With Rng
    .Value = Valu
    .Parent.Activate
    .Select
  End With
End Sub

回答
投稿日時: 20/10/30 15:59:59
投稿者: Suzu

2013 でも再現できました。PasteSpecial だと そうなるのでしょうかね。
 
FormatCondition の違いを確認しようとしていたら
たまたま、アクティブシートを変更してしまったので元に戻したら 希望通りに色がついていました。
 
確認してみてください。
 
 
再現できるのであれば、
コードにてアクティブシートを変えて戻すを試してみる。
 
再現できないのであれば
1.貼付前に、FormatCondition の 設定 を記録しておき、(値の)貼付後に、FormatConditionを再設定
 
2.PastSpecial を使用せず、クリップボードの内容を Valueに代入
   参考:https://www.moug.net/tech/exvba/0150091.html
         https://excel-ubara.com/excelvba4/EXCEL_VBA_418.html
         https://temrer.com/vba-pasteboard/?doing_wp_cron=1604037748.8127028942108154296875

回答
投稿日時: 20/10/30 18:28:27
投稿者: んなっと

一般機能では無理です。
 
整理すると...
「値貼り付け」でお願いしているのに、
【1】PCに慣れていない人がうっかり通常の貼り付けをしてしまう。
 
検索して強制的に「値貼り付け」にするVBAコードを見つけた。
しかし...
【2】「元に戻す」が無効になってしまい、不便だ。
 
【2】が問題の中心なのですよね。
VBA板に質問したほうがいいと思います。一般機能板では役に立てません。

投稿日時: 20/11/06 09:57:16
投稿者: Alice87

皆様
 
コメントありがとうございます。また、返信が遅くなり申し訳ありません。
 
結論を申し上げると、「元に戻る」をVBAで設定することはせず、そのままペーストされて「条件付き書式」を壊されるケースも想定して、ユーザーが誤った入力をしていることが分かるよう別途関数を入れることにしました。
 
(本件の質問をするに至ったのは、んなっと様が記載された通りです。)
 
皆様がご意見を下さり、大変感謝しております。