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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.01.2010, 18:49   #1
funky_dude
Новичок
Джуниор
 
Регистрация: 14.01.2010
Сообщений: 6
По умолчанию Помогите дописать программу на VBA!!!

Нужно определить корректность матрицы.
Если числа в матрице целые и входят в дмапазон от 0 до 100, то матрица корректна, в противном случае- некорректна.
Матрица считывается с листа excel поячеечно.
по одному числу в каждой ячейке.
Вот то, что я написал:
Цитата:
Sub CorrectMatrix()
Dim i, j, rownum, colnum As Variant
Dim bool As Boolean
i = 1
j = 1
rownum = 0
colnum = 0
Do While Cells(i, j).Value <> Empty
i = i + 1
j = j + 1
rownum = rownum + 1
colnum = colnum + 1
Loop
i = i - 1
j = j - 1
rownum = i
colnum = j
For i = 1 To rownum
For j = 1 To colnum
If (Cells(i, j).Value < 0) Or (Cells(i, j).Value) > 100 Or ((Cells(i, j).Value) \ 1) <> Cells(i, j).Value Then
bool = False
Else
bool = True
End If
Next j
Next i
If bool = False Then
MsgBox "Введённая матрица некорректна, т.к. содержимое одной или нескольких ячеек не входит в диапазон 0-100 или не является целым", vbCritical
Else
MsgBox "Введённая матрица корректна", vbOKOnly
End If
End Sub
Всё ок.
Но препод добавил условие, что если в ячейке строка(слово, буква и тп), матрица тоже будет некорректной.
Как это сделать?
всм проверку на то, строка там или число?
funky_dude вне форума Ответить с цитированием
Старый 14.01.2010, 19:11   #2
alyon_ka
Пользователь
 
Регистрация: 16.12.2009
Сообщений: 40
По умолчанию

добавьте в вашу проверку условие:
Код:
  or IsNumeric(Cells(i, j).Value) = False
alyon_ka вне форума Ответить с цитированием
Старый 14.01.2010, 19:25   #3
funky_dude
Новичок
Джуниор
 
Регистрация: 14.01.2010
Сообщений: 6
По умолчанию

спасибо, но при тестировании на разных матрицах, где хотябы одна ячека- строка, vba выдаёт ошибку о несовпадении типов.
И выделяет эту строку:
Цитата:
If (Cells(i, j).Value < 0) Or (Cells(i, j).Value) > 100 Or ((Cells(i, j).Value) \ 1) <> Cells(i, j).Value Or IsNumeric(Cells(i, j).Value) = False Then

Последний раз редактировалось funky_dude; 14.01.2010 в 19:29.
funky_dude вне форума Ответить с цитированием
Старый 14.01.2010, 19:38   #4
С.М.С
Участник клуба
 
Аватар для С.М.С
 
Регистрация: 29.12.2008
Сообщений: 1,598
По умолчанию

А зачем вот это ((Cells(i, j).Value) \ 1) <> Cells(i, j).Value
С.М.С вне форума Ответить с цитированием
Старый 14.01.2010, 19:43   #5
funky_dude
Новичок
Джуниор
 
Регистрация: 14.01.2010
Сообщений: 6
По умолчанию

Цитата:
Сообщение от С.М.С Посмотреть сообщение
А зачем вот это ((Cells(i, j).Value) \ 1) <> Cells(i, j).Value
проверка того, что число целое(недробное)
funky_dude вне форума Ответить с цитированием
Старый 14.01.2010, 19:46   #6
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

Цитата:

If (Cells(i, j).Value < 0) Or (Cells(i, j).Value) > 100 Or ((Cells(i, j).Value) \ 1) <> Cells(i, j).Value Or IsNumeric(Cells(i, j).Value) = False Then

Я думаю он ругается на деление строки на 1 оригинальный метод проверки в ячейке число или строка

Код должен выглядеть так
Код:
If (Cells(i, j).Value < 0) Or (Cells(i, j).Value) > 100 Or  IsNumeric(Cells(i, j).Value) = False Then
Анализ,обработка данных Недорого
doober вне форума Ответить с цитированием
Старый 14.01.2010, 19:54   #7
С.М.С
Участник клуба
 
Аватар для С.М.С
 
Регистрация: 29.12.2008
Сообщений: 1,598
По умолчанию

да нет деление на 1 нормально, только толку в этом нет. а вот чтобы реагировала на текст, вот

Код:
Sub CorrectMatrix()
Dim i, j, rownum, colnum As Variant
Dim bool As Boolean
i = 1
j = 1
rownum = 0
colnum = 0
Do While Cells(i, j).Value <> Empty
i = i + 1
j = j + 1
rownum = rownum + 1
colnum = colnum + 1
Loop
i = i - 1
j = j - 1
rownum = i
colnum = j
For i = 1 To rownum
For j = 1 To colnum
If IsNumeric(Cells(i, j).Value) = True Then
If (Cells(i, j).Value < 0) Or (Cells(i, j).Value) > 100 Or ((Cells(i, j).Value) \ 1) <> Cells(i, j).Value Then
bool = False
Else
bool = True
End If
Else
bool = False
End If
Next j
Next i
If bool = False Then
MsgBox "Ââåä¸ííàÿ ìàòðèöà íåêîððåêòíà, ò.ê. ñîäåðæèìîå îäíîé èëè íåñêîëüêèõ ÿ÷ååê íå âõîäèò â äèàïàçîí 0-100 èëè íå ÿâëÿåòñÿ öåëûì", vbCritical
Else
MsgBox "Ââåä¸ííàÿ ìàòðèöà êîððåêòíà", vbOKOnly
End If
End Sub
С.М.С вне форума Ответить с цитированием
Старый 14.01.2010, 19:55   #8
С.М.С
Участник клуба
 
Аватар для С.М.С
 
Регистрация: 29.12.2008
Сообщений: 1,598
По умолчанию

ругается на несовпадение типа сравниваемых величин, по этому следующее

Тобишь обратите внимание на этот фрагмент:
Код:
If IsNumeric(Cells(i, j).Value) = True Then
If (Cells(i, j).Value < 0) Or (Cells(i, j).Value) > 100 Or ((Cells(i, j).Value) \ 1) <> Cells(i, j).Value Then
bool = False
Else
bool = True
End If
Else
bool = False
End If
а точнее замените этим вашу часть, как показано на пост выше

Последний раз редактировалось С.М.С; 14.01.2010 в 20:10.
С.М.С вне форума Ответить с цитированием
Старый 14.01.2010, 20:18   #9
alyon_ka
Пользователь
 
Регистрация: 16.12.2009
Сообщений: 40
По умолчанию

С.М.С прав, сначала проверяйте число ли это а потом уже делайте проверку дальше - делите, умножайте - все равно.
alyon_ka вне форума Ответить с цитированием
Старый 14.01.2010, 20:20   #10
funky_dude
Новичок
Джуниор
 
Регистрация: 14.01.2010
Сообщений: 6
По умолчанию

всем спасибо
funky_dude вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите дописать программу для VBA!!! funky_dude Помощь студентам 1 14.01.2010 18:39
помогите дописать программу Nevis Паскаль, Turbo Pascal, PascalABC.NET 1 29.08.2009 12:22
Помогите дописать программу cL1zMa Паскаль, Turbo Pascal, PascalABC.NET 2 06.06.2008 14:40
помогите дописать программу starry_night Помощь студентам 0 04.06.2008 19:24
Помогите дописать программу. ShnapS Паскаль, Turbo Pascal, PascalABC.NET 5 17.05.2008 19:50