powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / интересные факты / наблюдения / анализ чужих и собственных решений
25 сообщений из 280, страница 10 из 12
интересные факты / наблюдения / анализ чужих и собственных решений
    #38043350
studieren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если нужно заменить 2 и более подряд идущие пробелы на 1 пробел, то можно воспользоваться Replace скажем так:
Код: vbnet
1.
strText = Replace(strText, "  ", " ")


Но что делать если подряд идут 4 или 5 пробелов, а по условиям задачи требуется, чтобы между слов оставался не более одного пробела? Ведь после замены в таком случае все равно останутся 2 и более пробелов.
Когда-то в таких случаях я пользовался циклом: продолжал до тех пор пока длина строки переставала сокращаться. Но после изучения регулярных выражений понял, что есть более изящное решение. :)
А код такой:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
Public Function ReplaceDoubleSpaces(strText As String) As String
    Static objRegExp As Object
    
    Set objRegExp = CreateObject("VBScript.RegExp")
    objRegExp.Global = True
    objRegExp.Pattern = " {2,}"
    ReplaceDoubleSpaces = objRegExp.Replace(strText, " ")
    Set objRegExp = Nothing
End Function


В принципе вместо пробела (там где отмечено красным цветом) можно использовать и другой символ или даже группа символов. Отличие от простейшего Replace заключается в том, что за 1 раз заменяются все 2 и более пробела на 1, в связи с чем вовсе не требуется цикла.
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #38043427
Фотография qwrqwr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
studierenНо что делать если подряд идут 4 или 5 пробелов, а по условиям задачи требуется, чтобы между слов оставался не более одного пробела? Ведь после замены в таком случае все равно останутся 2 и более пробелов.
Регулярки - это хорошо и универсально, но хочу вставить 5 копеек в защиту риплейса. :)
N вложенных риплейсов заменяют на один пробелы, количеством не более, чем (2^N).
То есть, если мы уверены, что имеем не более 16-ти пробелов подряд - нам гарантировано хватает 4 риплейсов:
Код: vbnet
1.
2.
?Replace(Replace(Replace(Replace("test                test", "  ", " "), "  ", " "), "  ", " "), "  ", " ")
test test
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #38043436
guest_rusimport
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
studieren,

проверил на досуге .... тож вариант

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
Public Function strspace(strtext As String)
strspace = ""
a = Split(strtext, " ")
For i = LBound(a) To UBound(a)
If a(i) <> "" Then strspace = strspace & a(i) & " "
Next i
End Function
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #38043439
Фотография nord-woolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwrqwr... N вложенных риплейсов заменяют на один пробелы, количеством не более , чем (2^N).
...
Мне удалось (с разбегу) заменить 38 пробелов 4 риплейсами.
Подозреваю, это не предел. :)
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #38043457
!??
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
!??
Гость
nord-woolfqwrqwr... N вложенных риплейсов заменяют на один пробелы, количеством не более , чем (2^N).
...
Мне удалось (с разбегу) заменить 38 пробелов 4 риплейсами.
Подозреваю, это не предел. :)
Если пройти подобный инстанс, состоящий, к примеру, из 808 пробелов, то их останется ещё больше
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #38043483
Фотография nord-woolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
от 808 пробелов осталось всего 6.
:)
Код: vbnet
1.
2.
?Replace(Replace(Replace(Replace("test" & Space(808) & "test", Space(7), Space(1)), Space(4), Space(1)), Space(3), Space(1)), Space(2), Space(1))
test      test


"Рабочий" диапазон до 40 пробелов подряд.
Потом врет.
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #38043490
!??
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
!??
Гость
nord-woolf,

а Автор сказал 16
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #38043645
Фотография qwrqwr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
!??nord-woolf,
а Автор сказал 16

Зонуды, блин.
Вообще-то всегда можно уложиться и в три риплейса.
Код: vbnet
1.
2.
? Replace(Replace(Replace("test" & Space(100500) & "test", " ", " "&chr(0)), chr(0)&" ", ""), " "&chr(0), " ")
test test
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #38043675
Фотография Сергей Лалов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот еще интересный факт, свойство таблицы, замеченное в ms access 2007. Называется "Отслеживание строк." Попробуйте активировать данное свойство, не работает. Это рудимент для сервера?:
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #38043852
studieren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwrqwrВообще-то всегда можно уложиться и в три риплейса.
Код: vbnet
1.
2.
? Replace(Replace(Replace("test" & Space(100500) & "test", " ", " "&chr(0)), chr(0)&" ", ""), " "&chr(0), " ")
test test



Чрезвычайно оригинальное решение.

