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

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

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

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

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 31.10.2008, 19:40   #11
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию 2 Sergmodern

Цитата:
Вот задание:
Нужно написать функцию которая бы для диапазона,передаваемого её в качестве параметра находила бы количество чисел,состоящих только из нечетных цифр.
Функция называется HowOdd. Написал в соответствии с заданием. В ячейке А1 видно, как эта функция работает. Чтобы было нагляднее видно что она посчитала - я при помощи условного форматирования закрасил "правильные" ячейки.
Если Ваши данные скопировать в высланную мною книгу, и указать нужный диапазон - то в код можно и не смотреть. Условные форматы можно снести.
Либо: необходимо копировать код функций HowOdd и AllOdd в модуль Вашего листа, и там пользоваться функцией HowOdd.

а понимать там все просто:
1 Function HowOdd(r As Range) As Long
2 Dim cell
3 Dim how As Long
4 how = 0
5 For Each cell In r
6 If AllOdd(cell.Value) Then how = how + 1
7 Next
8 HowOdd = how
9 End Function
Комментирую по строчкам:
1:обьявлена функция. получает диапазон в качестве параметра, возвращает число
2,3: обьявлены внутренные переменные
4: начальное количество "правильных" ячеек равно 0
5:цикл для всех ячеек полученного как параметр диапазона
6:если в ячейке только нечетные цифры увеличиваем количество правильных на 1
7:след.ячейка, или конец цикла
8:присваиваем результат
9:конец функции


1 Function AllOdd(r As Long) As Boolean
2 Dim i As Integer
3 s = LTrim(Str(r))
4 i = 1
5 AllOdd = False
6 Do
7 If Not WorksheetFunction.IsOdd(Val(Mid(s, i, 1))) Then Exit Function
8 i = i + 1
9 Loop Until i > Len(s)
10 AllOdd = True
11 End Function

1: функция получает число, и возвращает ИСТИНА, когда все нечетные
2: обьявляем переменную (пройдемся по всем цифрам)
3: переводим число в строку (+убиваем пробелы слева)
4: начнем с первого символа
5: функция = ЛОЖЬ
6: заворачивается цикл до условия см. строку 9
7: если i-й символ четный прекращаем рассматривать строку, она уже не "правильная"
8: будем изучать следующий символ
9: цикл крутится пока номер след.символа не станет больше длины строки
10:ни разу не оборвалось рассмотрение строки, и дошли до ее конца - значит все Ок!
11: кончилась функция
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума
Старый 31.10.2008, 21:08   #12
Sergmodern
Пользователь
 
Регистрация: 04.06.2007
Сообщений: 12
По умолчанию

Спасибо Вам огромное за помощь,все получилось,без Вас бы я точно бы пропал!!!
Sergmodern вне форума
Старый 05.11.2008, 16:52   #13
Sergmodern
Пользователь
 
Регистрация: 04.06.2007
Сообщений: 12
По умолчанию

Но у меня тут проблемка маленькая вышла,вообщем ввожу я колледже на компьютере весь код как по примеру выше,запускаю макрос,затем использую ф-ю howodd и он не считает ничего,пишет,что

6 Do
7 If Not WorksheetFunction.IsOdd(Val(Mid(s, i, 1))) Then Exit Function
8 i = i + 1
9 Loop Until i > Len(s)

якобы этот метод не совместим,может это как-то связано с версиями Экселей,то в колледже 2003,а эта ф-я отлично работает в 2007,как можно эту ошибку в 2003 избежать?Может в 2003 надо что-то перенастроить?
Sergmodern вне форума
Старый 05.11.2008, 18:03   #14
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

если во время выполнения возникнет ошибка в теле макроса (а в это время будет открыт редактор ВБА) у вас должно появиться окно с вопросом как поступить с макросом "остановить выполнение" или перейти к отладке (End, Debug). переходим к отладке:
1. Видим в какой строке прозошла ошибка
2. Можем проверить значения переменных и определиться что происходит не так.

Есть подозрение на WorksheetFunction.IsOdd, но у меня нет 2003 и я не проверю. Раньше функция проверки на четность (или нечетность) вроде была в ВБА, искал специально под эту задачу - не нашел, был сильно озадачен, поэтому воспользовался функцией листа IsOdd.

можно вот это:
If Not WorksheetFunction.IsOdd(Val(Mid(s, i, 1))) Then Exit Function
заменить на такое
If Not ((Val(Mid(s, i, 1)) and 1) = 1) Then Exit Function
и запись короче, и от функции листа ушли.
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума
Старый 05.11.2008, 20:26   #15
Sergmodern
Пользователь
 
Регистрация: 04.06.2007
Сообщений: 12
По умолчанию

спасибо,сейчас проверю на 2003.

Последний раз редактировалось Sergmodern; 05.11.2008 в 21:21.
Sergmodern вне форума
Старый 05.11.2008, 21:22   #16
Sergmodern
Пользователь
 
Регистрация: 04.06.2007
Сообщений: 12
По умолчанию

Проверил,установил 2003 и он теперь ругается на вот это
For Each cell In r
===========> If AllOdd(cell.Value) Then how = how + 1
Next

Type mismatch.
В чем может быть проблема?Boolean не подходит.Опять этот мелкософт нехочет ничего делать.
Sergmodern вне форума
Старый 05.11.2008, 23:13   #17
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

в ячейках должны быть целочисленные значения. если там действительное число или текст - возможен Type mismatch.

Цитата:
Опять этот мелкософт нехочет ничего делать.
мелкософт вручил в руки мощный инструмент. и если кто-то не умеет им пользоваться - это проблема не мелклсофта, увы...
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума
Старый 06.11.2008, 01:44   #18
КаМММ
Почти "Чайник"
Форумчанин
 
Аватар для КаМММ
 
Регистрация: 09.06.2008
Сообщений: 134
По умолчанию

А как ошибочные сообщения удалять?
А то ляпнул тут а стереть не могу.

Последний раз редактировалось КаМММ; 06.11.2008 в 01:50.
КаМММ вне форума
Старый 06.11.2008, 12:32   #19
Sergmodern
Пользователь
 
Регистрация: 04.06.2007
Сообщений: 12
По умолчанию

IgorGo а в вашем примере генерируемые значения целочисленные?Но когда я ввожу свои значения то у меня в ячейках пишется знач.А там все равно мисмач.
Sergmodern вне форума
Старый 06.11.2008, 16:51   #20
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Да, в примере генерируются целые цисла.
В инете можно почитать что такое натуральные, целые, действительные, рациональные и другие числа.
Функция написанная мною не учитывает никаких ошибок. Предполагается что в ячейке должен быть любой набор цифр от 0 до 9 в любой последовательности. Наличие каких-либо других знаков исключено, вызовет ошибку выполнения функции. В принципе, все сказано в ячейке допускаются только символы от "0" до "9".

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

Код:
Function AllOdd(r) As Boolean
  Dim i As Integer, s As String
  On Error Resume Next
  s = LTrim(Str(r))
  If Error = "Type mismatch" Then Exit Function
  i = 1
  AllOdd = False
  Do
    If (Val(Mid(s, i, 1)) And 1) = 1 Then i = i + 1 Else Exit Function
  Loop Until i > Len(s)
  AllOdd = True
End Function
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума
Закрытая тема


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите с созданием диаграммы EducatedFool Microsoft Office Excel 2 20.10.2008 17:05
Помогите с созданием проигрователя Yarik_Net Помощь студентам 4 02.10.2008 15:55
Помогите с созданием поиска. student90 Общие вопросы Delphi 7 01.10.2008 14:33
Помогите с созданием кнопки Артэс Win Api 23 04.06.2008 04:13
Помогите с созданием программы: Wander Помощь студентам 2 19.04.2007 20:10