Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用vba获取特定文件的中值_Vba_Excel - Fatal编程技术网

使用vba获取特定文件的中值

使用vba获取特定文件的中值,vba,excel,Vba,Excel,我刚开始使用VBA,我找不到一个解决方案来获得第一列上每个id的中值: 所以原始文件是A列和B列。 结果是D&E列 第一步是查找A列(ID)的出现情况 然后计算结果的中位数(B列) 然后在D列和E列中写入每次发生的结果 非常感谢你的帮助 编辑 找到我的答案感谢@Michal Turczyn的帮助: 警告,数据必须先按列A排序(否则此代码将不起作用) 无需VBA即可实现,只需在E1列中粘贴以下公式即可: =中间值(如果(A:A=D1,B:B))接受时,不要按Enter键,使用Ctrl+Shift

我刚开始使用VBA,我找不到一个解决方案来获得第一列上每个id的中值:

所以原始文件是A列和B列。 结果是D&E列

第一步是查找A列(ID)的出现情况 然后计算结果的中位数(B列) 然后在D列和E列中写入每次发生的结果

非常感谢你的帮助

编辑

找到我的答案感谢@Michal Turczyn的帮助:

警告,数据必须先按列A排序(否则此代码将不起作用)


无需VBA即可实现,只需在E1列中粘贴以下公式即可:
=中间值(如果(A:A=D1,B:B))
接受时,不要按Enter键,使用Ctrl+Shift+Enter键并将其向下拖动

如果要使用VBA,请执行以下代码:

Option Explicit

Sub CalcMedian()
Dim i As Long, id As Long, lastRow As Long, j As Long, k As Long, numbers() As Long
lastRow = Cells(Rows.Count, 1).End(xlUp).Row

For i = 1 To 3
    ReDim numbers(lastRow) As Long
    k = 0
    id = Cells(i, 4).Value
    For j = 1 To lastRow
        If Cells(j, 1).Value = id Then
            numbers(k) = Cells(j, 2).Value
            k = k + 1
        End If
    Next
    ReDim Preserve numbers(k - 1) As Long
    Cells(i, 5).Value = WorksheetFunction.Median(numbers)

Next

End Sub

这将是一个数组公式,CTRL+SHIFT+Enter为什么需要是数组公式?你应该在没有人的情况下工作吗?中位数已经需要一个数组。好的,谢谢你的技巧,但我想用VBA来做,因为我同时在做一个教程,这对我来说很难。了解vba中的表格。例如,在我计算中间值之前,我想先在一个表中存储值。谢谢你的帮助,但是,首先,你的结果给我4 6(而不是3.5 4.15 6)。其次,如果你想先填写D列,你有什么窍门吗?因为如果D列存在,您的代码可以工作,但在我的真实文件中,A列中可能有45000个ID(在VBA中就太棒了)。不管怎样,谢谢你的代码,我还在写。我知道先按A列排序会更容易,然后在A列的值仍然相同的情况下,在表中添加B列的值作为中位数?但我无法找到如何更改表的大小,因为这取决于A列中出现的次数
Option Explicit

Sub CalcMedian()
Dim i As Long, id As Long, lastRow As Long, j As Long, k As Long, numbers() As Long
lastRow = Cells(Rows.Count, 1).End(xlUp).Row

For i = 1 To 3
    ReDim numbers(lastRow) As Long
    k = 0
    id = Cells(i, 4).Value
    For j = 1 To lastRow
        If Cells(j, 1).Value = id Then
            numbers(k) = Cells(j, 2).Value
            k = k + 1
        End If
    Next
    ReDim Preserve numbers(k - 1) As Long
    Cells(i, 5).Value = WorksheetFunction.Median(numbers)

Next

End Sub