2012-04-15 1 views
1

У меня есть диапазон данных из приглашения vba, содержащегося в переменной диапазона типов. Я пытаюсь пройти через этот диапазон, и для каждой пустой ячейки замените его на средний столбец.Excel макрос для замены отсутствующих данных со средним значением

Я могу заменить пустые ячейки штрафом, но он получает среднее значение для каждого столбца, с которым я борюсь. Есть ли простой способ?

Я предпочитаю не делать цикл для каждого столбца, цикл для каждой строки, а затем вычислять его с помощью total/numberOfNonEmptyCells, так как это занимает довольно много времени (и я, очевидно, делаю что-то не так здесь, как я получение неправильного значения) ... но я уверен, что это не единственный или правильный способ сделать это.

Есть ли какой-либо способ сказать:

Для каждого столбца
Получить колонку я из серии
Получить средний этот столбец.
Поместите его в массив.

После этого необходимо пройти цикл, заменив пустые ячейки этим значением?

OR, даже лучше способ просто положить в формуле в пустые ячейки говорят
= AVERAGE(Column from Range)
Я попытался это с помощью AVERAGE(Range.Columns,1) и он не работает, так как это колонного типа я считаю, который в среднем вона» t работать с.

Самый простой способ сделать это Я отмечу как ответ. Он должен использовать макрос, а не просто вручную вводить формулу, так как для большого количества данных на большом количестве листов.

Спасибо.

+3

'ср = Application.WorksheetFunction.Average (Range.Columns (1))' –

+0

@TimWilliams Как я уже говорил, вы лишаете себя заслуженных ответов – brettdj

+0

Спасибо Тим, Я дам, что a go –

ответ

2

Это будет выбранный диапазон для каждого столбца, заполняя пустые ячейки со средним значением для непустых ячеек.

Он обращается к вашей скорости беспокойство, минимизируя доступ к клеткам в контурах (протестированных примерно 5000000 клеток, занимает около 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 
+0

Спасибо, по какой-то причине, когда я занимался Application.WorkSheetFunction.В среднем он не работал, но это так. Я пойму, почему это было, но тем временем это прекрасно! –

0

Скажет, диапазон прошел в а

notBlanks = abc.Rows.Count - WorksheetFunction.CountBlank(abc.Columns(i)) 
avg = WorksheetFunction.Sum(abc.Columns(i))/notBlanks 
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