powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / есть ли такая функция
18 сообщений из 18, страница 1 из 1
есть ли такая функция
    #34044831
Denis_Sql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Люди! Кто-нибудь знает, есть функция наподобие LPAD или RPAD для SQL, только для VB ? Увы, справочные материалы под рукой отсутствуют.
...
Рейтинг: 0 / 0
есть ли такая функция
    #34044894
Фотография A.K.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Стандартную не видел, но самому нетрудно написать.
Вот, к примеру, мой вариант реализации для Delphi 5:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
 // См. описание функции LTRIM в Oracle8i SQL Reference 
 // ------------------------------------------------------- 
 function  ora_LTRIM(S:  string ; TrimSet:  string  = ' '):  string ;
 var  i, TrimCount: integer;
 begin 
  TrimCount := Length(S)+ 1 ;
   for  i:= 1   to  Length(S)  do 
     if  Pos(Copy(S, i,  1 ), TrimSet) =  0   then   begin 
      TrimCount := i; 
      Break;
     end ;
  Result := Copy(S, TrimCount, Length(S)-TrimCount+ 1 );
 end ;

 // См. описание функции RTRIM в Oracle8i SQL Reference 
 // ------------------------------------------------------- 
 function  ora_RTRIM(S:  string ; TrimSet:  string  = ' '):  string ;
 var  i, TrimCount: integer;
 begin 
  TrimCount :=  0 ;
   for  i:=Length(S)  downto   1   do 
     if  Pos(Copy(S, i,  1 ), TrimSet) =  0   then   begin 
      TrimCount := i;
      Break;
     end ;
  Result := Copy(S,  1 , TrimCount);
 end ;

 // См. описание функции LPAD в Oracle8i SQL Reference 
 // ------------------------------------------------------- 
 function  ora_LPAD(S:  string ; Len: integer; Filler :  string  = ' '):  string ;
 begin 
   if  Length(S) >= Len
     then  Result := Copy(S,  1 , Len) 
     else  Result :=
           Copy(DupeString(Filler, ((Len-Length(S))  div  Length(Filler))+ 1 ),
            1 , Len-Length(S)) + S;
 end ;

 // См. описание функции RPAD в Oracle8i SQL Reference 
 // ------------------------------------------------------- 
 function  ora_RPAD(S:  string ; Len: integer; Filler :  string  = ' '):  string ;
 begin 
   if  Length(S) >= Len
     then  Result := Copy(S,  1 , Len)
     else  Result := S +
           Copy (DupeString(Filler, ((Len-Length(S))  div  Length(Filler))+ 1 ),
            1 , Len-Length(S));
 end ;
...
Рейтинг: 0 / 0
есть ли такая функция
    #34044899
Фотография A.K.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При реализации в VBA вместо паскалевой Copy можно использовать функцию Mid(string, start[, length]), известную еще с ранних бейсиков
...
Рейтинг: 0 / 0
есть ли такая функция
    #34044908
Denis_Sql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну наверное можно и так, хотя хотелось бы "обогатится" в знании VB. По-любому спасибо.
...
Рейтинг: 0 / 0
есть ли такая функция
    #34044937
Фотография A.K.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насколько ублюдская справка в VBA... даже список всех функций работы со строками толком не найдешь.
Имеются LTrim(string), RTrim(string), Trim(string), но в отличие от большинства SQLей тримят только пробелы.
String(number, character) - повторяет character заданное число раз, но только - один символ.
В общем, встроенных функций негусто...
...
Рейтинг: 0 / 0
есть ли такая функция
    #34044978
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы сделал так:

Код: plaintext
1.
2.
Function LPAD(ByVal txt As String, sep As String, lng As Single)
    LPAD = String(lng - Len(txt), sep) & txt
End Function

KL
[MVP - Microsoft Excel]
...
Рейтинг: 0 / 0
есть ли такая функция
    #34045052
Фотография A.K.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KL (XL)Я бы сделал так:

Код: plaintext
1.
2.
Function LPAD(ByVal txt As String, sep As String, lng As Single)
    LPAD = String(lng - Len(txt), sep) & txt
End Function

KL
[MVP - Microsoft Excel]

Элегантно, только функция String не работает с паттернами из нескольких символов (по крайней мере в OfficXP).
...
Рейтинг: 0 / 0
есть ли такая функция
    #34045061
