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

#excel #vba #formula

Вопрос:

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

Вот мой код:

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

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

Комментарии:

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

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

Ответ №1:

Я нахожу, что самый простой способ-удвоить котировки, чтобы обработать котировку.

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

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

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

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

Комментарии:

1. Я предпочитаю создавать глобальную переменную: Public Const vbDoubleQuote В виде строки = «»»» ‘представляет 1 двойную кавычку («) Public Const vbSingleQuote в виде строки = «»»» представляет 1 одинарную кавычку («) и использовать ее следующим образом: Оболочка «explorer.exe» amp; vbDoubleQuote amp; sPath amp; vbDoubleQuote, vbNormalFocus

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

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

Ответ №2:

Другой обходной путь заключается в построении строки с временным символом-заменителем. Затем вы можете использовать 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 довольно простым.

Ответ №3:

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

Ответ №4:

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

     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) amp; Replace(ActiveCell.Formula, Chr(34), Chr(34) amp; Chr(34)) amp; 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
 

Первоначально он был опубликован на Chandoo.org Раздел Хранилища форумов.