А как заставить в REPLACE работать постановочных знаков (wildcard)? Вообще такое возможно?
Сам я думаю, что нет. Но глядя на то, как здесь лихо справляются с трудными задачами, думаю у знатоков может есть "секретные" приёмы?
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #38046086
!??
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
!??
Гость
studieren,
Код: vbnet
1.
    Static objRegExp As Object


Судя по тому, что буквально не "по хэлпам", то Статик здесь осмысленно? Для чего?
Спасибо
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #38046329
studieren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
!??,

Ой, ошибочка вышла. Я эту функцию использовал для одного запроса и там в конце у меня не было "Set objRegExp = Nothing". Я вот в конце обнулить переменного не забыл, но зато в начале забыл заменить "Static" на "Dim". :)
Конечно же функция должна выглядеть так:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
Public Function ReplaceDoubleSpaces(strText As String) As String
    Dim objRegExp As Object
    
    Set objRegExp = CreateObject("VBScript.RegExp")
    objRegExp.Global = True
    objRegExp.Pattern = " {2,}"
    ReplaceDoubleSpaces = objRegExp.Replace(strText, " ")
    Set objRegExp = Nothing
End Function


Спасибо за поправку.
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #38046365
studieren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если хотите использовать эту же функцию в запросах, то функция должна выглядеть так:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
Public Function ReplaceDoubleSpaces(strText As String) As String
    Static objRegExp As Object
    If objRegExp Is Nothing Then
        Set objRegExp = CreateObject("VBScript.RegExp")
        objRegExp.Global = True
        objRegExp.Pattern = " {2,}"
    End If
    ReplaceDoubleSpaces = objRegExp.Replace(strText, " ")
End Function


Но честно говоря всё-таки идея qwrqwr намного лучше, ибо там вообще не требуется использование какого-либо объекта. Более того, при таком раскладе функция получается более универсальной как для самой VBA, так и для запросов.
Код: vbnet
1.
2.
3.
4.
Public Function ReplaceDoubleSpaces(strText As String) As String
    ReplaceDoubleSpaces = Replace(Replace(Replace(strText, " ", " " & Chr(0)), _
        Chr(0) & " ", ""), " " & Chr(0), " ")
End Function


Да и прямо в самом запросе можно 3 Replace'а подсучить.
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #38048311
studieren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обнаружил одну странность Access'а (2003).
Запускаю вот такой запрос
Код: sql
1.
SELECT @Version AS V


Здесь "@Version" как бы неявно объявленный параметр. Как и подобает в таких случаях Access спрашивает значение параметра, что в общем-то логично. Но как только стоит мне объявить (как "хороший" мальчик), то здесь происходит чудеса.
Код: sql
1.
2.
PARAMETERS @Version Text(255);
SELECT @Version AS V


Теперь Access НЕ спрашивает значение, а сразу показывает свою версию.
Я понимаю, что использовать ключевые слова не есть хорошо, но почему в первом варианте он не показывает версию Access'а? Вот тут не совсем понятно.
И вообще, какие зарезервированные слова ведут себя подобным образом?
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #38048347
studieren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кажется начал понимать в чём тут дело. ИМХО все свойства объекта "Application" имеют такую особенность.
Код: sql
1.
2.
PROCEDURE @Build Long, BrokenReference Bit, [CurrentObjectName] Text(255);
SELECT @Build, BrokenReference, [CurrentObjectName]


Забавно! :)
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #38048348
qwerty112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
нда, интересно... :)
studieren...
И вообще, какие зарезервированные слова ведут себя подобным образом?
похоже, любые проперти Access.Application так можно "достать"

Код: sql
1.
2.
PARAMETERS @Visible bit, @UserControl bit; 
select @Visible, @UserControl


@Visible@UserControl-1-1
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #38048358
studieren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwerty112,

Ну надо же, первый раз обогнал qwerty112 по нажатию кнопок.
Тока написал, а он тут как тут. :)
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #38048373
qwerty112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwerty112похоже, любые проперти Access.Application так можно "достать"

но "работает" или в сохр.запросах, или через Application.DoCmd
что в общем-то и "ожидалось" ...

Код: vbnet
1.
DoCmd.RunSQL "PARAMETERS @Version Text(255); update Q set qqq=@version"
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #38059793
studieren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В Excel'е есть очень полезная штука "QueryTable", с помощью которой можно импортировать данные из любой СУБД. Создаём запрос к серверу и получаем данные.
Вот что делать если запрос с параметром?
Раньше я в программе динамически создавал запрос и в свойство CommandText подменял текст запроса каждый раз. Вчера как-то решил по приколу поменять примерно вот такого рода текст для СУБД SQL Server:
Код: sql
1.
SELECT * FROM dbo.Table1 WHERE ID = ?


