Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
RSS
VBA Ошибка 13 Type Mismatch Где ошибка в коде?
 
Добрый день.
Необходимо просуммировать произведения ячеек  3 и 5 столбцов  при условии, что ячейка 6 столбца той же строки >0 и вывести
в ячейке В17 сумму этих произведений.

Но при нажатии на кнопку Рассчитать возникает ошибка 13 Type Mismatch - ошибка типа данных.
Не могу понять, где именно ошибка Интересно, что если поставить условие <0 или = ,то расчет происходит, а если больше нуля, то ошибка..
Подскажите плиз.
Изменено: Nkor - 20 Мар 2015 20:55:58
 
Попробуйте так
Код
Sub CMD_Click()
Dim Sm As Double
For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
    If Cells(i, 6).Value > 0 Then Sm = Sm + Cells(i, 3) * Cells(i, 5)
Next i
Cells(17, 2).Value = Sm
End Sub

 
Используйте формулу =СУММПРОИЗВ((F2:F14>0)*C2:C14*E2:E14)
 
Цитата
Nkor написал: Не могу понять, где именно ошибка
А слабо посмотреть что в тех ячейках, которые суммируются в той строке, на которой ошибка?
 
Да, посмотрела. И толку? Программа ясно пишет - ошибка типа данных.  Я типы даже насильно меняла с помощью CDbl() и на листе типы к одному типу приводила. Не помогает. Перечитала статью о типах данных - не понимаю, в чем дело, что программу не устраивает. Может, все же подскажете?
 
Игорь, скажи пожалуйста, а как просматривать  ошибки в принципе.. Дабы понимать, что тутова такое .. Может переменная неправильно обозванна или ...
-------------
В формуле можно нажать F9. А как это можно сделать в VBA-писаниии.
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
 
Цитата
AKSENOV048 написал: =СУММПРОИЗВ((F2:F14>0)*C2:C14*E2:E14)
Спасибо за формулу. У меня вот такая формула на массивах работает:{ =СУММ(ЕСЛИ(F2:F14>0;C2:C14*E2:E14;0))}. Ваша версия тоже отличная, как то про СУММРОИЗВ я не догадалась, она гораздо проще. Но я VBA учу. Никак форматы данных не даются. Вечная ошибка 13
Изменено: Nkor - 21 Мар 2015 02:34:05
 
Так попробуйте:
Код
For i = 2 To n - 1
 
МВТ, да, макрос отлично работает. Спасибо за пример, освою обязательно.
Одно плохо - у меня с типами данных какие то нелады, хожу по кругу и из раза в раз ошибки по типам данных.
А не подскажете все-таки, что я с типом данных в своем коде не так сделала? Иначе потом опять на форуме людей по ерунде беспокоить.
Все равно, большое спасибо!
 
Вообще основной косяк в том, что Вы с первой строки обрабатываете. А там заголовки. Значит тип данных - текст. Значит и умножить его нельзя. Отсюда и ошибка типа данных.
For i = 1 To n
нужно
For i = 2 To n

Владимир, по сути есть несколько способов посмотреть(все никак руки не дойдут накатать статью по отладке кода):
Как только появилось окно ошибки, нажать Debug и посмотреть строку ошибки. Навести мышь на переменную - появится всплывающая подсказка, показывающая текущее значение этой переменной.
Однако есть случаи, когда наведение не даст результата. Как правило это не объявленные как переменные объекты(как в этом случае - Cells). Этот объект не всегда может быть вычислен в памяти в момент отладки. Поэтому здесь нужно сначала отобразить окно Immediate(отобразить можно сочетанием клавиш Ctrl+G или через меню View-Immediate Window). Затем скопировать полностью нужную переменную(Cells(i, 3).Value) и в окне Immediate написать:
?
и после вопр.знака вставить скопированное. Должно получиться:
?Cells(i, 3).Value

И нажать Enter. Строкой ниже в этом окне будет выведено значение для объекта(если оно может быть получено)
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Nkor написал: Да, посмотрела. И толку?
И что в тех ячейках? Получится это сложить и перемножить?

Для Владимира - в данном коде при ошибке выделяется жёлтым строка кода, наводим курсор на перенную i - видим её значение, смотрим на лист в эту строку.
Так же можно посмотреть значение переменной в окне Locals.
Можно временно добавить в код строку Debug.Print Cells(i, 3).Value выше строки с ошибкой и смотреть что выводится в окно Immediate при пошаговом прогоне кода.
 
По сути, если не уверены в данных - можно сделать отдельную функцию, которая будет проверять, является ли числом. Или применить IsNumeric(). Все зависит от задачи и от обрабатываемых данных. Я часто делал именно отдельную функцию, которая преобразовывала "неверные" числа в нормальные для пересчета(приводила к нужному типу, заменяя пробелы и иные знаки на нужные). Если текст вообще ничего общего с числом не имел - функция возвращала 0.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Я тот, кто только  начал изучать VBA - интересная штука оказывается..
Но иной раз натыкаюсь на ошибку и целые сутки её... Вообщем, как решать проблему, когда строка становится жёлтой?
"..Сладку ягоду рвали вместе, горьку ягоду я одна."
 
Цитата
Hugo написал: А слабо посмотреть что в тех ячейках, которые суммируются в той строке, на которой ошибка?
Спасибо, повнимательнее потаращила глаза на ячейки и обнаружила, что мой код пытается считывать данные столбца с первой строки. а в первой ячейке вместо числа - название столбца, текст. Отсюда и ошибка несоответствия типов данных. Сдвинула нумерацию считываемых ячеек на 1 вниз и получила результат. Благодарю еще раз.
 
Цитата
Alexander88 написал:  For   i = 2   To   n - 1
Действительно. Только не n-1 а n+1 - так все корректно работает. Оказалось, что у меня в коде счетчик захватывает первую строку, где вместо чисел - текст. Отсюда несоответствие типов и ошибка 13. Спасибо!
 
Дада, спасибо большое, я это уже обнаружила. Плохо то, что такая ошибка из раза в раз. Теперь проблема - как со своей внимательностью бороться, чтобы косяков таких глупых не было :-))))
Огромное спасибо и приятных выходных!
 
Nkor, кнопка цитирования НЕ ДЛЯ ответа. Неужели нельзя просто ответить?
 
Цитата
The_Prist написал: Я часто делал именно отдельную функцию, которая преобразовывала "неверные" числа в нормальные для пересчета
The_Prist спасибо!
действительно, помогло!
Код
Public Function ISNUMBER(S As String) As Long
    On Error Resume Next
    ISNUMBER = 1 * S
End Function
и проверка в Основной процедуре: ISNUMBER(CStr(a(i, 1))) <> 0 ... когда по массиву встречаются, как числа, так и текст... нулевых нет и быть не может... поэтому на скорую руку так (для моего случая)
Изменено: JeyCi - 20 Авг 2017 18:13:06
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
Страницы: 1
Читают тему (гостей: 1)