2017-10-16 17 views
0

ユーザーが特定のフィールドのみを変更できるブックを保護しました。私たちはユーザー側からコピー/貼り付けフォーマットを制御することができないからです。私は宛先の書式を維持するのに役立つ以下のコードを持っています。VBA - 画面更新が期待どおりに機能しない

フォント「Calibri」で書式設定されたブックがあります。したがって、ユーザーがデータを他の形式からワークブックにコピーすると、「Calibri」フォントの保持に役立ちます。

私の関心事:ユーザーがデータをコピーすると、コードがアクティブになる前にソースフォーマットが表示され、必要なフォーマットが変更されます。あなたのマクロコードをスピードアップするために画面を更新しました。しかし、それは私の目的に役立っています。この問題を解消することは可能ですか?

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) 

     Dim vNewValues As Variant 
     NewValues = Target 
     Application.ScreenUpdating = False 
     Application.EnableEvents = False 
     Application.Undo 

     Target = NewValues 

     Application.EnableEvents = True 
    Application.ScreenUpdating = True 
End Sub 

以下のコードを更新しようとしました。 @ジョン・コールマンは、あなただけのフォントcalibriを維持したいシートにこのコードが必要に示唆したように、あなたはすべてのためにこれをしたい場合.Undo機能は

Private Sub Worksheet_Change(ByVal Target As Range) 
     Target.Font.Name = "Calibri" 
    End Sub 

、問題

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) 

    Dim vNewValues As Variant 
     NewValues = Target 
     Application.EnableEvents = False 
     Target.Font.Name = "Calibri" 
     Target.Font.Size = 11 
     Target.HorizontalAlignment = xlLeft 
     Target.VerticalAlignment = xlTop 
     Target.WrapText = True 
     Application.Undo 
     Target = NewValues 
    End Sub 
+1

おそらく、 'ScreenUpdating'や' EnableEvents'で気にせずに 'Target'のフォント(および他の関連フォーマット)を直接設定するより軽量なイベントハンドラは、この問題を減らしたり、排除したりするかもしれません。このコードは、述べられている問題のために過剰なもののようです。 –

+0

'NewValues = Target'、' Application.Undo'、 'Target = NewValues'の行は、このルートに行くと削除されます。 –

答えて

2

を作成していますワークブック内のシートは、あなたのワークブック

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) 
    Target.Font.Name = "Calibri" 
End Sub 

@Sadyにこのコードを貼り付け、これがあなたの更新されたコード

です3210
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) 
     Application.EnableEvents = False 
     Target.Font.Name = "Calibri" 
     Target.Font.Size = 11 
     Target.HorizontalAlignment = xlLeft 
     Target.VerticalAlignment = xlTop 
     Target.WrapText = True 
     Application.EnableEvents = True 
End Sub 
+0

この 'Workbook_SheetChange(ByVal Sh As Object、ByVal Target As Range)'イベントを使用すると、各シートにコードを貼り付ける必要はありません – Maddy

+0

@Maddy Trueしかし、sadyがすべてのシートのためにこれを望んでいるかどうかわかりません! –

+0

@ImranMalek、ご返信ありがとうございます。はい、私はすべてのシートのためにこれを必要とします。つまり、コードに必要なすべての書式を直接入力する必要があります。 – sady

関連する問題