1

型範囲変数に保持されている vba プロンプトからのデータの範囲があります。次に、この範囲を通過しようとしており、空のセルごとに、その列の平均に置き換えます。

空のセルをうまく置き換えることができますが、苦労している各列の平均を取得しています。簡単な方法はありますか?

各列のループ、各行のループを実行しないことを好み、total/numberOfNonEmptyCells を使用して計算します。 )...しかし、それが唯一の正しい方法ではないと確信しています。

言い方はありますか:

For Each Column
範囲から列 i を
取得 その列の平均を取得します。
配列に入れます。

次に、空のセルをその値に置き換えるループがありますか?

または、空のセルに数式を入力するだけで、
= AVERAGE(Column from Range)
これを使用AVERAGE(Range.Columns,1)して試してみましたが、それが機能しないタイプの列であるため、どの平均が機能しないと思います.

これを行う最も簡単な方法は、答えとしてマークします。ただし、多くのシートに大量のデータがあるため、数式を手動で入力するのではなく、マクロを使用する必要があります。

ありがとう。

4

3 に答える 3

2

これは、列ごとに選択された範囲であり、空白でないセルの平均で空白セルを埋めます。

ループ内のセルへのアクセスを最小限に抑えることで、速度の問題に対処します(約5,000,000セルでテストされ、約10秒かかりました)(より複雑なコードを犠牲にしてさらに改善される可能性があります)

数式を保持します

Sub FillInAverage()
    Dim rng As Range
    Dim col As Range
    Dim a As Variant
    Dim dat As Variant
    Dim i As Long

    Set rng = Selection
    For Each col In rng.Columns
        a = Application.WorksheetFunction.Average(col)
        dat = col.Formula
        For i = 1 To UBound(dat, 1)
            If Len(dat(i, 1)) = 0 Then
                dat(i, 1) = a
            End If
        Next
        col.Formula = dat
    Next
End Sub
于 2012-04-16T00:27:22.110 に答える
0

たとえば、渡された範囲はabcです

notBlanks = abc.Rows.Count - WorksheetFunction.CountBlank(abc.Columns(i))
avg = WorksheetFunction.Sum(abc.Columns(i)) / notBlanks
于 2012-04-16T08:19:41.193 に答える
0

数式を使用して、要求どおりに空のセルだけを操作できます
(注 - この方法では、セルが本当に空である、つまり "" などに評価される数式が含まれていないことを前提としています)。

このコードは、A1:A10000 内の空白以外の数値セルを平均してから、A1:A10000 内の空白を入力します。次に B1:B10000 など

Sub FillBlanks()
Dim rng1 As Range
Dim rng2 As Range
Set rng1 = Range("A1:D10000")
On Error Resume Next
For Each rng2 In rng1.Columns
    rng2.SpecialCells(xlCellTypeBlanks).Value = Application.WorksheetFunction.Average(rng2.Columns(1))
Next
End Sub
于 2012-04-16T10:28:51.860 に答える