С Новым годом! Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 22.06.2013
Сообщений: 6
1

Вывести среднее значение после экспорта

25.06.2013, 15:20. Показов 723. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день.
Решил освоить VBA, только делаю первые шаги, но уже столкнулся с проблемой. Есть экспортированная в Excel таблица данных. В таблице есть столбик в котором указано время, но при экспорте оно имеет вид, типа (:мин:сек)
:13:45
:07:14
:10:19
Столбик этих значений очень длинный. При попытке выделить его и вывести среднее значение ни чего не происходит и каждый раз приходится вручную добавлять ноль перед минутами в каждой ячейке, что очень нудно. Пробовал сделать через сцепку сделав рядом еще один столбец с цифрой ноль, в итоге ноль подставляется, но среднее значение так же не выводится (видимо потому что там формула). Пробовал вырезать и вставлять в новый лист через специальную вставку, но не выходит. Как можно автоматизировать этот процесс с помощью VBA или хотя бы простенького макроса? Извините если не туда, еще не все прочитал, только на днях зарегился.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.06.2013, 15:20
Ответы с готовыми решениями:

Найти среднее арифметическое 2-х чисел и вывести значение на экран с 3-мя цифрами после запятой
Вот мой код , в котором все работает,не знаю как сделать 3 цифри после запятой чтобы...

Вычислить среднее значение элементов массива. Вывести на дисплей полученное значение
Вычислить среднее значение элементов массива. Вывести на дисплей полученное значение. После этого...

Вычислить среднее значение элементов массива. Вывести на дисплей полученное значение
Вычислить среднее значение элементов массива. Вывести на дисплей полученное значение. После этого...

В одномерном массиве определить среднее значение всех элементов,значение которых превышает среднее значение
в произвольно заданном одномерном массиве определить среднее значение всех элементов,значение...

5
Модератор
Эксперт функциональных языков программированияЭксперт Python
37413 / 20785 / 4278
Регистрация: 12.02.2012
Сообщений: 34,196
Записей в блоге: 14
25.06.2013, 16:00 2
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
'::: Sh - лист; Сol - буква столбка; Row - первая строка
'::: усреднится весь столбец до первой пустой строки.
'::: результат -> ":mm:ss"
 
Function avg_time(Sh as WorkSheet, Col as string, Row as long) As String
   ZZ#=0
   NN#=0
   iii&=Row
   Do
       Tmp$=Sh.range(Col & Cstr(iii&)).Value
       If Trim$(Tmp$)="" then Exit Do
       Tmp$=mid$(Tmp$,2)
       mm%=Val(Tmp$)
       Tmp$=mid$(Tmp$,5)
       ss%=Val(Tmp$)
       ZZ#=ZZ#+mm%+ss%*60
       NN#=NN#+1
       iii&=iii&+1
   Loop
   ZZ#=ZZ#/NN#
   mm%=ZZ#/60
   ss%=ZZ#-mm%*60
   avg_time=":" & Format$(mm%,"00" & ":" & Format$(ss%,"00")   
End Function
1
6082 / 1326 / 195
Регистрация: 12.12.2012
Сообщений: 1,023
25.06.2013, 17:28 3
@Catstail, не хочу вас обижать, но не все в вашей программе гладко...

1) В 25 строке не хватет скобки перед амперсандом.
2) Вызывают сомнения строки 18, 23 и 24, в частности, в 18 строке вы, скорее всего, хотели записать:
Visual Basic
1
ZZ#=ZZ#+mm%*60+ss%
Предлагаю более простой (и главное, работоспособный) вариант:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
'Ïîëüçîâàòåëüñêàÿ ôóíêöèÿ.
'Àðãóìåíòû: äèàïàçîí ñ ýêñïîðòèðîâàííûìè äàííûìè.
'Ðåçóëüòàò: óñðåäíåííîå âðåìÿ â ôîðìàòå :ìì:ññ.
Function AvgTime(ByVal rng As Range) As String
    Dim c As Range, t As Date, n As Long
    With CreateObject("VBScript.RegExp")
        .Pattern = ":(\d\d):(\d\d)"
        For Each c In rng
            If .Test(c) Then
                With .Execute(c)(0)
                    t = t + TimeSerial(0, .SubMatches(0), .SubMatches(1))
                    n = n + 1
                End With
            End If
        Next c
    End With
    AvgTime = Format(t / n, ":nn:ss")
End Function
С уважением,
Aksima
2
Модератор
Эксперт функциональных языков программированияЭксперт Python
37413 / 20785 / 4278
Регистрация: 12.02.2012
Сообщений: 34,196
Записей в блоге: 14
25.06.2013, 17:48 4
@Aksima, Вы правы. У меня "плюшки". Но и мой вариант вполне работоспособен (после исправления замеченных Вами ошибок).
Что же до простоты, то проще понимается мой вариант (особенно, для начинающего).

