Как поставить двойные кавычки в строку в vba?


116

Я хочу вставить оператор if в ячейку через vba, который включает двойные кавычки.

Вот мой код:

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

Из-за двойных кавычек у меня возникают проблемы со вставкой строки. Как мне обрабатывать двойные кавычки?


Не прямой ответ, но уверены ли вы в этой строке? Это круговая ссылка, которая не начинается со знака равенства.
JimmyPena

@JimmyPena Думаю, это просто пример кода. Я отправляю правку, несмотря ни на что
Farfromunique

Ответы:


182

Я считаю, что самый простой способ - это удвоить кавычки, чтобы обработать цитату.

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

Некоторым нравится использовать CHR (34) *:

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

* Примечание: CHAR () используется в качестве формулы ячейки Excel, например, для записи в ячейке «= CHAR (34)», но для кода VBA вы используете функцию CHR ().


28
Я предпочитаю создавать глобальную переменную: Public Const vbDoubleQuote As String = "" "" 'представляет 1 двойную кавычку (") Public Const vbSingleQuote As String ="' "'представляет 1 одинарную кавычку (') и использует ее следующим образом: Shell" explorer.exe "& vbDoubleQuote & sPath & vbDoubleQuote, vbNormalFocus
gicalle

Ответ @gicalle действительно изящный, он сводит всю путаницу «сколько одинарных и двойных кавычек» к одному определению, где это может быть задокументировано
Rolinger

1
Я использую множество глобальных определений во всех моих проектах VBA (когда у меня нет выбора в использовании чего-то другого, кроме VBA !!), которые определяют все общие вещи, такие как возврат каретки, двойные кавычки и т. Д.
ролики

11

Другой способ - создать строку с временным замещающим символом. Затем вы можете использовать REPLACE, чтобы заменить каждый временный символ на двойные кавычки. Я использую тильду как временный замещающий символ.

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

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

На самом деле это простой трюк программирования, но он позволяет довольно легко вводить формулу в код VBA.


8

Все двойные кавычки внутри двойных кавычек, которые окружают строку, должны быть изменены вдвое. В качестве примера у меня была одна из строк файла json: "delivery": "Standard". В редакторе Vba я изменил ее на "" "delivery" ":" "Standard" "", и все работает правильно. Если вам нужно вставить много похожих строк, мое предложение сначала вставьте их все между "", затем с помощью редактора VBA замените "внутри" на "". Если вы сделаете ошибку, редактор VBA покажет эту строку красным, и вы исправите эта ошибка.


5

Я предпочитаю ответ tabSF. применяя то же самое к вашему ответу. вот мой подход

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

4

Я написал небольшую процедуру, которая копирует формулу из ячейки в буфер обмена, которую можно легко вставить в 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

Первоначально он размещен в разделе Vault на форуме Chandoo.org .

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.