#excel #vba #compiler-errors
#преуспеть #vba #двойные кавычки
Вопрос:
Я хочу вставить оператор 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 Как String = «»»» ‘представляет 1 двойную кавычку («) Public Const vbSingleQuote Как String = «»» ‘представляет 1 одинарную кавычку (‘) и использовать ее следующим образом: Shell «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: «delivery»: «Standard», в редакторе Vba я изменил ее на «delivery»: «Standard»», и все работает правильно. Если вам нужно вставить много похожих строк, мое предложение сначала вставить их все между «» , а затем с помощью редактора 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 Раздел хранилища форумов.