Vba excel повторить символ

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's user avatar

brettdj

54.6k16 gold badges113 silver badges176 bronze badges

asked Jul 8, 2013 at 16:36

clattenburg cake's user avatar

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 Kusleika's user avatar

Dick KusleikaDick Kusleika

32.5k4 gold badges51 silver badges73 bronze badges

=IF(MOD(TRUNC((ROW()-1)/2^(COLUMN()-1)),2)=0,"Y","N")

Zoe stands with Ukraine's user avatar

answered May 7, 2019 at 19:49

Luisjg's user avatar

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 Bustos's user avatar

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

Демонстрация работы функции Space

Функция 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

Обратите внимание, что запись String(2, 10) аналогична записи vbLf & vbLf.

Функция StrReverse

StrReverse – это функция, которая возвращает строку с обратным порядком следования знаков по сравнению с исходной строкой.

Синтаксис

StrReverse (expression)

  • expression – выражение, возвращающее строку, у которой необходимо изменить порядок следования знаков.

Пример

Sub Primer3()

MsgBox _

«Было:  « & «кружок» & vbLf & vbLf & _

«Стало:  « & StrReverse(«кружок»)

End Sub

Демонстрация работы функции StrReverse

Главная » Функции 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().

Статья помогла? Сделай твит, поделись ссылкой с друзьями!

Понравилась статья? Поделить с друзьями:
  • Vba excel по модулю переменной
  • Vba excel по методу sort
  • Vba excel печать на одной странице
  • Vba excel печать диапазона ячеек
  • Vba excel печать в pdf