Excel vba экранирование кавычек

Двойные кавычки и кавычки «ёлочки» в коде VBA Excel. Коды символов кавычек и ввод кавычек «ёлочек» в редакторе VBA Excel с клавиатуры. Примеры.

Двойные кавычки

Двойные прямые кавычки ("Весна") обычно называют просто «двойные кавычки» или «прямые кавычки», так как в текстах они встречаются намного чаще одинарных прямых кавычек ('Весна').

В VBA Excel прямые кавычки являются специальными символами, обозначающими текст:

x = «Магазин Весна открыт»

Переменной x присваивается строка (текст): Магазин Весна открыт.

Если мы хотим отобразить эту строку со словом "Весна" в двойных кавычках, необходимо слово в прямых кавычках экранировать еще одной парой двойных кавычек (""Весна"") или использовать функцию Chr, возвращающую символ по его числовому коду. Числовой код прямых кавычек — 34.

Пример добавления двойных прямых кавычек внутри текста из кода VBA Excel:

Sub Primer1()

Dim x As String

    x = «Магазин ««Весна»» открыт»

    Debug.Print x  ‘Магазин «Весна» открыт

    x = «Магазин « & Chr(34) & «Весна» & Chr(34) & » открыт»

    Debug.Print x  ‘Магазин «Весна» открыт

End Sub

Кавычки «ёлочки»

Двойные кавычки «ёлочки» обычно называют просто кавычки «ёлочки», так как одинарные ‹ёлочки› встречаются очень редко.

Двойные кавычки «ёлочки» не являются спецсимволами, поэтому в строках внутри процедур VBA Excel их можно использовать не только через функцию Chr по числовому коду символа, но и ввести с клавиатуры.

Ввод «ёлочек» с клавиатуры в редакторе VBA Excel осуществляется также с помощью числовых кодов символов открывающей и закрывающей кавычек:

  • числовой код открывающей кавычки («) — 171;
  • числовой код закрывающей кавычки (») — 187.

Сочетания клавиш для ввода «ёлочек» с клавиатуры:

  • Alt+0171 — ввод открывающей кавычки («);
  • Alt+0187 — ввод закрывающей кавычки (»).

Обратите внимание, что для ввода «ёлочек» с клавиатуры используется левая клавиша Alt, а числовой код набирается на цифровом блоке справа.

Пример добавления двойных кавычек «ёлочки» внутри текста из кода VBA Excel:

Sub Primer2()

Dim x As String

    x = «Магазин «Весна» открыт»

    Debug.Print x  ‘Магазин «Весна» открыт

    x = «Магазин « & Chr(171) & «Весна» & Chr(187) & » открыт»

    Debug.Print x  ‘Магазин «Весна» открыт

End Sub


I want to insert an if statement in a cell through vba which includes double quotes.

Here is my code:

Worksheets("Sheet1").Range("A1").Value = "=IF(Sheet1!B1=0,"",Sheet1!B1)"

Due to double quotes I am having issues with inserting the string. How do I handle double quotes?

Andrei Konstantinov's user avatar

asked Jan 26, 2012 at 20:18

user793468's user avatar

user793468user793468

4,87823 gold badges80 silver badges126 bronze badges

2

I find the easiest way is to double up on the quotes to handle a quote.

