即使在第一个工作表中正确执行了代码,为什么在进入下一个工作表时也会出现运行时错误?

时间:2018-10-31 16:45:27

标签: excel vba excel-vba

我在编码中遇到了一个问题,谷歌问得好些的问题不再对我有帮助。我的代码中有两个For循环。它们对于我在工作簿中的循环中设置的第一个工作表可以正确执行。但是,更改为下一个工作表会出现运行时错误:

  • 如果使用Application.Average,则运行时错误13
  • 如果使用Application.WorksheetFunction.Average,
  • 运行时错误1004

我要做什么:
我有测量数据。这些在不同的工作表中针对不同的温度范围进行组织。我想遍历数据中相关工作表中的相关列,以找到这些列的平均值。最后,我想将平均值保存到相应标题的第一个工作表中。 (最后一部分我还没有编写任何代码。)

非常感谢您的帮助。

Option Explicit

Sub TestAv()

    Dim ColCount As Long
    Dim ws As Worksheet
    Dim LastRow As Long
    Dim j, k, ColCount2, wsCount As Long
    Dim rngAv As Range
    Dim rngAverage As Double
    Dim Lr As Long

    Dim newBook As Workbook
    Dim firstSheet As Worksheet

    Set newBook = ActiveWorkbook
    Set firstSheet = newBook.Sheets(1)

    Application.ScreenUpdating = False
    ' making firstSheet representable
    ColCount = newBook.Worksheets(2).Columns.Count ' all TCs should have been measured for the first temperature
    newBook.Worksheets(2).Activate
    Range(Cells(1, 2), Cells(1, ColCount)).Copy
    firstSheet.Activate
    firstSheet.Range("B1").Select
    firstSheet.Paste
    Application.CutCopyMode = False
    Application.CutCopyMode = True
    firstSheet.Range("A1").Value = "Temperaturen"
    firstSheet.Name = "Mittelwerte"
    ' calculating mean values in columns of Worksheets
    wsCount = newBook.Worksheets.Count
    For j = 2 To wsCount
        LastRow = firstSheet.Range("A" & Rows.Count).End(xlUp).Row + 1
        Set ws = newBook.Worksheets(j)
        firstSheet.Range("A" & LastRow).Value = ws.Name
        ColCount2 = ws.Columns.Count
        ws.Activate
        Lr = ws.Range("A" & Rows.Count).End(xlUp).Row - 1
        For k = 2 To ColCount2
            Set rngAv = ws.Range(ws.Cells(2, k), ws.Cells(Lr, k))
            rngAverage = Application.Average(rngAv)
            Cells(Lr + 2, k).Value = rngAverage
        Next k
        Set rngAv = Nothing
        Set ws = Nothing
    Next j
    Application.ScreenUpdating = True
    ' Mean Values of TCs for different Temperatures in firstSheet
End Sub

1 个答案:

答案 0 :(得分:3)

    如果我使用Application.Average,则
  • 运行时错误13

    Application.Average后期约束,其行为类似于工作表函数AVERAGE,即,当结果无法显示时,通过返回错误值被评估。由于无法将错误值强制转换为Double,因此分配失败,并出现类型不匹配错误。

    您可以将结果捕获到Variant中,检查它是否是错误值,然后 then 分配给Double;使用IsError函数执行此操作:

    Dim avgResult As Variant
    avgResult = Application.Average(...)
    
    If Not IsError(avgResult) Then
        rngAverage = avgResult
        'rngAverage is safe to use as a Double
    Else
        ' avgResult is a #VALUE! error. what now?
    End If
    
  • 运行时错误1004,如果我使用Application.WorksheetFunction.Average

    这是因为WorksheetFunction.Average早期绑定,并且以VBA惯用的方式处理错误:而不是返回 Error值,它抛出一个运行时错误,然后可以使用常规的On Error语句和错误处理子例程来处理它。

Average函数正在返回/抛出错误,因为给出的输入无效或包含错误-即,如果您在该数据上使用了AVERAGE工作表函数,则不会Double的结果之一。修正数据。