VBA - 屏幕更新无法正常工作

问题描述:

我有受保护的工作簿,用户只能在某些字段上进行更改。由于我们无法控制用户端的复制/粘贴格式。我有下面的代码,这将帮助我保持目标格式。VBA - 屏幕更新无法正常工作

我用Font'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 

我试着更新下面的代码。 .Undo功能是创建一个问题

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

也许更轻量级的事件处理程序可直接设置“Target”的字体(以及其他相关格式)而不会受到ScreenUpdating或EnableEvents的干扰,这可能会减少甚至消除问题。这段代码对于陈述的问题似乎有些过火。 –

+0

如果你走这条路线,应该简单地删除'NewValues = Target','Application.Undo'和'Target = NewValues'行。 –

正如@约翰·科尔曼建议你只需要在您要保留的字体宋体片验证码,

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) 
    Target.Font.Name = "Calibri" 
End Sub 

@Sady此代码,这是你更新后的代码

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