Страницы: 1
RSS
Нахождение среднего значения с "шагом"
 
Я глубоко извиняюсь за неправильно созданную тему!    
 
И все-таки надеюсь, что вы сможете мне помочь с поставленной задачей. Нужно написать программу в VBA по вычислению среднего значения по строкам с шагом. Хотя и можно использовать стандартную функцию, мне нужно написать программу.  
 
В приложенном файле, нужно подсчитать среднее арифметическое столбца Е (Whole porosity, Y), но чтобы просчитывало в соответствии столбца D (Core top depth, X) на каждом метре. То есть с 2881 до 2881.8. След. среднее значение с 2882 до 2882.8, то бишь среднее значение с шагом 5. Получается, что целочисленные глубины не изменяются, но значения между ними могут изменятся, то есть важно чтобы вычисление среднего по столбцу Е соответствовало столбцу D.  
Результат выводиться на новый лист вместе со столбцом А.  
 
Я создала кнопку и чтобы выделялся диапазон (если будут другие данные), но я не знаю как задать цикл прохождения по строкам до конца выделенного диапазона.
 
Вот для примера. Зел. стрелка.
 
{quote}{login=nilem}{date=18.11.2011 11:02}{thema=}{post}Вот для примера. Зел. стрелка.{/post}{/quote}  
 
Круто...  
А что означает символ ":" в данном коде?  
например вот тут ReDim y(1 To UBound(x), 1 To 2): k = 1
 
[b]nilem[b]
Осмелюсь заметить представленные данные в Е имеют 1196 значений / 5 = 239  
В столбце А 208 значений, где-то не собьются без проверки, да и ошибка вычисления будет
 
По селешин  
Public Sub myAverage()  
Dim i As Long, k As Long  
Dim rRange As Range  
Set rRange = Application.InputBox(Prompt:="Введите диапазон", _  
                   Title:="Диапазон", Type:=8)  
Sheets.Add  
ActiveSheet.Name = "Aver"  
With Sheets("Aver")  
For i = 1 To rRange.Rows.Count Step 5  
k = k + 1  
.Cells(k, 1) = rRange(i, 1)  
.Cells(k, 2) = WorksheetFunction.Average(rRange(i, 1).Offset(, 1).Resize(5, 1))  
Next i  
End With  
 
End Sub
 
{quote}{login=niky}{date=18.11.2011 11:13}{thema=Re: }{post}{quote}{login=nilem}{date=18.11.2011 11:02}{thema=}{post}Вот для примера. Зел. стрелка.{/post}{/quote}  
 
Круто...  
А что означает символ ":" в данном коде?  
{/post}{/quote}  
 
На сколько я понимаю ":" разделяет последовательность операторов в одной строке.
 
{quote}{login=nilem}{date=18.11.2011 11:02}{thema=}{post}Вот для примера. Зел. стрелка.{/post}{/quote}  
 
Спасибо большое! Все работает! Правда вопрос, можете объяснить что происходит здесь:  
.Range("A2:B" & .Cells(Rows.Count, 1).End(xlUp).Row + 1).ClearContents  
   .[a2:b2].Resize(j).Value = y(): .Activate
 
{quote}{login=Igor67}{date=18.11.2011 11:36}{thema=}{post}  
.Cells(k, 1) = rRange(i, 1)  
.Cells(k, 2) = WorksheetFunction.Average(rRange(i, 1).Offset(, 1).Resize(5, 1))  
{/post}{/quote}  
 
Спасибо Игорь, все работает супер! Но также можете объяснить эти две строки?
 
Могу, но лучше перейдите на вкладку ССЫЛКИ, и там есть ссылка на сайт Первые шаги.  
rRange - это Ваша переменная которой вы передали диапазон ячеек. Теперь этот диапазон ячеек можно рассматривать как лист Эксель заданного размера в котором начало это А1.  
.Cells(k, 1) = rRange(i, 1) - i это строка, 1 - это столбец  
rRange(i, 1).Offset(, 1) - выбрать ячейку в первом столбце и сместиться Offset(, 1) на 1 столбец вправо и 0 строк вниз  
Resize(5, 1) - "выделить" от текущей ячейки 5 ячеек в одном столбце.  
Таким образом передается 2-й столбец из выделения. от одного целого до другого.  
.Cells(k, 2) = WorksheetFunction.Average(rRange(i, 1).Offset(, 1).Resize(5, 1))  
кстати Offset можно было и не использовать  
.Cells(k, 2) = WorksheetFunction.Average(rRange(i, 2).Resize(5, 1))
 
.Range("A2:B" & .Cells(Rows.Count, 1).End(xlUp).Row + 1).ClearContents  
На втором листе очищаем ячейки в столбцах A:B, начиная от А2 до последней заполненной ячейки в ст. А (+1 - на случай, если на листе есть только заголовок в 1-й строке)  
 
.[a2:b2].Resize(j).Value = y()
На этот же лист записываем массив y() в диапазон [a2:b2], увеличенный на j строк (j - кол-во строк в массиве y()).
 
anvg правильный вопрос задает. В ст. А не все значения совпадают со ст. Д, это тоже надо как-то учитывать?
 
тут проблема может быть. если шаг будет где-то 5 . а где-то 7. а где-то 4.
 
{quote}{login=nilem}{date=18.11.2011 04:05}{thema=}{post}  
 
anvg правильный вопрос задает. В ст. А не все значения совпадают со ст. Д, это тоже надо как-то учитывать?{/post}{/quote}  
 