Worksheets("Sheet1").Range("A1").Formula = "IF(Sheet1!A1=0,"""",Sheet1!A1)" 

Some people like to use CHR(34)*:

Worksheets("Sheet1").Range("A1").Formula = "IF(Sheet1!A1=0," & CHR(34) & CHR(34) & ",Sheet1!A1)" 

*Note: CHAR() is used as an Excel cell formula, e.g. writing «=CHAR(34)» in a cell, but for VBA code you use the CHR() function.

thomas's user avatar

answered Jan 26, 2012 at 20:21

Brain2000's user avatar

3

Another work-around is to construct a string with a temporary substitute character. Then you can use REPLACE to change each temp character to the double quote. I use tilde as the temporary substitute character.

Here is an example from a project I have been working on. This is a little utility routine to repair a very complicated formula if/when the cell gets stepped on accidentally. It is a difficult formula to enter into a cell, but this little utility fixes it instantly.

Sub RepairFormula()
Dim FormulaString As String

FormulaString = "=MID(CELL(~filename~,$A$1),FIND(~[~,CELL(~filename~,$A$1))+1,FIND(~]~, CELL(~filename~,$A$1))-FIND(~[~,CELL(~filename~,$A$1))-1)"
FormulaString = Replace(FormulaString, Chr(126), Chr(34)) 'this replaces every instance of the tilde with a double quote.
Range("WorkbookFileName").Formula = FormulaString

This is really just a simple programming trick, but it makes entering the formula in your VBA code pretty easy.

answered Feb 24, 2017 at 19:11

D Zeller's user avatar

D ZellerD Zeller

1811 silver badge2 bronze badges

All double quotes inside double quotes which suround the string must be changed doubled. As example I had one of json file strings : «delivery»: «Standard»,
In Vba Editor I changed it into «»»delivery»»: «»Standard»»,» and everythig works correctly. If you have to insert a lot of similar strings, my proposal first, insert them all between «» , then with VBA editor replace » inside into «». If you will do mistake, VBA editor shows this line in red and you will correct this error.

answered Jul 19, 2016 at 11:08

Sharunas Bielskis's user avatar

I have written a small routine which copies formula from a cell to clipboard which one can easily paste in Visual Basic Editor.

    Public Sub CopyExcelFormulaInVBAFormat()
        Dim strFormula As String
        Dim objDataObj As Object

        'Check that single cell is selected!
       If Selection.Cells.Count > 1 Then
            MsgBox "Select single cell only!", vbCritical
            Exit Sub
        End If

        'Check if we are not on a blank cell!
       If Len(ActiveCell.Formula) = 0 Then
            MsgBox "No Formula To Copy!", vbCritical
            Exit Sub
        End If

        'Add quotes as required in VBE
       strFormula = Chr(34) & Replace(ActiveCell.Formula, Chr(34), Chr(34) & Chr(34)) & Chr(34)

        'This is ClsID of MSFORMS Data Object
       Set objDataObj = CreateObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
        objDataObj.SetText strFormula, 1
        objDataObj.PutInClipboard
        MsgBox "VBA Format formula copied to Clipboard!", vbInformation

        Set objDataObj = Nothing

    End Sub

It is originally posted on Chandoo.org forums’ Vault Section.

answered Oct 20, 2017 at 4:53

shrivallabha.redij's user avatar

In case the comment by gicalle ever dies:

I prefer creating a global variable:

Public Const vbDoubleQuote As String = """" 'represents 1 double quote (")
Public Const vbSingleQuote As String = "'" 'represents 1 single quote (') 

and using it like so:

Shell "explorer.exe " & vbDoubleQuote & sPath & vbDoubleQuote, vbNormalFocus

I have a formula in each cell in excel where I need to edit. But I am having a hard time escaping the single quotes and double quotes using VBA code.

This is an example:

=+'F-222Alloc'!N2516+'F-222Alloc'!N2526

I need it to look like this

=+INDIRECT("'"&N14&"'!N2511")+INDIRECT("'"&N14&"'!N2526")

How do I use the REPLACE function properly?

ashleedawg's user avatar

ashleedawg

20k8 gold badges73 silver badges104 bronze badges

asked Jul 2, 2013 at 16:32

Charles Bernardes's user avatar

1

I find the easiest is to define a variable that contains just the double quote — then use it like any other string. Makes the code much more readable. Example:

Dim dq As String, sq as string
dq = Chr(34) ' double quote as a variable
sq = Chr(39) ' apostrophe or single quote as variable
Dim sourceString As String
sourceString = "hello"
msgbox sq + sourceString + "! " + dq + "you" + dq + sq

With these two variables you can create any string you want — after that, replacing what you want with something else (that might contain a crazy sequence of "'"'"'"("!"'") for all I care) becomes trivial.

Some helpful rules can be found in this article

answered Jul 2, 2013 at 16:57

Floris's user avatar

0

замечания

Назначение строковых литералов в VBA ограничено ограничениями IDE и кодовой страницы настроек языка текущего пользователя. В приведенных выше примерах показаны особые случаи экранированных строк, специальных, непечатаемых строк и длинных строковых литералов.

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

Выход из символа

Синтаксис VBA требует, чтобы строковый литерал отображался внутри " меток», поэтому, когда ваша строка должна содержать кавычки, вам нужно будет избежать / добавить " символ с дополнительным " чтобы VBA понимал, что вы намерены "" интерпретируется как " строка».

'The following 2 lines produce the same output
Debug.Print "The man said, ""Never use air-quotes"""
Debug.Print "The man said, " & """" & "Never use air-quotes" & """"

'Output:
'The man said, "Never use air-quotes"
'The man said, "Never use air-quotes"

