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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.01.2010, 22:05   #1
bank_notes
Пользователь
 
Регистрация: 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 (так и надо)
…………………………………………
Вот такой нужен порядочек нужен. Можно помочь? Или хотя бы направить в нужном направлении ;-)
bank_notes вне форума Ответить с цитированием
Старый 29.01.2010, 22:37   #2
motorway
Участник клуба
 
Регистрация: 28.06.2009
Сообщений: 1,950
По умолчанию

Возможный макрос будет состоять из выяснения, одинаковые ли префиксы, и если да, то он будет убирать все буквы в строке и оставлять цифры. А это делается с помощью функций обработки строк
motorway вне форума Ответить с цитированием
Старый 30.01.2010, 00:18   #3
Beralus
 
Регистрация: 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
Beralus вне форума Ответить с цитированием
Старый 12.02.2010, 22:08   #4
bank_notes
Пользователь
 
Регистрация: 28.11.2007
Сообщений: 16
По умолчанию

To Beralus

Работает как надо! СПАСИБО!!!
bank_notes вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отчет для сравнения данных 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