Господа, у меня довольно специфическая задача, проконсультируйте, пожалуйста. Во множестве клеток содержимое имеет вид "NN XX:YY" - то есть номер из двух цифр, а за ним - время. Для редких клеток в начале проставляется, допустим, восклицательный знак - значение становится "!NN XX:YY". При этом больштнство клеток - пустые. Мне нужно добиться проверки корректности каждого столбца (например, в первой клетке столбца было значение TRUE/FALSE, корректен ли он). Столбец в моём случае считается "корректным", если NN принимает значения 01, 02, 03 и т.д. до некого максимального в данном столбце (для каждого столбца максимум может быть своим + номера идут не по порядку, а как им угодно + номера могут повторяться). Но если какой-то номер пропущен, то столбец неправильный. Могу ли я написать логическое выражение, которое проверяло бы это?
Отдельный подвопрос здесь - как определить максимальное значение NN для каждого столбца? (то есть - максимум от подстроки, интерпретированной как число - берутся либо первые два символа, либо второй и третий, если первый - восклицательный знак)
Заранее благодарю
Господа, у меня довольно специфическая задача, проконсультируйте, пожалуйста. Во множестве клеток содержимое имеет вид "NN XX:YY" - то есть номер из двух цифр, а за ним - время. Для редких клеток в начале проставляется, допустим, восклицательный знак - значение становится "!NN XX:YY". При этом больштнство клеток - пустые. Мне нужно добиться проверки корректности каждого столбца (например, в первой клетке столбца было значение TRUE/FALSE, корректен ли он). Столбец в моём случае считается "корректным", если NN принимает значения 01, 02, 03 и т.д. до некого максимального в данном столбце (для каждого столбца максимум может быть своим + номера идут не по порядку, а как им угодно + номера могут повторяться). Но если какой-то номер пропущен, то столбец неправильный. Могу ли я написать логическое выражение, которое проверяло бы это?
Отдельный подвопрос здесь - как определить максимальное значение NN для каждого столбца? (то есть - максимум от подстроки, интерпретированной как число - берутся либо первые два символа, либо второй и третий, если первый - восклицательный знак)
А как же мне быть всё-таки с проверкой на корректность?
Функцией пользователя получилось.
[vba]
Код
Function Korektnost(Range As Range) As Boolean Dim x() Dim iMax As Long, iMin As Long, n As Long, iKor As Boolean iMin = 100 x = Range.Value For i = 1 To UBound(x) If x(i, 1) <> Empty Then x(i, 1) = CInt(Left(Replace(x(i, 1), "!", ""), 2)) If x(i, 1) < iMin Then iMin = x(i, 1) If x(i, 1) > iMax Then iMax = x(i, 1) Else x(i, 1) = iMin End If Next i For j = iMin + 1 To iMax - 1 For i = 1 To UBound(x) If x(i, 1) = j Then n = n + 1 Next i If n = 0 Then iKor = False: Exit For Else iKor = True: n = 0 End If Next j Korektnost = iKor End Function
[/vba]
Цитата (dum)
А как же мне быть всё-таки с проверкой на корректность?
Функцией пользователя получилось.
[vba]
Код
Function Korektnost(Range As Range) As Boolean Dim x() Dim iMax As Long, iMin As Long, n As Long, iKor As Boolean iMin = 100 x = Range.Value For i = 1 To UBound(x) If x(i, 1) <> Empty Then x(i, 1) = CInt(Left(Replace(x(i, 1), "!", ""), 2)) If x(i, 1) < iMin Then iMin = x(i, 1) If x(i, 1) > iMax Then iMax = x(i, 1) Else x(i, 1) = iMin End If Next i For j = iMin + 1 To iMax - 1 For i = 1 To UBound(x) If x(i, 1) = j Then n = n + 1 Next i If n = 0 Then iKor = False: Exit For Else iKor = True: n = 0 End If Next j Korektnost = iKor End Function
ShAM, ого! Спасибо, очень элегантно. По правде, я пока не разобрался, как работает корректность (если поясните, буду признателен), но я скопировал в свой документ - всё фунциклирует. Благодарю.
AlexM, _Boroda_, спасибо.
ShAM, ого! Спасибо, очень элегантно. По правде, я пока не разобрался, как работает корректность (если поясните, буду признателен), но я скопировал в свой документ - всё фунциклирует. Благодарю.dum
ПСТР(ПОДСТАВИТЬ(A1:A25;"!";);1;2) - с помощью ПОДСТАВИЬ убираем "!" (если есть), ПСТР(…;1;2) - берет первые 2 символа из ячеек. Для первого столбца получим массив {1;"";"";"";"";"";"";"";"";2;"";"";"";4;"";"";"";"";3;"";"";"";"";"";""} ДВССЫЛ("1:"&A26) - даст ссылку на строки с 1-ой до "максимальной", для 1-го столбца (1:4) СТРОКА(1:4) - в формулах массива формирует массив чисел {1;2;3;4} ПОИСКПОЗ - ищем позицию числа из массива {1;2;3;4} в массиве {1;"";"";"";"";"";"";"";"";2;"";"";"";4;"";"";"";"";3;"";"";"";"";"";""} Получим {1;10;19;14}. А, например, для 3 столбца - {5;#Н/Д;9;14;#Н/Д;11}, это означает, что в 3 стлб. Нет 2 и 5 (их позиция не определена). Теперь нужно отловить эту ошибку (#Н/Д). Я использовал СУММ. Можно другую функцию, например, МАКС, МИН. ЕНД - дает ИСТИНА если результат предыдущих вычислений #Н/Д (т.е.какое-то число отсутствует) и ЛОЖЬ если нет (т.е. все числа есть). А нам нужно наоборот, поэтому используем НЕ() ЗЫ: Для будущего: используйте диалоговое окно "Вычислить формулу". В 2010 Экселе на вкладке "Формулы". В 2003-м не помню где. Можете нажать F1 и там запрос сделать "Пошаговое вычисление формул". Можно разобраться в достаточно сложных формулах. Удачи!
ПСТР(ПОДСТАВИТЬ(A1:A25;"!";);1;2) - с помощью ПОДСТАВИЬ убираем "!" (если есть), ПСТР(…;1;2) - берет первые 2 символа из ячеек. Для первого столбца получим массив {1;"";"";"";"";"";"";"";"";2;"";"";"";4;"";"";"";"";3;"";"";"";"";"";""} ДВССЫЛ("1:"&A26) - даст ссылку на строки с 1-ой до "максимальной", для 1-го столбца (1:4) СТРОКА(1:4) - в формулах массива формирует массив чисел {1;2;3;4} ПОИСКПОЗ - ищем позицию числа из массива {1;2;3;4} в массиве {1;"";"";"";"";"";"";"";"";2;"";"";"";4;"";"";"";"";3;"";"";"";"";"";""} Получим {1;10;19;14}. А, например, для 3 столбца - {5;#Н/Д;9;14;#Н/Д;11}, это означает, что в 3 стлб. Нет 2 и 5 (их позиция не определена). Теперь нужно отловить эту ошибку (#Н/Д). Я использовал СУММ. Можно другую функцию, например, МАКС, МИН. ЕНД - дает ИСТИНА если результат предыдущих вычислений #Н/Д (т.е.какое-то число отсутствует) и ЛОЖЬ если нет (т.е. все числа есть). А нам нужно наоборот, поэтому используем НЕ() ЗЫ: Для будущего: используйте диалоговое окно "Вычислить формулу". В 2010 Экселе на вкладке "Формулы". В 2003-м не помню где. Можете нажать F1 и там запрос сделать "Пошаговое вычисление формул". Можно разобраться в достаточно сложных формулах. Удачи!ShAM
Функция пользователя из сообщения №6 определяет минимальное значение NN, поэтому в значениях NN не обязательно начинается с 01. Т.е. функция определит корректность ИСТИНА, если последовательность 03, 05, 04, 06. Если формула должна работать также, то нужно определить минимум без учета нуля формулой массива в А27
Функция пользователя из сообщения №6 определяет минимальное значение NN, поэтому в значениях NN не обязательно начинается с 01. Т.е. функция определит корректность ИСТИНА, если последовательность 03, 05, 04, 06. Если формула должна работать также, то нужно определить минимум без учета нуля формулой массива в А27