Решил попробовать обновить запрос "вручную" и очень удивился, когда Excel не вернул ошибку, а стал спрашивать значение параметра!
Мне и в голову не приходило, что можно в Excel'е соорудить запрос с параметром, да так, чтобы у юзера программа сама стала бы спрашивать значения и при этом без единого кода. Соответственно я и не искал в help'е и где-нибудь в и-нете что-либо подобное. А тут такое! :)
Короче, эксперименты показали, что вместо константное значение для параметра можно просто проставлять вопросительные знаки и каждый знак Excel понимает как очередной параметр.
Код: sql
1.
EXEC MyStorProc @Parameter1 = ?, @Parameter2 = ?


Можно оказывается программно вставить более предметную подсказку типа "Введите код клиента". Например так:
Код: vbnet
1.
2.
ActiveSheet.QueryTables(1).Parameters(1).SetParam _
     xlPrompt, "Введите код клиента"


Более того можно сделать ссылку на определённую ячейку, чтобы Excel не спрашивал значение параметра, а сразу брал значение с указанной ячейки. Для этого вместо значения нужно написать что-то вроде "=Лист1!A1" и вуаля!
Ну и много, много чего можно ещё нарыть в help'е. :)

P.S. Ну извиняйте ежли баян! :)
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #38059798
studieren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня офис 2003. Там выходит вот такое диалоговое окно.
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #38059806
!??
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
!??
Гость
studierenУ меня офис 2003. Там выходит вот такое диалоговое окно.
studieren,
похоже, когда-то стоял 2007, а это, судя по датапикеру, какие-то обломки от него остались
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #38059818
studieren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
!??studierenУ меня офис 2003. Там выходит вот такое диалоговое окно.
studieren,
похоже, когда-то стоял 2007, а это, судя по датапикеру, какие-то обломки от него остались
Вроде никогда не устанавливал офис 2007. Разве что в виртуалку. Ну это окно я получил с "боевого коня", а там строго 2003. Сейчас у соседей попробую.
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #38059829
studieren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
!??studierenУ меня офис 2003. Там выходит вот такое диалоговое окно.
studieren,
похоже, когда-то стоял 2007, а это, судя по датапикеру, какие-то обломки от него остались
Только что проверил у соседей, у которых отродясь НИКОГДА не был установлен офис 2007 вообще. Точь в точь такое же диалоговое окно. Так что на обломки не похоже. :)
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #38059860
Фотография qwrqwr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
studierenВот что делать если запрос с параметром? тут было
...
Рейтинг: 0 / 0
интересные факты / наблюдения / анализ чужих и собственных решений
    #38066199
studieren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем известно, что если скопировать текст из окна редактора VBA и при этом если язык клавиатуры не "русский", то кириллица после вставки текста превращается в крякозябру.
Как-то тестировал кусочек кода в Excel'е (там в отличии от Access открываем новую книгу и не сохранив сам файл можем сразу тестировать код). Не посмотрев на язык клавиатуры скопировал в базу и сохранил, а Excel файл разумеется не сохранил. :)
Там название некоторых объектов, комментарии и тексты Msgbox, в общем все превратилось в неудобочитаемый текст. :)
Раньше не знал о существовании такого простого трюка. Оказывается весь этот текст можно скопировать в Word и там "Сервис" ==> "Исправить поврежденный текст" и вуаля! Весь текст опять "нормальный"!

Ну и это не всё!
Прилагаю файл "CodePage.reg", которого нужно просто запустить и согласиться с тем, чтобы некоторые Win реестры изменились.
текст файлаWindows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage]
"1250"="c_1251.nls"
"1251"="c_1251.nls"
"1252"="c_1251.nls"
"1253"="c_1251.nls"
"1254"="c_1251.nls"
"1255"="c_1251.nls"

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage\EUDCCodeRange]
"Unicode"="E000-F8FF"

После этого обязательно нужно перезагрузить Windows. Если у Вас Win XP, то теперь смело можете копировать и вставить тексты из VBA и наоборот, и при этом совсем можно игнорировать раскладку клавиатуры. "Крякозябры" не появятся.

P.S. У меня в ноутбуке Win 7. Увы, там этот номер почему-то не проходит.
Кто-нибудь знает как заставить Win 7 работать так как надо со шрифтами / Unicode и прочие, прочие, прочие ???
...
Рейтинг: 0 / 0
25 сообщений из 280, страница 10 из 12
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / интересные факты / наблюдения / анализ чужих и собственных решений
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]