此代码是错误的还是我没有正确使用它?

时间:2014-08-14 20:08:58

标签: excel-vba event-handling vba excel

我正在审核这段代码

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    If Target.Column = 1 And Target.Offset(1, 0) = "" Then
        Target.Offset(-1, 0).Copy
        Target.PasteSpecial Paste:=xlPasteFormats
        Application.CutCopyMode = False
    End If
End Sub

基本上应该做的是将单元格的格式复制到您正在键入/粘贴数据的格式之上,这样如果粘贴多个单元格,它将开始将格式复制到所有单元格。

我已经测试了这段代码但是大多数时候我得到错误'13运行时另一件事是它什么时候工作它只适用于A列,但由于某种原因代码不稳定它真的很脆弱并采取它工作约1.3秒。当我将信息粘贴到单元格中时,它就无法正常工作,因为我输入了代码的实际目的正是为了强制粘贴的任何类型的数据都具有上面单元格的格式

我们如何让这段代码将单元格的格式复制/粘贴到我输入数据的格式之上,但是适用于所有列而不仅仅是列A

此外,有没有办法让代码运行得更快?如果我删除任何内容,我也会得到错误'13。此外,如果我将代码粘贴到我已经处理过的Excel工作表中,它将完全不起作用。

1 个答案:

答案 0 :(得分:3)

我在上面的评论中提到了事件循环,在使用事件处理程序时要注意这一点非常重要。

此行仅将您的代码限制为A列,特别是"和"之前的位:

If Target.Column = 1 And Target.Offset(1, 0) = "" Then

我将在此处进行更改,但也限制它排除第1行(如果您在第1行中执行此操作,则会在Target.Offset(-1,0)上收到错误。)

我也将其限制为仅适用于单个单元格的目标。

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    Application.EnableEvents = False
    If Not Target.Cells.Count = 1 Or Target.Row = 1 Then Exit Sub
    If Target.Offset(1, 0) = "" Then
        Target.Offset(-1, 0).Copy
        Target.PasteSpecial Paste:=xlPasteFormats
        Application.CutCopyMode = False
    End If
    Application.EnableEvents = True
End Sub

当然可以在一系列单元格上使用事件处理程序,但是我们会在Target.Offset(1,0)上得到一个错误(这实际上要求该单元格的.Value,这将是如果它是多个单元格的范围,则会失败。)。就像我说的,有解决方法,但实际上并不知道你需要什么,很难提出准确的建议。

这可能有用;仍限于单个,但我认为它适用于多个单元格。

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    Application.EnableEvents = False
    Dim nextRow as Variant

    If Not Target.Rows.Count = 1 Or Target.Row = 1 Then Exit Sub

    'store the next row in an array:
    nextRow = Application.Transpose(Application.Transpose(Target.Offset(1, 0).Value)

    If Join(nextRow, "") = "" Then
        Target.Offset(-1, 0).Copy
        Target.PasteSpecial Paste:=xlPasteFormats
        Application.CutCopyMode = False
    End If
    Application.EnableEvents = True
End Sub