Excel Vba上的平均值

Excel Vba上的平均值,vba,excel,Vba,Excel,我有一张1800000行100列的表格。第一列是时间列,列中的每个单元格对应于0.002秒(或多或少)的增量,总计3600秒。我试图对1s步骤的其他每一列中的值进行平均(我将1s步骤中的所有值相加,除以步骤数,得到平均值)。然后我清除所有的值,我只是复制每1s步得到的值。我的代码可以工作,但我想有一个更好的方法可以做到这一点,因为这是非常缓慢,由于大量的数据 Option Explicit Sub AverageResult() '-------dall altro script Dim La

我有一张1800000行100列的表格。第一列是时间列,列中的每个单元格对应于0.002秒(或多或少)的增量,总计3600秒。我试图对1s步骤的其他每一列中的值进行平均(我将1s步骤中的所有值相加,除以步骤数,得到平均值)。然后我清除所有的值,我只是复制每1s步得到的值。我的代码可以工作,但我想有一个更好的方法可以做到这一点,因为这是非常缓慢,由于大量的数据

Option Explicit
Sub AverageResult()

'-------dall altro script
Dim LastRowInca As Long
Dim FirstRowInca As Long
Dim LastRow As Long
Dim FirstRow As Long
'-------dall'altro script


Dim i As Long
Dim t1 As Long
Dim t2 As Long
Dim variable As Long
Dim avg As Long
Dim numSampling As Long
numSampling = 0
Dim ColumnSelected As Long



'lunghezza della colonna del tempo
Dim timeColumn As Long
timeColumn = Sheets(1).UsedRange.Rows(Sheets(1).UsedRange.Rows.Count).Row

'numero totale di colonne
Dim totColumn As Long
totColumn = Cells(1, Columns.Count).End(xlToLeft).Column
totColumn = Sheets(1).UsedRange.Columns(Sheets(1).UsedRange.Columns.Count).Column

FirstRowInca = 2

For ColumnSelected = 2 To totColumn
t1 = 0
t2 = 1
variable = 0
avg = 0
numSampling = 0

Debug.Print "colonna selezionata"; ColumnSelected
For i = FirstRowInca To timeColumn

Debug.Print "calcolo la riga"; i; "colonna"; ColumnSelected
' definisco l'intervallo di un secondo in cui deve fare la media
If Cells(i, 1).Value > t1 And Cells(i, 1).Value <= t2 Then
    'calcolo la prima variabile se la cella non è vuota
    If Cells(i, ColumnSelected).Value <> "" Then
    variable = variable + Sheets(1).Cells(i, ColumnSelected).Value

    'Setto la cella come vuota
    Cells(i, ColumnSelected).Value = ""

    'Segno il divisore
    numSampling = numSampling + 1

'Se la cella come vuota
    ElseIf Cells(i, ColumnSelected).Value = "" Then
    Debug.Print "Vuoto"
    End If
Else
'Faccio il valore medio e passo all'intervallo successivo
If numSampling <> 0 Then
avg = variable / (numSampling)
'metto nella cella precedente il valore
Cells(i - 1, ColumnSelected).Value = avg
Debug.Print "la media è"; avg; "l'intervallo era"; t1; "a"; t2; "la riga è"; i
variable = 0
avg = 0
numSampling = 0
t1 = t1 + 1
t2 = t2 + 1
If Cells(i, ColumnSelected).Value <> "" Then
    variable = variable + Sheets(1).Cells(i, ColumnSelected).Value
    'Setto la cella come vuota
    Cells(i, ColumnSelected).Value = ""
    'Segno il divisore
    numSampling = numSampling + 1

'Se la cella come vuota
    ElseIf Cells(i, ColumnSelected).Value = "" Then
    Debug.Print "Vuoto"
    End If
    End If
End If

Next i
Next ColumnSelected





End Sub
选项显式
次平均值结果()
'----达尔阿尔特罗剧本
暗淡的最后一个印加一样长
长得像印加一样暗
最后一排一样长
第一排一样长
'----达尔阿尔托脚本
我想我会坚持多久
暗t1与长t1相同
变暗t2与长t2相同
变暗变长
平均长度等于
暗淡的numSampling如长
numSampling=0
将选定的列设置为“长”
“节奏柱廊”
Dim timeColumn尽可能长
timeColumn=Sheets(1).UsedRange.Rows(Sheets(1).UsedRange.Rows.Count).Row
“科隆的总数
将列设置为等长
totColumn=单元格(1,Columns.Count).End(xlToLeft).Column
totColumn=Sheets(1).UsedRange.Columns(Sheets(1).UsedRange.Columns.Count).Column
FirstRowInca=2
对于选定的列=2到列
t1=0
t2=1
变量=0
平均值=0
numSampling=0
调试。打印“colonna selezionata”;专栏选择
对于i=FirstRowInca到timeColumn
调试。打印“calcolo la riga”;我“柱廊”;专栏选择
媒体中的“定义”间隔时间

如果单元格(i,1).Value>t1和单元格(i,1).Value我想建议一种不同的方法-一种没有VBA的方法,只是简单的Excel公式。
您必须在数据旁边添加两列。在这个例子中,我在a列有一个时间戳,在B列有一个值。C列有一个公式
=TRUNC(A1)
,D列有这个公式
=IF(C1C2,AVERAGEIF(C:C,C1,B:B),“”)


Excel不太适合这样的中/大数据集。我强烈建议考虑用于处理大数据的替代工具,如编程语言R。Python是另一个好的选择。两者都是完全免费的,有大量关于如何使用它们的好文档。在这个网站上,他们都有非常活跃的社区。“180万行”?您将希望使用一个数组来处理数据,而不是直接访问每个单元格。访问单个细胞的速度要慢得多。@SJR显然,许多人为了避免处理数据库而经历了很多痛苦;0)OP还希望清除多余的数据。为了实现这一点,可以基于C列使用remove duplicate值。但是,我很好奇,对于近200万行,这需要多少时间。