【问题标题】:Excel VBA import data from ASCII file and make average for plotExcel VBA 从 ASCII 文件导入数据并绘制平均值
【发布时间】:2020-07-28 21:24:53
【问题描述】:

我正在从一个巨大的 ASCII 文件中的一些传感器获取数据,我想将其导入到 excel 中以进行平均和绘图,我正在成功导入,但我不知道如何计算列的平均值自动

    Sub Import()
Dim FileToOpen As Variant
Dim OpenBook As Workbook
Dim NameOfWorkbook As String
Dim arr As Variant
Application.Calculation = xlCalculationManual
Application.DisplayStatusBar = False
Application.EnableEvents = False
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Sheets.Add(After:=ActiveSheet).Name = "Data1"
NameOfWorkbook = ActiveSheet.Name

'Step 1 Import the data

FileToOpen = Application.GetOpenFilename(Title:="Import sensor report in ASCII format")
    If FileToOpen <> False Then
    Set OpenBook = Application.Workbooks.Open(FileToOpen)
    arr = OpenBook.Sheets(1).Range("A1").CurrentRegion
    RowCount = UBound(arr, 1)
    ColumnCount = UBound(arr, 2)
    ThisWorkbook.Sheets("Data1").Range("A1").Resize(RowCount, ColumnCount).Value = arr
    arr = OpenBook.Sheets(1).Range("A3").CurrentRegion
    RowCount = UBound(arr, 1)
    ColumnCount = UBound(arr, 2)
    ThisWorkbook.Sheets("Data1").Range("A3").Resize(RowCount, ColumnCount).Value = arr
    OpenBook.Close False
    End If

Application.DisplayAlerts = True
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.DisplayStatusBar = True
Application.EnableEvents = True
End Sub

这将导入第 1 行中的传感器编号和第 3 行及以下的数据 我想将第 2 行的平均值自动填充到第 3 行及以下的最后一个数字,这可能会有所不同,请在下面找到图片

那么,谁能帮我用“=Average(D3:D last item)”为 D2 到 AJ2 自动填充单元格 D2?使用与导入代码相同的执行方式?

谢谢!

【问题讨论】:

  • 您的问题是不知道使用什么公式?还是您不知道如何插入公式?如果是前者,AVERAGE 将忽略空单元格,因此您只需输入一个覆盖到底部的公式。如果是后者,请查看.Range 对象的.Formula 属性以获取指导。
  • 非常感谢您的回复,我的问题是我不知道如何准确地编写公式,所以在一个循环中,它从 D 列到 AJ 列并插入该列的平均值,忽略前 2 个单元格。

标签: excel vba


【解决方案1】:

请试试这个功能。

Private Function RangeAverage(ByVal Rs As Long) As Double
    ' Rs is the row number to take the average from
    
    Dim Rng     As Range            ' working range
    
    With ThisWorkbook.Sheets("Data1")
        Set Rng = .Range(.Cells(Rs, "D"), .Cells(Rs, .Columns.Count).End(xlToLeft))
    End With
    RangeAverage = Application.WorksheetFunction.Average(Rng)
End Function

您可以使用如下代码将其集成到您的项目中:-

Dim R As Long

For R = 3 To LastRow
     MyCell.Value = RangeAverage(R)
Next R

其中Mycell 是任何工作表中随R 更改的单元格。

【讨论】:

  • 非常感谢您的帮助!我已经尝试过这样做但无法使其正常工作,我正在查看您的代码,我认为它在 D 列中放置了该行的平均值,但我希望这给了我一个开始,谢谢!
  • 我正在尝试类似:For R = 4 To LastRow Data1.cell(2, R).Value = Application.Average.Range(.Cells(2, R), .Cells(60002, R)) 但无法使其正常工作:/
【解决方案2】:

非常感谢您的帮助,这使我能够找到下面的解决方案,我相信周围的专家可以以更有效的方式做到这一点,我愿意接受建议:

Dim R As Long
Dim Rng As Range
Dim lRow As Long
For R = 4 To 36
    lRow = Cells(Rows.Count, R).End(xlDown).Row
    With ThisWorkbook.Sheets("Data1")
        Set Rng = .Range(.Cells(3, R), .Cells(lRow, R))
    End With
    ThisWorkbook.Sheets("Data1").Cells(2, R).Value = Application.WorksheetFunction.Average(Rng)
Next R

【讨论】:

  • 我遇到的一个问题是,当我使用 .Range(Cells(),Cells()) 选择范围时,excel 将分隔范围内单元格的逗号作为不同的参数读取函数的平均值,导致第一项和最后一项的平均值,而不是整个列表,因此使用变量(Rng)来独立选择范围,避免在平均值函数内部使用逗号并解决问题。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-08
  • 1970-01-01
  • 2016-10-16
  • 1970-01-01
  • 2017-05-24
相关资源
最近更新 更多