![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 28.11.2007
Сообщений: 16
|
![]()
Доброго Всем Здоровья!
Решение задачи (VBA Excel) уперлось в отсутствие функции сравнения, работающей нужным образом. Есть каталожные номера, следующих типов: 1) 1 или любое число до четырехзначного 2) 1a (где на на месте "1" может быть любое число до четырехзначного, а вместо "а" - любая буква латинского алфавита. 3) 1aa (где на на месте "1" может быть любое число до четырехзначного, а вместо каждой из буквы "а" может быть любая буква латинского алфавита. (например 244Ah) 4) 1a1 (Например 118s1) 5) A1 (Например M10) 6) A1a (Например S1051s) 7) AA1 (PR120) 8) AA1a (FX16a) 9) NEW (без вариантов) 10) PNL (без вариантов) 11) RNL(без вариантов) Вот такие типы номеров и с этим ничего не поделать. При сравнении имеем: 2 > 1 нужно, чтобы compare = True или 2 > 1 так оно и есть 1a > 1 нужно, чтобы compare = True или 1a > 1 тоже так и есть, НО 1a > 2 нужно, чтобы compare = False или было бы 1a < 2 (например: 110a < 111 и т.п.) 9a > 10a нужно, чтобы compare = False или было бы 9a < 10a (78a<113a, 8a < 107d и т.п.) S429r > S1122b, compare = False, нужно S429r < S1122b 46s2>68, compare = False, нужно 46s2<68 Т.е. суть в том, что приоритетом сравнения были бы цифры. НО есть исключение: S11036c > FX16a, compare = True Для номеров с разными префиксами приоритет сравнения – префикс. И еще: S1122b > NEW (или PNL, RNL) compare = False NEW > PNL , compare = True (так и надо) 2b > 2a compare = True (так и надо) ………………………………………… Вот такой нужен порядочек нужен. Можно помочь? Или хотя бы направить в нужном направлении ;-) |
![]() |
![]() |
![]() |
#2 |
Участник клуба
Регистрация: 28.06.2009
Сообщений: 1,950
|
![]()
Возможный макрос будет состоять из выяснения, одинаковые ли префиксы, и если да, то он будет убирать все буквы в строке и оставлять цифры. А это делается с помощью функций обработки строк
|
![]() |
![]() |
![]() |
#3 |
Регистрация: 29.01.2010
Сообщений: 8
|
![]()
Попробуй этот код:
Private Function strEqualent(ByVal sStr1 As String) As String Dim s1 As String Dim sNum1 As String Dim sNum2 As String Dim s2 As String s1 = "" ' s2 = "" sNum1 = "0000" sNum2 = "0000" Dim i As Integer i = 1 'While i <= Len(sStr1) While Not IsNumeric(Mid$(sStr1, i, 1)) And i <= Len(sStr1) s1 = s1 & Mid$(sStr1, i, 1) i = i + 1 Wend While IsNumeric(Mid$(sStr1, i, 1)) And i <= Len(sStr1) sNum1 = sNum1 & Mid$(sStr1, i, 1) i = i + 1 Wend While Not IsNumeric(Mid$(sStr1, i, 1)) And i <= Len(sStr1) s2 = s2 & Mid$(sStr1, i, 1) i = i + 1 Wend While IsNumeric(Mid$(sStr1, i, 1)) And i <= Len(sStr1) sNum2 = sNum2 & Mid$(sStr1, i, 1) i = i + 1 Wend Equalent = s1 & Right$(sNum1, 4) & s2 & Right$(sNum1, 4) End Function Sub Trivials(ByRef s As String) s = Replace(s, "NEW", "ZZZZZZZZ") s = Replace(s, "PNL", "ZZZZZZZY") s = Replace(s, "RNL", "ZZZZZZZX") End Sub Private Function FirstArgfGHSecond(ByVal sStr1 As String, ByVal sStr2 As String) As Boolean Trivials sStr1 Trivials sStr2 sStr1 = strEqualent(sStr1) sStr2 = strEqualent(sStr2) FirstArgfGHSecond = (sStr1 > sStr2) End Function Функция FirstArgfGHSecond возврашает true если первый аргумент > второй аргумент, иначе false |
![]() |
![]() |
![]() |
#4 |
Пользователь
Регистрация: 28.11.2007
Сообщений: 16
|
![]()
To Beralus
Работает как надо! СПАСИБО!!! |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Отчет для сравнения данных | Arest22 | Помощь студентам | 5 | 30.07.2009 14:16 |
Матрицы(функция сравнения). С++ | Anaraida | Помощь студентам | 3 | 24.05.2009 18:01 |
Алгоритм сравнения | f3nix | Общие вопросы Delphi | 1 | 16.02.2008 11:12 |
одна функция потока, а другая функция - член класса запускающего этот поток | Дмитрий_Ч | Общие вопросы C/C++ | 2 | 27.09.2007 08:50 |