Исправленный код:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Function avg_time(Sh As Worksheet, Col As String, Row As Long) As String
   ZZ# = 0
   NN# = 0
   iii& = Row
   Do
       Tmp$ = Sh.Range(Col & CStr(iii&)).Value
       If Trim$(Tmp$) = "" Then Exit Do
       Tmp$ = Mid$(Tmp$, 2)
       mm% = Val(Tmp$)
       Tmp$ = Mid$(Tmp$, 5)
       ss% = Val(Tmp$)
       ZZ# = ZZ# + ss% + mm% * 60
       NN# = NN# + 1
       iii& = iii& + 1
   Loop
   ZZ# = ZZ# / NN#
   mm% = ZZ# / 60
   ss% = ZZ# - mm% * 60
   avg_time = ":" & Format$(mm%, "00") & ":" & Format$(ss%, "00")
End Function
 
Sub Test()
    Debug.Print avg_time(Sheets(1), "C", 3)
End Sub
Добавлено через 9 минут
Кстати, странный у меня получился результат по Вашей программе. Вот 4 измерения:

:10:23
:11:05
:13:09
:07:46

У меня получается среднее время = :10:21 (620,75 сек≈ 621 сек = :10:21) Ваш код на тех же данных дает :10:36 ...
0
0 / 0 / 0
Регистрация: 22.06.2013
Сообщений: 6
25.06.2013, 19:34  [ТС] 5
Предложили вот такое решение, что скажете?

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Private Sub CommandButton1_Click()
 
Dim s As String
Dim i As Integer
For i = 1 To 200
' добавляем к каждому значению в ячейке 00 пока в ячейках хоть что то написано
If ThisWorkbook.Worksheets(1).Cells(i, 1).Value = "" Then ' если в ячейке пусто заканчивается цикл
Exit For
End If
s = ThisWorkbook.Worksheets(1).Cells(i, 1).Value
ThisWorkbook.Worksheets(1).Cells(i, 1).Value = "00" & s
Next i
i = i - 1 ' так как цикл заканчивается на пустой уже ячейке то мы отнимаем 1 и получаем актуальное кол-во перезаписаных ячеек
 
s = "=СРЗНАЧ(A1:A" & i & ")" ' формула которую мы вставим
ThisWorkbook.Worksheets(1).Range("C1").FormulaLocal = s ' вставляем формулу
ThisWorkbook.Worksheets(1).Range("C1").Activate ' выделяем ячейку
ThisWorkbook.Worksheets(1).Range("C1").Calculate ' пересчитываем в ней значения, иначе глючит временами)
 
 
End Sub
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
37413 / 20785 / 4278
Регистрация: 12.02.2012
Сообщений: 34,196
Записей в блоге: 14
25.06.2013, 19:57 6
Хороший вариант. Думаю, что из трех он - лучший!

А моя функция содержала еще пару ошибок Правильный вариант (дающий тот же результат, что Ваш и Aksim-ы) :

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Function avg_time(Sh As Worksheet, Col As String, Row As Long) As String
   ZZ# = 0
   nn# = 0
   iii& = Row
   Do
       Tmp$ = Sh.Range(Col & CStr(iii&)).Value
       If Trim$(Tmp$) = "" Then Exit Do
       Tmp$ = Mid$(Tmp$, 2)
       mm% = Val(Tmp$)
       Tmp$ = Mid$(Tmp$, 4)
       ss% = Val(Tmp$)
       ZZ# = ZZ# + ss% + mm% * 60
       nn# = nn# + 1
       iii& = iii& + 1
   Loop
   ZZ# = ZZ# / nn#
   mm% = Fix(ZZ# / 60)
   ss% = ZZ# - mm% * 60
   avg_time = ":" & Format$(mm%, "00") & ":" & Format$(ss%, "00")
End Function
1
25.06.2013, 19:57
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.06.2013, 19:57
Помогаю со студенческими работами здесь

Вывести среднее значение
5. Вывод на экран средней величины стоимости технического средства закрепленного за определенным...

Вывести среднее значение по столбцу
есть две табл (в одной страны, а в другой показатели по странам). одна подчиненная другой. Таблицы...

Подскажите как добавить вычесленное среднее значение из подпрограммы 1, в подпрограмму 2, а то в подпрограмме 2 берет среднее значение = 0
void Count_avg(int n,knigizd* str, double Avg_all ) // Подпрограмма 1 { Avg_all = 0;...

Определить среднее значение всех элементов, значение которых превышает среднее для массива
в произвольно заданном одномерном массиве определить среднее значение всех элементов, значение...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru