Россыпь мелких вопросов

  • Автор темы Vagor.ini
  • Дата начала
A

alexas

Всё можно сделать в Input translation - юзер не будет напрягаться контролем ввода:
Разбирать лучше не по-символьно, а по группам символов, добавив ":" к проверяемой строке справа.
Далее replace "::" на ":" - исключаем случай ошибочного ":" в конце (к примеру, юзер ввёл А1: и всё)
Далее последовательный разбор строки по группам вида "A...B1:" (опираясь на ":" как разделитель групп)
"Неправильные" символы просто не давал бы вводить (реплейсить их в пробел и трим)
Отреплейсить "А":"В":"Р":"У":"Е" и т.д. кирилицы на соответствующие им по написанию латиницу.

Берём только первую и вторую группы (что-бы отсечь возможную ошибку ввода - третью или более группы)
переставляем цифры и буквы в группе, если надо
Проверяем, что получились группы вида "A...B1:" т.е. что только одно число и оно в конце. Если нет - реплейсим все неконечные цифры в пробел и трим.
удаляем последний ":" (который ранее добавили)

На вскидку, я бы делал как-то так.

Добавлено:
И если пользователь указал ячейку в диапазона "A1:XXXXXX", то говорить: "а тут такой нет"
Из "несущесвующих" ячеек строки эхель вернёт пустоту, по-моему. Это и контролировать ( т.е. вести запись "наоборт" - от конца к началу строки)
 

Eugen

Green Team
22.03.2012
210
1
BIT
1
Вариант с Input Translation не подходит, тк пользователь вводит диапазон в диалоге, а не на форме. Пока что сделал так:

Код:
Function checkCellName(cellName As String) As Boolean
On Error GoTo errH
Dim arrLiteral, arrNumeric, arrTrash, res

arrLiteral = Split("A B C D E F G H I J K L M N O P Q R S T U V W X Y Z", " ")
arrNumeric = Split("0 1 2 3 4 5 6 7 8 9", " ")
arrTrash = Split("$ # № ! , . @ % ^ & * ( ) ? < > ~ ` | [ ] { }; : / \", " ")

res = Replace(cellName, arrTrash, "")
res = Replace(UCase(res), arrLiteral, "")
res = Replace(res, arrNumeric, "")
If res = "" Then
checkCellName = True
End If

endSub:
Exit Function
errH:
Print {function "checkCellName" =>> Error "} & Error$ & {" in line } & Erl
Resume endSub
End Function

Вот теперь думаю, все ли я учел?)

Добавлено: Хотя надо еще порядок проверять, чтобы буквы перед цифрами стояли и букв было не более 2-х
 
A

alexas

Вариант с Input Translation не подходит, тк пользователь вводит диапазон в диалоге, а не на форме. ...
Не аргумент.
Ни что не мешает сделать форму-диалог для ввода и её открывать из скрипта.

P.S.
Так же неплохо контролировать посимвольно в процессе ввода.
Тут уже не Input translation, а JavaScript в onBlur - onChange, но это уже вопрос предпочтений.
 

Eugen

Green Team
22.03.2012
210
1
BIT
1
Так то оно так, но лишнюю форму из-за этого как-то неохота рисовать.
 
A

alexas

Так то оно так, но лишнюю форму из-за этого как-то неохота рисовать.
Это Вы зря. Ещё столько их Вам придётся рисовать :)
Всё-таки лучше не просто проверять и по результату выдавать ошибку, а корректировать как надо, но для этого результат надо показывать в форме.
Зато юзверь Вас добрым словом помянет.
 

Eugen

Green Team
22.03.2012
210
1
BIT
1
Допилил концовку. Так наверно правильней будет, если проверять все кодом конечно...
Код:
arrLiteral = Split("A B C D E F G H I J K L M N O P Q R S T U V W X Y Z", " ")
arrNumeric = Split("0 1 2 3 4 5 6 7 8 9", " ")
arrTrash = Split("$ # № ! , . @ % ^ & * ( ) ? < > ~ ` | [ ] { }; : / \", " ")

res = Replace(cellName, arrTrash, "")
numbers = Replace(UCase(res), arrLiteral, "")
literals = Replace(res, arrNumeric, "")

colName = StrLeft(cellName, numbers)
rowNum = StrRight(cellName, literals)

If colName <> "" And rowNum <> "" Then
If Len(colName) <= 2 And CInt(rowNum) > 0 Then
checkCellName = True
End If
End If
 
H

hosm

странные у вас проверки.
А можно пояснить смысл res = Replace(cellName, arrTrash, "") внутри ф-ции проверки? (без пробела идут некоторые элементы arrTrash, кстати.)
Как вы хотели обезопаситься от кракозябр, насколько далеко "и т.д."?
Мне кажется, что вполне себе корректные в терминах экселя адрес AC$1 и AAA1 - не пройдут валидность в ф-ции, а пройдут A+1, A-1, ACЭ1, AC_1.
Для ввода диапазоны вида RC - запрещены, насколько я поняла?
 

Eugen

Green Team
22.03.2012
210
1
BIT
1
А можно пояснить смысл res = Replace(cellName, arrTrash, "") внутри ф-ции проверки? (без пробела идут некоторые элементы arrTrash, кстати.)
это для того, чтобы отсеять весь возможный мусор, введенный пользователем.
Эта функция - лишь проверка имени конкретной ячейки. Она вызывается из другой функции, которая проверяет структуру переданного в неё range.

Код:
Function checkRange (range As String, orientation As String) As Boolean
On Error GoTo errH
Dim startCellName As String, stopCellName As String
Dim res

checkRange = False

res = Split(range, ":")
If UBound(res) > 1 Then Exit Function

startCellName = StrLeft(range, ":")
stopCellName = StrRight(range, ":")
If startCellName <> "" And stopCellName <> "" Then
If checkCellName(startCellName) And checkCellName(stopCellName) Then
Select Case orientation
Case "vert" :
If getColumnNum(startCellName) <= getColumnNum(stopCellName) And getRowNum(startCellName) = getRowNum(stopCellName) Then
checkRange = True
End If
Case "horiz" :
If getColumnName(startCellName) = getColumnName(stopCellName) And getColumnNum(startCellName) <= getColumnNum(stopCellName) Then
checkRange = True
End If
End Select
End If
End If
endSub:
Exit Function
errh:
Print {function "checkRange" =>> Error "} & Error$ & {" in line } & Erl
Resume endSub	
End Function

Что касается русских букв в имени ячейки - у меня сначала было немного по другому написано, видимо косякнул, когда переделывал. Там было что-то вроде этого:
Код:
res = Replace(cellName, arrTrash, "")
res = Replace(res, arrLiteral, "")
res = Replace(res, arrNumeric, "")

Таким образом получалось, что если res <> "" после всех манипуляций, значит там русские буквы. А насчет AAA1 - ну не наберется у меня такое количество данных, чтобы добраться до такого столбца.

Добавлено: В моем случае, я считаю, просто перед последней проверкой можно добавить IsNumeric(numbers)
 

seoman2

Green Team
17.02.2010
507
1
BIT
72
Как сделать в виде правильную сортировку по колонке? Если sort ascending, то :
02.3-01/28
02.3-01/29
02.3-01/3
02.3-01/30
Надо значение текстовоого поля распарсивать как-то на цифры и текст до "/" ?
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 976
611
BIT
384
вот и распарсивайте...
сделайте две скрытых колонки, с сортировкой по цифрам и буквам
 
A

afest

ну вот туть есть некоторые моменты, может поможет (там два файлика, один - шаблон для правки, а второй - для юзверя)
 

Вложения

  • Реестр.rar
    33,4 КБ · Просмотры: 157

seoman2

Green Team
17.02.2010
507
1
BIT
72
Интеерсно, почему @left(поле;"/")+"/"+@ToNumber(@Right(поле;"/") не работает.

>>сделайте две скрытых колонки, с сортировкой по цифрам и буквам
а итоговая колонка будет суммой 2-х скрытых?
 
A

alexas

Получили ошибку?
Эт правильно.

В первой колонке @left(поле;"//")
Во второй @TextToNumber(@Right(поле;"//") (Не забыть сделать колонку числом)

Колонки сортированные скрытые, перед Вашей, для показа (без сортировки)

P.S.
Поправил. Слэш двойной, конечно (savl отметил :) )
 

savl

Lotus Team
28.10.2011
2 621
314
BIT
457
@left(поле;"//") наверное.
И проблема на самом деле в том, что длина номер разная.
Тут правила сравнения текстовых строк, 02.3-01/3 меньше чем 02.3-01/30.
Надо было делать одной длины, всегда.
 

seoman2

Green Team
17.02.2010
507
1
BIT
72
Как сделать регистрационные номера документов одной длины всегда?
А еще в конце номера могут быть буковки...
 

savl

Lotus Team
28.10.2011
2 621
314
BIT
457
seoman2
дык уже не поможет,надо правила формирования менять.
Вот у нас: аббревиатура компании - номер / год.
Формируем: АК & "-" & Right("00000" & count, 5) & {/} & @Right("00" & Year(Today),2)
Получим вот такой номер для первого документа: АК-00001/14
...
Для 113 документа: АК-00113/14
И так далее, предел можно расширить у меня запас на 99999 документов, столько не бывает в год.

А вот в вашем варианте, надо все такие номера 02.3-01/3 сделать в 02.3-01/03 или 02.3-01/003
И по аналогии с остальными.
А если еще и буковки есть. то совсем беда, лучше делайте через 2 скрытые колонки, как советуют чуть выше.
 
A

alexas

seoman2
С буковками долго объяснять.
Посмотрите пример, там всё понятно.
Во второй колонке:
a - цифровая часть
b - буквы справа
 

Вложения

  • sorting.zip
    29,4 КБ · Просмотры: 146

Eugen

Green Team
22.03.2012
210
1
BIT
1
Слышал, что в представлении можно отображать элементы дизайна. Для этого нужно программно переписать какое-то свойство вью, а вот какое в упор не помню... Может кто подскажет?
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!