Excel VBA, как подсчитать в диапазоне.

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

vadim245
Сообщения: 100
Зарегистрирован: 11 май 2007, 15:46

Имеем табличку
____A____ |__B__|___....._____|____G____
24.03.2007 |_____|___________| 2134,58
25.03.2007 |_____|___________| 5646,56
26.03.2007 |_____|___________| 5466,78
27.03.2007 |_____|___________| 3534,56
28.03.2007 |_____|___________| 2135,59
29.03.2007 |_____|___________| 5455,78
30.03.2007 |_____|___________| 4112,12
31.03.2007 |_____|___________| 5434,55
01.04.2007 |_____|___________| 5511,66
.................|_____|___________| ......

В имени этого открытого файла всегда содержится номер рабочей недели, например "List_of_Data_W713". Нужно взять из него номер недели (в данном случае"13"), найти какого числа был понедельник на 13 неделе и какого числа было воскресенье. Затем найти в колонке "G" данные за все дни этой недели (с понедельника по воскресенье на 13 неделе). И наконец среди них взять 4 максимальные значения, и уже среди них вычислить среднее и его показать.
:confused:
Дмит
Сообщения: 145
Зарегистрирован: 27 ноя 2004, 22:23
Контактная информация:

Посмотри файл:
Вложения
List_of_Data_W713.zip
(11.41 КБ) 53 скачивания
vadim245
Сообщения: 100
Зарегистрирован: 11 май 2007, 15:46

Видимо какая-то часть написанного в предложенном коде осталась на локальной машине и не завернулась в архив

При попытке по alt+F8 увидеть как это все чудо сделано
говорит "не смогла загрузить объект, поскольку он не доступен на локальной машине..."

Отрабатывает похоже только до какого-то момента, ибо 4 максимальных находит и выводит конечный результат, но судя по тому, что ответ не меняется при смене данных (ни мгновенно ни при сохранении и повторном открытии файла) что-то действительно в файл не вошло.....
Asya
Сообщения: 110
Зарегистрирован: 06 фев 2007, 14:33
Откуда: Киев
Контактная информация:

В файле используется элемент MonthView, для его отображения:
цитирую Teslenko E.A.
в системе должна быть установлена библиотека MSCOMCT2.OCX
http://www.nodevice.ru/dll/11820.html
Аватара пользователя
Aent
Сообщения: 1129
Зарегистрирован: 01 окт 2006, 14:52
Откуда: Saratov,Russia
Контактная информация:

&quot писал(а):В файле используется элемент MonthView
Cамое смешное, что он там присутствует но не используется.
Форму можно спокойно удалить. Вся функциональность в макросе Srednee.
P.S. Правильность его работы не провеял ;)
Asya
Сообщения: 110
Зарегистрирован: 06 фев 2007, 14:33
Откуда: Киев
Контактная информация:

Aent писал(а):Cамое смешное, что он там присутствует но не используется.
P.S. Правильность его работы не провеял ;)
Я в принципе тоже не вникала, просто недавно сама столкнулась с отсутствием этой библиотеки, поэтому я думаю информация будет полезной :)
Дмит
Сообщения: 145
Зарегистрирован: 27 ноя 2004, 22:23
Контактная информация:

Прошу прощения.
Не удалил форму. Она использовалась для проверки правильности подсчёта понедельника заданной недели (отображается в MonthView).
Для работы откройте файл и запустите макрос Srednee.
vadim245
Сообщения: 100
Зарегистрирован: 11 май 2007, 15:46

Уважаемый Дмит помог с написанием макроса:

Код: Выделить всё


Sub Srednee()
Dim lnom As Long, i As Long, sSredn As Single
Dim strName As String, dPoned As Date
Dim rg As Range

    strName = ActiveWorkbook.Name
    lnom = Val(Right(strName, 6)) - 1
    
    i = Application.WorksheetFunction.Weekday(DateSerial(Year(Date), 1, 0))
    If i > 1 Then
        i = 8 - i + lnom * 7
    Else: i = i + lnom * 7
    End If
    dPoned = DateSerial(Year(Date), 1, i)
    
    Set rg = ActiveSheet.Columns(1).Find(dPoned, LookIn:=xlValues)
    If Not rg Is Nothing Then
        Set rg = ActiveSheet.Range(rg.Offset(0, 6), rg.Offset(6, 6))
        rg.Select
        For i = 1 To 4
            sSredn = sSredn + Application.WorksheetFunction.Large(rg, i)
        Next
        sSredn = sSredn / 4
        MsgBox "Ответ - " & sSredn
    Else: MsgBox "Понедельник недели №" & lnom + 1 & " не найден!"
    End If
    
End Sub



спасибо Вам огромное. Но может ли кто-нибудь сказать, почему этот макрос в файле
на одних машинах запускается успешно, на других останавливается, ругаясь на отсутствие библиотеки. На моей машине тоже не работал поначалу. Потом стянул откуда-то MSCOMCT2.OCX, о котором писали, положил в папку windows и через N попыток макрос сработал. Потом больше ничего не делал, снес MSCOMCT2.OCX, даже перезагрузил тачку - все равно работает. Перенес файл с макросом на другую машину.... НЕ РАБОТАЕТ --- пишет Compile Error. Can not find project or library. B Visual Basic-е останавливается на lnom = Val(Right(strName, 6)) - 1 и выделяет слово Right

Все машины с корпоративными лицензионными WinXP + Office2003

Кто какие предположения имеет? :confused:
Pavel55
Сообщения: 418
Зарегистрирован: 20 окт 2006, 11:40
Откуда: Moscow

Не забываем при выкладывании кода брать его в тэги

[.code] ВАШ КОД [./code] (только без точек внутри скобок)

и переключать раскладку клавиатуры на русский язык при копировании кода из редактора Visual Basic (чтобы на форуме не отображалась абра-кадабра вместо русских букв)
Аватара пользователя
Aent
Сообщения: 1129
Зарегистрирован: 01 окт 2006, 14:52
Откуда: Saratov,Russia
Контактная информация:

vadim245,
удалите из проекта форму и ссылки на
Microsoft Calendar Control xx.x
Microsoft Common Controls (-2 6.0 SPx)
Если в вашем проекте не было других форм, удалите ещё и ссылку на
Microsoft Forms 2.0 Object Library
Делается это из VBE->Tools->References...
перекомпилируйте и сохраните проект
Ответить