Фотография A.K.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кроме того, в SQL разных СУБД функции LPAD/RPAD тоже реализованы по-разному. К примеру, в Oracle, если длина исходной строки S больше чем требуемое число символов в результирующей строке Len, то производится усечение исходной строки до Len символов.
...
Рейтинг: 0 / 0
есть ли такая функция
    #34045289
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
A.K.Кроме того, в SQL разных СУБД функции LPAD/RPAD тоже реализованы по-разному. К примеру, в Oracle, если длина исходной строки S больше чем требуемое число символов в результирующей строке Len, то производится усечение исходной строки до Len символов.
Ну это уж вообще элементарно решается:
Код: plaintext
1.
2.
3.
4.
5.
6.
Function LPAD(ByVal txt As String, sep As String, lng As Single)
    LPAD = Right(String(lng, sep) & txt, lng)
End Function

Function RPAD(ByVal txt As String, sep As String, lng As Single)
    RPAD = Left(txt & String(lng, sep), lng)
End Function
...
Рейтинг: 0 / 0
есть ли такая функция
    #34045432
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlFunction LPAD(ByVal txt As String, sep As String, lng As Single)
LPAD = Right(String(lng, sep) & txt, lng)
End FunctionКрасиво!

Ну и добавим возможность использовать паттерны из нескольких символов:

Код: plaintext
1.
2.
Function LPAD(ByVal txt As String, sep As String, lng As Double)
    LPAD = Right(Application.Rept(sep, lng) & txt, lng)
End Function

KL
[MVP - Microsoft Excel]
...
Рейтинг: 0 / 0
есть ли такая функция
    #34045442
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пардон - случайно задекларировал lng как Double :-(


Код: plaintext
1.
2.
Function LPAD(ByVal txt As String, sep As String, lng As Single)
    LPAD = Right(Application.Rept(sep, lng) & txt, lng)
End Function


KL
[MVP - Microsoft Excel]
...
Рейтинг: 0 / 0
есть ли такая функция
    #34045601
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Функция Rept взята из Excel, т.ч. из др. приложений или VB нужно будет специально указывать, что Application это Excel :-)

KL
[MVP - Microsoft Excel]
...
Рейтинг: 0 / 0
есть ли такая функция
    #34046820
Фотография A.K.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, решение теперь стало не только элегантным но и функциональным!
Только вопрос небольшой: в какой версии Excel появилась Application.Rept ?
...
Рейтинг: 0 / 0
есть ли такая функция
    #34047269
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
A.K.Да, решение теперь стало не только элегантным но и функциональным!
Только вопрос небольшой: в какой версии Excel появилась Application.Rept ?Не помню, но по-моему в Excel 97 уже была. Эта функция листа, а не VBA. Поэтому при использовании из др. приложений или VB и нужно прибегать к раннему привязыванию (Early Binding), т.е.:

1) установить ссылку в Tools-References... на Microsoft Excel x.x Object Library (где x.x - версия)

2) использовать функцию в таком виде:
Код: plaintext
1.
2.
Function LPAD(ByVal txt As String, sep As String, lng As Single)
    LPAD = Right(Excel.Application.Rept(sep, lng) & txt, lng)
End Function

KL
[MVP - Microsoft Excel]
...
Рейтинг: 0 / 0
есть ли такая функция
    #34047580
Фотография A.K.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KL (XL)Не помню, но по-моему в Excel 97 уже была. Эта функция листа, а не VBA. Поэтому при использовании из др. приложений или VB и нужно прибегать к раннему привязыванию (Early Binding), т.е.:

1) установить ссылку в Tools-References... на Microsoft Excel x.x Object Library (где x.x - версия)

2) использовать функцию в таком виде:
Код: plaintext
1.
2.
Function LPAD(ByVal txt As String, sep As String, lng As Single)
    LPAD = Right(Excel.Application.Rept(sep, lng) & txt, lng)
End Function


Все, разобрался. Но не знаю как в других версиях, а у меня это работает только через класс WorksheetFunction (Excel 2002):
Код: plaintext
 LPAD = Right(Application.WorksheetFunction.Rept(sep, lng) & txt, lng)
Напрямую, как у вас - у Application нет такого метода в Excel 2002.
...
Рейтинг: 0 / 0
есть ли такая функция
    #34047686
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
A.K.Напрямую, как у вас - у Application нет такого метода в Excel 2002.

Есть точно , но не очевидно . При наборе "Application." функции как свойства не выпадают, но работать должны .

KL
[MVP - Microsoft Excel]
...
Рейтинг: 0 / 0
есть ли такая функция
    #34047738
Фотография A.K.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гляди-ка, и правда! Чудный язык VBA...
...
Рейтинг: 0 / 0
есть ли такая функция
    #34047759
KL (XL)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот еще немного инф-ции: http://tinyurl.com/l5fou
Я думаю, что такая форма продолжает существовать для обратной совместимости - в Excle5 писали Application.Sum(...)

KL
[MVP - Microsoft Excel]
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / есть ли такая функция
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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