Получается нужно выводить результат по столбцу D, а не А. Чтобы выбирались только целочисленные значения и копировались на новый лист. Можно так сделать?
 
{quote}{login=Igor67}{date=18.11.2011 01:54}{thema=}{post}  
Таким образом передается 2-й столбец из выделения. от одного целого до другого.  
.Cells(k, 2) = WorksheetFunction.Average(rRange(i, 1).Offset(, 1).Resize(5, 1))  
{/post}{/quote}  
 
То есть получается, что результаты выводятся не по столбцу А, а по D и выбираются целочисленные, правильно?
 
да
 
{quote}{login=Alice}{date=18.11.2011 07:44}{thema=Re: }{post}{quote}{login=nilem}{date=18.11.2011 04:05}{thema=}{post}  
 
anvg правильный вопрос задает. В ст. А не все значения совпадают со ст. Д, это тоже надо как-то учитывать?{/post}{/quote}  
 
Получается нужно выводить результат по столбцу D, а не А. Чтобы выбирались только целочисленные значения и копировались на новый лист.    
Как же тогда происходит вывод результатов первого столбца? Вроде как просчитывает все средние значения на глубинах (depth) столбца D... Ведь выводится 241, а не 200 значений как в столбце А... Как так получается? {/post}{/quote}  
{/post}{/quote}
 
{quote}{login=Alice}{date=18.11.2011 07:44}{thema=Re: }{post}{quote}{login=nilem}{date=18.11.2011 04:05}{thema=}{post}  
 
anvg правильный вопрос задает. В ст. А не все значения совпадают со ст. Д, это тоже надо как-то учитывать?{/post}{/quote}  
 
Получается нужно выводить результат по столбцу D, а не А. Чтобы выбирались только целочисленные значения и копировались на новый лист. Как же тогда происходит вывод результатов первого столбца? Вроде как просчитывает все средние значения на глубинах (depth) столбца D... Ведь выводится 241, а не 200 значений как в столбце А... Как так получается?{/post}{/quote}
 
Alice, прекратите цитировать - ну сколько можно?!
 
а то разве форум 15 цитат не воспринимает? эм... жалко (
 
Не надоело по граблям ходить?!  
Долой цитатничество!!!  
Ведь могем " В ответ на вашу..."... ;)
 
Alice, можно. Но какой был пример - такой и получен ответ.  
Если шаг не равномерен - делаем другой цикл Do Loop и через Find  следующее целое число:)
 
Ой, извините:) В ответ на вашу просьбу перестаю "ходить по граблям"! Цитировать буду  только по крайне важным вопросам!
 
Спасибо за помощь!
 
Люди, у меня возникла проблема... при решение данной задачи, и что-то я не "вкурю" почему у меня не получается. Есть код  
 
 
Public Sub Average()  
   Dim i As Long, Arr(), iInt As Long, iSum As Single, iCount As Long, iSht As Worksheet  
   'Set rRange = Application.InputBox(Prompt:="Введите диапазон", Title:="Диапазон", Type:=8)  
   Arr() = Range("D2:E" & Cells(Rows.Count, 1).End(xlUp).Row)  
   Set iSht = Sheets.Add  
   iInt = Arr(1, 1)  
   For i = 1 To UBound(Arr())  
       If Int(Arr(i, 1)) = iInt Then  
           iCount = iCount + 1  
           iSum = iSum + Arr(i, 2)  
       Else  
           With iSht  
               .Range("A" & .Cells(Rows.Count, 1).End(xlUp).Row) = iInt  
               .Range("B" & .Cells(Rows.Count, 1).End(xlUp).Row) = iSum / iCount  
               iInt = Int(Arr(i + 1, 1)): iSum = 0: iCount = 0  
           End With  
       End If  
   Next i  
End Sub  
 
 
Который берёт в массив данные из D2:E & последняя строка, а потом циклом мы проходимся сверху вниз. Когда i = 6 происходит фигня. При i=6 число в Arr(i, 1) = 2882, а выражение Int(Arr(i, 1)) равняется 2881. Что за фигня, не могу понять. Может кто объяснит? (
 
код на основе таблицы из 1-го поста Alice
 
{quote}{login=}{date=18.11.2011 08:32}{thema=}{post} При i=6 число в Arr(i, 1) = 2882({/post}{/quote}  
Это вы так думаете. Зря!
 
Вот приложил Скрин отладчика. Там видно, что при i=6    
 
Arr(i,1) = 2882  
Int(Arr(i,1)) = 2881  
 
Как целое (INT) от 2882 может быть 2881 ?
 
Вот макрос, который рассчитает средние вне зависимости от шага 5, 6, 7 и т.д.    
Т.е. макрос идёт по столбцу D и смотрит изменился ли Core top depth или нет (а не по столбцу А, где данных может не хватать)  
 
 
P.S. С помощью Владимира (ZVI) победили INT ))
 
Доброго утра всем!  
 
Сейчас работаю с другим файлом, который прикрепляю, то же самое вычисление среднего + пару других формул.  
 
Как сделать так, чтобы шапка таблицы помещалась в первой строке, а не в последней, как в результате листа Sheets7.  
 
Еще проблема, что значения близки, но не точны, а одно значение совсем не совпадает (выделено красным). Проблема в типе переменной? На какой тип можно заменить?
Страницы: 1
Читают тему
Наверх