На написание этой статьи меня натолкнул пользователь Панург с сайта 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 больше, чем количество знаков в str, Mid функция возвращает строку нулевой длины (" "). 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
Ваш коментарий будет первым | | |