如何在VBA中将双引号放入字符串?

158

我想通过VBA在单元格中插入一个包含双引号的if语句。

以下是我的代码:

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

由于双引号,我在插入字符串时遇到了问题。如何处理双引号?


不是直接回答,但你确定那个字符串没问题吗?它是一个循环引用,并且没有以等号开头。 - JimmyPena
@JimmyPena 我认为那只是示例代码。无论如何,我还是提交了一份编辑。 - Farfromunique
5个回答

239

我发现最简单的方法是在引号前加上另一个引号来处理引号。

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()函数。


42
我更喜欢创建一个全局变量: Public Const vbDoubleQuote As String = """" '代表1个双引号(") Public Const vbSingleQuote As String = "'" '代表1个单引号(')并像这样使用它: Shell "explorer.exe " & vbDoubleQuote & sPath & vbDoubleQuote, vbNormalFocus - gicalle
@gicalle的回答真的很棒,它将“单引号和双引号有多少个”的混淆消除到一个定义中,可以进行文档记录。 - rolinger
1
我在所有的VBA项目中都使用了许多全局定义(当我没有选择使用其他语言时!!),这些定义了所有常见的东西,如回车、双引号等。 - rollsch
有一家公司基于ProgresDB,他们使用了chr(34)。每当他们的客户在表中的某个地方使用双引号时,他们的应用程序就无法运行任何查询了 :-) - Dominique

18

另一个变通方法是构造一个带有临时替换字符的字符串。然后,您可以使用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代码中输入公式变得非常容易。


13

字符串周围的双引号必须被加倍,例如我有一个json文件字符串:"delivery": "Standard",在VBA编辑器中,我把它改成了"""delivery"": ""Standard"",一切正常。如果你需要插入很多类似的字符串,我的建议是首先将它们全部插入到""之间,然后使用VBA编辑器将其中的"替换为""。如果出现错误,VBA编辑器会将该行显示为红色,您可以纠正此错误。


6

我编写了一个小程序,可以将单元格中的公式复制到剪贴板上,用户可以轻松地在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

这篇文章最初发布在Chandoo.org论坛的Vault板块中。


3

如果gicalle评论消失了:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接