Присвоение длинных строковых литералов

Редактор VBA разрешает только 1023 символа в строке, но обычно только первые 100-150 символов видны без прокрутки. Если вам нужно назначить длинные строковые литералы, но вы хотите, чтобы ваш код читался, вам нужно будет использовать продолжение строки и конкатенацию для назначения вашей строки.

Debug.Print "Lorem ipsum dolor sit amet, consectetur adipiscing elit. " & _
            "Integer hendrerit maximus arcu, ut elementum odio varius " & _
            "nec. Integer ipsum enim, iaculis et egestas ac, condiment" & _
            "um ut tellus."
'Output:
'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer hendrerit maximus arcu, ut elementum odio varius nec. Integer ipsum enim, iaculis et egestas ac, condimentum ut tellus.

VBA позволит вам использовать ограниченное количество строк (фактическое число зависит от длины каждой строки в непрерывном блоке), поэтому, если у вас очень длинные строки, вам необходимо назначить и повторно назначить с помощью конкатенации ,

Dim loremIpsum As String

'Assign the first part of the string
loremIpsum = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. " & _
              "Integer hendrerit maximus arcu, ut elementum odio varius "
'Re-assign with the previous value AND the next section of the string
loremIpsum = loremIpsum & _
            "nec. Integer ipsum enim, iaculis et egestas ac, condiment" & _
            "um ut tellus."

Debug.Print loremIpsum

'Output:
'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer hendrerit maximus arcu, ut elementum odio varius nec. Integer ipsum enim, iaculis et egestas ac, condimentum ut tellus.

VBA определяет ряд строковых констант для специальных символов, таких как:

  • vbCr: Carriage-Return ‘То же, что и » r» в языках стиля C.
  • vbLf: Line-Feed ‘То же, что и » n» в языках стиля C.
  • vbCrLf: Carriage-Return & Line-Feed (новая строка в Windows)
  • vbTab: символ табуляции
  • vbNullString: пустая строка, например «»

Вы можете использовать эти константы с конкатенацией и другими строковыми функциями для создания строковых литералов со специальными символами.

Debug.Print "Hello " & vbCrLf & "World"
'Output:
'Hello
'World

Debug.Print vbTab & "Hello" & vbTab & "World"
'Output:
'    Hello    World

Dim EmptyString As String
EmptyString = vbNullString
Debug.Print EmptyString = ""
'Output:
'True

Использование vbNullString считается лучшей практикой, чем эквивалентное значение "" из-за различий в том, как компилируется код. Доступ к vbNullString осуществляется с помощью указателя на выделенную область памяти, а компилятор VBA достаточно умен, чтобы использовать нулевой указатель для представления vbNullString . Литерал "" выделяется память, как если бы это был вариант с типизированным строком, что делает использование константы намного более эффективным:

Debug.Print StrPtr(vbNullString)    'Prints 0.
Debug.Print StrPtr("")              'Prints a memory address.
 

Cryphon

Пользователь

Сообщений: 12
Регистрация: 31.05.2020

#1

07.10.2020 08:53:20

Всем доброго дня! Поиском пользовался, но в разрезе vba не смог найти ответ на свой вопрос. Визуально ситуацию отобразил во вложении.

Подскажите, пожалуйста, как правильно прописать код, чтобы убрать двойные кавычки в конце строки?

