VBA has built-in functions for repeating a single character:
Function String$(Number As Long, Character) As String
Function Space$(Number As Long) As String
But neither are of any use when you need to repeat a string that has more than one character.
You could repeat a string "abcde"
5 times by doing something crafty like:
?Join(Split(String$(5,"."),"."),"abcde")
But that is neither intuitive nor performant.
In Excel, there is also WorksheetFunction.Rept
, but it is painfully slow, and only available in Excel.
So I made a custom function that builds the string, while minimizing the concatenations. In fact, it doesn’t use any concatenation, but instead uses a buffer and CopyMemory
to fill the buffer. And rather than filling the buffer one instance at a time, the code fills the buffer using a lookback that reduces the number of buffer writes exponentially:
Given a string "abcde"
that repeats 5 times:
Create a buffer of 25 spaces
" "
1st buffer write — assign the string to the first buffer position
"abcde "
[NEW]
2nd buffer write — copy the existing populated buffer (5 characters) into the next buffer position
"abcdeabcde "
[NEW]
3rd buffer write — copy the existing populated buffer (10 characters) into the next buffer position
"abcdeabcdeabcdeabcde "
[ NEW ]`
4th buffer write — copy the lesser of the existing populated buffer (20 characters) and the remaining buffer (5 characters) into the next buffer position.
"abcdeabcdeabcdeabcdeabcde"
[NEW]
StringRepeat
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByVal Destination As Long, ByVal source As Long, ByVal Length As Long)
Public Function StringRepeat(number As Long, expression As String) As String
Dim copyBufferLength As Long
copyBufferLength = LenB(expression)
'Create a buffer
StringRepeat = Space$(number * Len(expression))
Dim bufferLengthBytes As Long
bufferLengthBytes = LenB(StringRepeat)
Dim bufferPointer As Long
bufferPointer = StrPtr(StringRepeat)
'Copy the original expression to the start of the buffer
CopyMemory bufferPointer, StrPtr(expression), copyBufferLength
Do While copyBufferLength < bufferLengthBytes
Dim remainingByteCount As Long
'Check we're not going to overflow the buffer
remainingByteCount = bufferLengthBytes - copyBufferLength
If copyBufferLength > remainingByteCount Then
CopyMemory bufferPointer + copyBufferLength, bufferPointer, remainingByteCount
Else
CopyMemory bufferPointer + copyBufferLength, bufferPointer, copyBufferLength
End If
copyBufferLength = copyBufferLength * 2
Loop
End Function
The performance varies by the number of repeats, and the number of characters in the string to be repeated. I tried handling special cases like repeating a string 1 time (just return the string), and/or repeating a single character (return the result of String$
instead), but while that speeds up the special cases, it slows down all other cases.
I’m not checking whether the number
input is positive, and I’m not checking that the string to repeat is at least 1 character long, as for now, I’m focusing on performance.
In some instances (small values of number
, short expression
lengths), avoiding the Exponential lookback approach is not as fast as a straight-up loop and copy:
RepeatString Simple
Function StringRepeatSimple(number As Long, expression As String) As String
Dim expressionLengthBytes As Long
expressionLengthBytes = LenB(expression)
'Create a buffer
StringRepeatSimple= Space$(number * Len(expression))
Dim bufferPointer As Long
bufferPointer = StrPtr(StringRepeatSimple)
Dim expressionPointer As Long
expressionPointer = StrPtr(expression)
Dim copyCounter As Long
For copyCounter = 0 To number - 1
CopyMemory bufferPointer + copyCounter * expressionLengthBytes, expressionPointer, expressionLengthBytes
Next copyCounter
End Function
String
String(Number,Character)
Функция String используется для создания строки из одинаковых символов
Возвращаемое значение
Возвращает значение типа Variant (String), содержащее повторяющуюся строку указанной длины
Параметры
Функция содержит именованные аргументы
- Number
- Обязательный аргумент — число типа Long, определяющее длину возвращаемой строки. Если аргумент имеет значение Null, то возвращаемое значение тоже Null
- Character
- Обязательный аргумент — значение типа Variant. Код символа или строковое выражение, первый символ которого используется при создании возвращаемой строки. Если аргумент имеет значение Null, возвращается значение Null. Значения аргумента, превышающие 255, преобразуются функцией String в допустимые коды символов по следующей формуле:
character Mod 256
Пример
' В данном примере функция String ' используется для генерации строк, ' содержащих указанное число ' повторяющихся символов Dim MyString MyString = String(3, "M") ' Возвращает "MMM" MyString = String(5, 65) ' Возвращает "ААААА".Возвращает 5 раз символ,код которого 65 MyString = String(6, "Русский_Проект") ' Возвращает "РРРРРР".Повторяет 6 раз первый символ исходной строки
Категория
Функции обработки строк
I need to repeat two characters(Y,N) 2^a number of times infinitely along a column in excel. So in the first column each character will repeat 2^0 = 1 and look like this:
Y
N
Y
N
The second column repeats infinitely 2^1 =2 times
Y
Y
N
N
Y
Y
N
N
and so on- I need to do this for 24 columns! Is there a simple way to do this? I think it may have to use an array formula…
brettdj
54.6k16 gold badges113 silver badges176 bronze badges
asked Jul 8, 2013 at 16:36
clattenburg cakeclattenburg cake
1,0563 gold badges18 silver badges38 bronze badges
0
In A1
=IF(MOD(TRUNC((ROW()-1)/COLUMN()),2)=0,"Y","N")
fill down and right as needed.
answered Jul 8, 2013 at 19:00
Dick KusleikaDick Kusleika
32.5k4 gold badges51 silver badges73 bronze badges
=IF(MOD(TRUNC((ROW()-1)/2^(COLUMN()-1)),2)=0,"Y","N")
answered May 7, 2019 at 19:49
You can accomplish this using the Substitute
and Repeat
functions nested together.
For example, suppose you had your original string in cell A1
(A1 = «YN»),
then in A2 moving down you have your number of times to replace (A2 = 2^0, A3 = 2^1, A4 = 2^2, … ), your formula could look as follows:
=SUBSTITUTE(SUBSTITUTE($A$1,"N",REPT("N",$A2)),"Y",REPT("Y",$A2))
And then you can just drag that formula down
Hope that makes sense
answered Jul 8, 2013 at 16:48
John BustosJohn Bustos
18.9k16 gold badges87 silver badges148 bronze badges
6
Функции Space, String и StrReverse, предназначенные в VBA Excel для создания строк из повторяющихся символов и смены порядка следования знаков.
Space – это функция, которая возвращает строку из указанного числа пробелов.
Синтаксис
Space (число)
- число – параметр, задающий количество добавляемых пробелов.
Пример
Sub Primer1() MsgBox «Десять» & Space(10) & «пробелов» End Sub |
Функция String
String – это функция, которая возвращает строку из указанного числа символов, в том числе управляющих (табуляция, перевод строки, возврат каретки).
Синтаксис
String (число, символ)
- число – параметр, задающий количество добавляемых символов;
- символ – числовой код символа (0-255) или строка, из которой извлекается первый символ.
Соответствие символов числовым кодам смотрите на сайте разработчика: кодировка (0–127) и кодировка (128–255).
Пример
Sub Primer2() MsgBox _ String(16, «кит») & vbLf & vbLf & _ String(10, 38) & String(2, 10) & _ String(14, 100) End Sub |
Обратите внимание, что запись String(2, 10)
аналогична записи vbLf & vbLf
.
Функция StrReverse
StrReverse – это функция, которая возвращает строку с обратным порядком следования знаков по сравнению с исходной строкой.
Синтаксис
StrReverse (expression)
- expression – выражение, возвращающее строку, у которой необходимо изменить порядок следования знаков.
Пример
Sub Primer3() MsgBox _ «Было: « & «кружок» & vbLf & vbLf & _ «Стало: « & StrReverse(«кружок») End Sub |
Главная » Функции VBA »
28 Апрель 2011 351429 просмотров
- ASC()— эта функция позволяет вернуть числовой код для переданного символа. Например, ASC(
"D"
) вернет 68. Эту функцию удобно использовать для того, чтобы определить следующую или предыдущую букву. Обычно она используется вместе с функцией Chr(), которая производит обратную операцию — возвращает символ по переданному его числовому коду.Варианты этой функции — AscB() и AscW():- AscB() — возвращает только первый байт числового кода для символа.
- AscW() — возвращает код для символа в кодировке Unicode
- Chr() — возвращает символ по его числовому коду. Может использоваться в паре с функцией Asc(), но чаще всего её применяют, когда нужно вывести служебный символ (например кавычки —
"
), т.к. кавычки просто так в VBA-коде не ввести(нужно ставить двойные). Я обычно именно эту функцию и использую.Dim sWord As String sWord = Chr(34) & "Слово в кавычках" & Chr(34)
Есть варианты этой функции — ChrB() и ChrW(). Работают аналогично таким же вариантам для функции Asc().
- InStr() и InStrRev()— одна из самых популярных функций. Позволяет обнаружить в теле строковой переменной символ или последовательность символов и вернуть их позицию. Если последовательность не обнаружена, то возвращается 0.
Dim sStr As String sStr = "w" If InStr(1, "Hello, World!", sStr, vbTextCompare) > 0 Then MsgBox "Искомое слово присутствует!" Else MsgBox "Искомое слово отсутствует!" End If
Разница функций в том, что InStr() ищет указанное слово от начала строки, а InStrRev() с конца строки
- Left(), Right(), Mid()— возможность взять указанное вами количество символов из существующей строковой переменной слева, справа или из середины соответственно.
Dim sStr As String sStr = "Hello, World!" MsgBox Mid(sStr, 1, 5)
- Len() — возможность получить число символов в строке. Часто используется с циклами, операциями замены и т.п.
- LCase() и UCase() — перевести строку в нижний и верхний регистры соответственно. Часто используется для подготовки значения к сравнению, когда при сравнении регистр не важен (фамилии, названия фирм, городов и т.п.).
- LSet() и RSet() — возможность заполнить одну переменную символами другой без изменения ее длины (соответственно слева и справа). Лишние символы обрезаются, на место недостающих подставляются пробелы.
- LTrim(), RTrim(), Trim() — возможность убрать пробелы соответственно слева, справа или и слева, и справа.
- Replace()— возможность заменить в строке одну последовательность символов на другую.
Dim sStr As String sStr = "Hello, World!" MsgBox Replace(sStr, "Hello", "Bay")
- Space() — получить строку из указанного вами количества пробелов;
Еще одна похожая функция — Spc(), которая используется для форматирования вывода на консоль. Она размножает пробелы с учетом ширины командной строки. - StrComp() — возможность сравнить две строки.
- StrConv() — возможность преобразовать строку (в Unicode и обратно, в верхний и нижний регистр, сделать первую букву слов заглавной и т.п.):
Dim sStr As String sStr = "Hello, World!" MsgBox StrConv("Hello, World!", vbUpperCase)
В качестве второго параметра параметра могут применяться константы:
- vbUpperCase: Преобразует все текстовые символы в ВЕРХНИЙ РЕГИСТР
- vbLowerCase: Преобразует все текстовые символы в нижний регистр
- vbProperCase: Переводит первый символ каждого слова в Верхний Регистр
- *vbWide: Преобразует символы строки из однобайтовых в двухбайтовые
- *vbNarrow: Преобразует символы строки из двухбайтовых в однобайтовые
- **vbKatakana: Преобразует символы Hiragana в символы Katakana
- **vbHiragana: Преобразует символы Katakana в символы Hiragana
- ***vbUnicode: Преобразует строку в Юникод с помощью кодовой страницы системы по умолчанию
- ***vbFromUnicode: Преобразует строку из Юникод в кодовую страницу системы по умолчанию
* применимо для локализацией Дальнего востока
** применимо только для Японии
*** не поддерживается операционными системами под управлением Macintosh - StrReverse() — «перевернуть» строку, разместив ее символы в обратном порядке. Функция работает только начиная от Excel 2000 и выше. Пример использования функции, а так же иные методы переворачивания слова можно посмотреть в этой статье: Как перевернуть слово?
- Tab() — еще одна функция, которая используется для форматирования вывода на консоль. Размножает символы табуляции в том количестве, в котором вы укажете. Если никакое количество не указано, просто вставляет символ табуляции. Для вставки символа табуляции в строковое значение можно также использовать константу vbTab.
- String() — позволяет получить строку из указанного количества символов (которые опять-таки указываются Вами). Обычно используются для форматирования вывода совместно с функцией Len().
Статья помогла? Сделай твит, поделись ссылкой с друзьями!