Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.09.2011, 23:54   #1
Estimate
 
Регистрация: 05.06.2010
Сообщений: 8
По умолчанию Не работают формулы

Здравствуйте.

Возникла проблема с Excel и VBA. Ввожу простой код в VBA:
Код:
Function SumArray(List) As Double
    Dim Item As Variant
    SumArray = 0
    For Each Item In List
        If WorksheetFunction.IsNumber(List) Then _
            SumArray = SumArray + Item
    Next Item
End Function
Переменная List задумывается, как матрица (да и вообще любой массив). Но формула, когда пытаюсь ее применить, выдает ошибку VALUE (ЧИСЛО). Не пойму почему. Это пример из книги, все должно работать.

Могут ли быть какие то причины? Я делаю что-то не так, или надо в Excel что-то настроить? Заранее большое спасибо!
Estimate вне форума Ответить с цитированием
Старый 02.09.2011, 00:08   #2
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Цитата:
или надо в Excel что-то настроить?
до этого эксель работал? вот и замечательно, ничего не настраивайте - пусть себе работает дальше. исправте лучше код, заодно напишите в редакцию, там тоже пусть исправят в книге
Код:
Function SumArray(List) As Double
    Dim Item As Variant
    SumArray = 0
    For Each Item In List
        If WorksheetFunction.IsNumber(Item) Then _
            SumArray = SumArray + Item
    Next Item
End Function
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 02.09.2011, 00:12   #3
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

извините, и еще один глупый вопрос, а чем плоха встроенная функция СУММ.
пишите в ячейке вместо SumArray(...) СУММ(...) - получите тот же результат
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 02.09.2011, 00:31   #4
Estimate
 
Регистрация: 05.06.2010
Сообщений: 8
По умолчанию

Да, опозорился =) Неправильно копировал пример.

Цитата:
Сообщение от IgorGO Посмотреть сообщение
извините, и еще один глупый вопрос, а чем плоха встроенная функция СУММ.
пишите в ячейке вместо SumArray(...) СУММ(...) - получите тот же результат
Просто учебный пример, читаю книжку по VBA.

В проблема изначальная возникла с таким кодом:

Код:
Function Name(V)

    Name = UBound(V, 1)
    
End Function
Может и глупый вопрос, но почему он не возвращает верхнюю границу матрицы V?
Estimate вне форума Ответить с цитированием
Старый 02.09.2011, 00:41   #5
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

уж кто-кто, а UBound отдает то, что его спрашивают Вы уверены, что правильно поняли назначение второго парметра?
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 02.09.2011, 00:48   #6
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Код:
Function Name(V)

    Name = UBound(V.Value, 1)
    
End Function
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 02.09.2011, 01:48   #7
Estimate
 
Регистрация: 05.06.2010
Сообщений: 8
По умолчанию

Цитата:
Сообщение от IgorGO Посмотреть сообщение
уж кто-кто, а UBound отдает то, что его спрашивают Вы уверены, что правильно поняли назначение второго парметра?
Да, это "ось координат".

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
Код:
Function Name(V)

    Name = UBound(V.Value, 1)
    
End Function
Большое спасибо! Значит тут надо, как с объектом.
Estimate вне форума Ответить с цитированием
Старый 02.09.2011, 02:08   #8
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

не знаю при чем там value, но если взять диапазон [a1:c5], то
ubound([a1:c5], 1) вернет 5 (индекс последедней строки в массиве), а
ubound([a1:c5], 2) вернет 3 (индекс последней колонки).
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 03.09.2011, 12:47   #9
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

Цитата:
Сообщение от IgorGO Посмотреть сообщение
не знаю при чем там value, но если взять диапазон [a1:c5], то
ubound([a1:c5], 1) вернет 5 (индекс последедней строки в массиве), а
ubound([a1:c5], 2) вернет 3 (индекс последней колонки).
Да. А так не сработает:
Код:
Function Name(V)
    Name = UBound(V, 1)
End Function

Sub test()
    Debug.Print Name([a1:c5])
End Sub
Потому что в первом случае компилятор "видит", что объект (диапазон a1:c5) не соответствует типу аргумента функции Ubound и разрешает противоречие, вставляя свойство по умолчанию Value. То есть фактически компилятор выдает код, соответствующий выражению
ubound(range("a1:c5").value, 1)

Во втором случае компилятору нет оснований считать, что V будет иметь неправильный тип, и непосредственно передает переменную V функции ubound. Возникает ошибка несоответствия типа.

Чтобы функция могла работать как с массивом, так и с диапазоном, ее можно написать так:
Код:
Function Name(V)
    If TypeName(V) = "Range" Then
        Name = UBound(V.Value, 1)
    ElseIf IsArray(V) Then
        Name = UBound(V, 1)
    Else
        Name = CVErr(xlErrValue) 'ошибка "#ЗНАЧ!"
    End If
End Function
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Старый 03.09.2011, 13:48   #10
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Казанский, спасибо!
дельное замечание. полезно для понимания и "общего развития".
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не работают формулы mihakr Microsoft Office Excel 7 30.08.2017 13:36
Не работают формулы в Excel при заполнении данных из Delphi ZHDN Общие вопросы Delphi 1 30.07.2011 13:17
2 js скрипта не работают Вадим Величко JavaScript, Ajax 3 13.07.2011 06:58
Исключения не работают Syltan Общие вопросы по Java, Java SE, Kotlin 1 09.12.2010 09:17
Окна не работают NOISIA Помощь студентам 0 06.12.2009 20:57