Код
If CheckBox1.value = False Then
        If TextBox7.value = "" Then
            Label14 = Abr
        Else
            Label14 = Abr & " """ & TextBox7.value & """"
        End If
    Else
    Label14 = Abr & " """ & TextBox22.value & """"
    End If

Прикрепленные файлы

  • Пример1.png (12.37 КБ)

 

Cryphon, и каков должен быть результат?
Форму для проверки вы нам самим предлагаете нарисовать?

 

Cryphon

Пользователь

Сообщений: 12
Регистрация: 31.05.2020

Михаил Витальевич С., исправляюсь

Вводная: есть организации, где полное наименование записано в дополнительных кавычках, как это указано на картинке в первом сообщении. Можно, конечно, просто не дописывать эту кавычку в конце, но тут уже больше спортивный интерес и пополнение знаний. Во вложении необходимый кусок формы

Форма нужна для автозаполнения договоров, поэтому и краткий, и полный вариант наименований задействованы.

Прикрепленные файлы

  • Пример.docm (19.93 КБ)

Изменено: Cryphon07.10.2020 13:11:41

 

Юрий М

Модератор

Сообщений: 60570
Регистрация: 14.09.2012

Контакты см. в профиле

#4

07.10.2020 13:11:09

В общем случае это выглядит так:

Код
Sub qqq()
Dim OldText As String, NewText As String
    OldText = "Мой текст"
    MsgBox OldText
    NewText = """" & OldText & """"
    MsgBox NewText
End Sub

А можно схитрить: писать два апострофа подряд )

 

Nordheim

Пользователь

Сообщений: 3154
Регистрация: 18.04.2017

#5

07.10.2020 13:30:38

Cryphon, А для чего прикладывать файл word, форма в котором не активируется?
По вопросу, можно таким методом воспользоваться

Код
Sub qqq()
    Dim OldText As String, NewText As String
    OldText = "Мой текст"
    MsgBox OldText
    NewText = Chr(34) & OldText & Chr(34)
    MsgBox NewText
End Sub

Изменено: Nordheim07.10.2020 13:32:40

«Все гениальное просто, а все простое гениально!!!»

 

Cryphon

Пользователь

Сообщений: 12
Регистрация: 31.05.2020

Юрий М, я заметил, что, видимо, неверно описал ситуацию: в Label, при вводе в Textbox «полное наименование» текста с кавычками, подставляется вторая кавычка в конце строки. По поводу Вашего примера — это да, согласен, но тут идея в том, что если в конце TextBox’а уже есть кавычка, то хотелось бы, чтобы в Label вставала кавычка только в начале. Таким образом вопрос: как правильно vba донести, что в случае если в текстбоксе последний символ кавычка, то в Label пишем просто «»»» & OldText. Надеюсь, описал понятно

 

Cryphon

Пользователь

Сообщений: 12
Регистрация: 31.05.2020

#7

07.10.2020 13:44:17

Цитата
Nordheim написал:
А для чего прикладывать файл word, форма в котором не активируется?

На всякий случай прописал верную инициализацию

Прикрепленные файлы

  • Пример.docm (24.2 КБ)

 

Михаил Витальевич С.

Пользователь

Сообщений: 10514
Регистрация: 21.12.2012

#8

07.10.2020 13:52:15

В общем, методом тыка:

Код
Private Sub TextBox22_Change()
    If CheckBox1.value = True Then
        If TextBox22.value = "" Then
            Label14 = Abr
        Else
            Label14 = Abr & " """ & Replace(TextBox22.value, Chr(34), "") & """"
        End If
    Else
    Label14 = Abr & " """ & Replace(TextBox22.value, Chr(34), "") & """"
    End If
End Sub
 

Cryphon

Пользователь

Сообщений: 12
Регистрация: 31.05.2020

#9

07.10.2020 14:03:11

Всем спасибо, сам себе и ответил =))
Сработало в таком виде:

Код
        If TextBox22.value = "" Then
            Label14 = Abr
        ElseIf Right(TextBox22.value, 1) = Chr(34) Then
            Label14 = Abr & " """ & TextBox22.value
        Else
            Label14 = Abr & " """ & TextBox22.value & """"
        End If

Изменено: Cryphon07.10.2020 14:04:24

 

Юрий М

Модератор

Сообщений: 60570
Регистрация: 14.09.2012

Контакты см. в профиле

Только сейчас заметил — а почему мы обсуждаем Word?

 

Cryphon

Пользователь

Сообщений: 12
Регистрация: 31.05.2020

Юрий М, Прошу прощения, сам только сейчас понял, что зашел по привычке в ветку эксель. Если есть возможность, перенесите, пожалуйста

 

Михаил Витальевич С.

Пользователь

Сообщений: 10514
Регистрация: 21.12.2012

#12

07.10.2020 14:10:27

Цитата
Cryphon написал:
убирает обе кавычки, а надо последнюю.

ну, в общем-то, по правилам русского языка, правильно либо «Группа компаний «Группа СТД»» либо «Группа компаний Группа СТД», а «Группа компаний «Группа СТД» неправильно…

 

Ігор Гончаренко

Пользователь

Сообщений: 13746
Регистрация: 01.01.1970

#13

07.10.2020 14:35:03

зачем ставить лишние кавычки чтобы потом их убирать?
не ставьте — не нужно будет убирать

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

Понравилась статья? Поделить с друзьями:
  • Excel vba ширина ячеек
  • Excel vba ширина строки
  • Excel vba шаблоны word
  • Excel vba что такое value
  • Excel vba что такое rows count