Rambler's Top100
Навигация
Главная
MS ACCESS
VB
ASP
PHP
Наши друзья
Поиск
Форум
Лента новостей
Новый сайт

Online
Рассылки Subscribe.Ru
Работа с MS Access
Подписаться письмом
Реклама на сайте
 
Главная arrow MS ACCESS arrow Особенности функции Mid и инструкции Mid
Особенности функции Mid и инструкции Mid Печать E-mail
Автор Joss   
01.10.2019 г.
На написание этой статьи меня натолкнул пользователь Панург с сайта SQL.RU.

Сначала дадим определение функции Mid по справочнику.

 

Функция Mid (VB/VBA)

 

Вообще-то их несколько похожих функций Mid, Mid$, MidB и MidB$

 

Назначение: Считывает заданное число символов или байт от заданной позиции в строке слева направо

Возвращает строку прочитанных данных. Для функций Mid, Mid$ данные представляют собой символы, для функций MidB и MidB$ - байты.

Тип возвращаемых данных:

Для функций Mid, MidB - Variant субтип String

Для функций Mid$, MidB$ - String 

 

Mid( _

   ByVal str As String, _

    ByVal Start As Integer, _

    Optional ByVal Length As Integer _

 ) As String


Параметры

str - Обязательный параметр. Выражение String, из которого возвращаются знаки.

Start - Обязательный параметр. Выражение типа Integer. Начальная позиция возвращаемых знаков. Если Start больше, чем количество знаков в strMid функция возвращает строку нулевой длины (" ").

Length - Необязательный параметр. Выражение типа Integer. Число возвращаемых знаков. Если этот параметр опущен или количество знаков в тексте меньше, чем Length (включая знак на позиции Start), возвращаются все знаки от начальной позиции до конца строки.

 

Примечания

Если параметр str равен Null, то функция и возвращает Null.

Нумерация символов в строке всегда начинается с единицы.

Если Start больше длины str , возвращается пустая строка ("").

 

Исключения

При значении параметра Start <= 0 или Length < 0 генерируется ошибка

 

А теперь дадим определение инструкции Mid (VB/VBA) (впрочем иногда её обзывают оператором) 

 

Вообще-то существуют две инструкции (оператора) - Mid и MidB

Назначение: Заменяет указанное число знаков (байт) в переменной типа String знаками (байтами) из другой строки.

 

Mid( _

   ByRef Target As String, _

   ByVal Start As Integer, _

   Optional ByVal Length As Integer _

) = StringExpression

 

  

Параметры

Target - Обязательно. Имя переменной типа String для изменения.
Start - Обязательно. Выражение типа Integer. Позиция знака в строке Target, с которой начинается замена текста. Для Start используется индекс, начинающийся с единицы.

Length - Необязательно. Выражение типа Integer. Число заменяемых знаков. Если параметр опущен, используется вся строка String.

StringExpression - Выражение String, заменяющее часть строки Target.

 

Примечания

Нумерация символов в строке всегда начинается с единицы.

Mid не изменяет длины исходной строки. Если Start Length больше длины модифицируемой строки (Target), заменяющая подстрока обрезается.

Инструкция MidB используется для замены байтов в строке. В этом случае параметры Start и Length измеряются в байтах.

 

Исключения

При значении параметра Start <= 0 или Length < 0 генерируется ошибка.

 

Пример.


' Creates text string.

Dim TestString As String = "Mid Function Demo"

' Returns "Mid".

Dim FirstWord As String = Mid(TestString, 1, 3)

' Returns "Demo".

Dim LastWord As String = Mid(TestString, 14, 4)

' Returns "Function Demo".

Dim MidWords As String = Mid(TestString, 5) 


 

Таким образом функция Mid и инструкция (оператор) Mid противоположны по действию. Функция вырезает часть строки, а оператор вставляет в исходную строку заменяющую часть.

 

Функция Mid - https://msdn.microsoft.com/ru-ru/library/05e63829(v=vs.90).aspx

Инструкция или оператор Mid - https://msdn.microsoft.com/ru-ru/library/xz5s6003(v=vs.90).aspx

  

 

P.S.  Дополнение. Взято с сайта stackoverflow.com

 


Существует важная, но почти всегда пропущенная функция оператора Mid (). Вот где Mid () появляется в левой части задания, а не в функции Mid (), которая появляется в правой части или в выражении.

 

Правило заключается в том, что если строка-мишень не является строковым литералом, и это единственная ссылка на целевую строку, а длина вставленного сегмента соответствует длине заменяемого сегмента, тогда строка будет обрабатываться как изменен для операции.

 

Что это значит? Это означает, что если вы создадите большой отчет или огромный список строк в одном строковом значении, то использование этого приведет к большей скорости обработки вашей строки.

 

 

Вот простой класс, который выигрывает от этого. Это дает VBA ту же возможность StringBuilder, что и .Net.

 

' Class: StringBuilder
Option Explicit
Private Const initialLength As Long = 32
Private totalLength As Long  ' Length of the buffer
Private curLength As Long    ' Length of the string value within the buffer
Private buffer As String     ' The buffer
 
Private Sub Class_Initialize()
  ' We set the buffer up to it's initial size and the string value ""
  totalLength = initialLength
  buffer = Space(totalLength)
  curLength = 0
End Sub
 
Public Sub Append(Text As String)
  Dim incLen As Long ' The length that the value will be increased by
  Dim newLen As Long ' The length of the value after being appended
  incLen = Len(Text)
  newLen = curLength + incLen
  ' Will the new value fit in the remaining free space within the current buffer
  If newLen <= totalLength Then
    ' Buffer has room so just insert the new value
    Mid(buffer, curLength + 1, incLen) = Text
  Else
    ' Buffer does not have enough room so
    ' first calculate the new buffer size by doubling until its big enough
    ' then build the new buffer
    While totalLength < newLen
      totalLength = totalLength + totalLength
    Wend
    buffer = Left(buffer, curLength) & Text & Space(totalLength - newLen)
  End If
  curLength = newLen
End Sub
 
Public Property Get Length() As Integer
  Length = curLength
End Property
 
Public Property Get Text() As String
  Text = Left(buffer, curLength)
End Property
 
Public Sub Clear()
  totalLength = initialLength
  buffer = Space(totalLength)
  curLength = 0
End Sub 


 

И вот пример того, как его использовать: 

 

Dim i As Long 
Dim sb As StringBuilder
Dim result As String
Set sb = New StringBuilder
For i = 1 to 100000
   sb.Append CStr(i)
Next i
result = sb.Text

https://stackoverflow.com/questions/1070863/hidden-features-of-vba 

 

 


Просмотров: 6208

  Ваш коментарий будет первым

Добавить коментарий
Имя:
E-mail
Коментарий:



Код:* Code

 
Реклама на сайте
HiProg.com - Технологии программирования
Rambler's Top100 TopList