Comment mettre des guillemets doubles dans une chaîne dans vba?

116

Je veux insérer une instruction if dans une cellule via vba qui comprend des guillemets doubles.

Voici mon code:

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

En raison de doubles guillemets, je rencontre des problèmes pour insérer la chaîne. Comment gérer les guillemets doubles?

user793468
la source
Pas une réponse directe, mais êtes-vous sûr de cette chaîne? C'est une référence circulaire et ne commence pas par un signe égal.
JimmyPena
@JimmyPena Je pense que ce n'est probablement qu'un exemple de code. Je soumets une modification, peu importe
Farfromunique

Réponses:

182

Je trouve que le moyen le plus simple est de doubler les devis pour gérer un devis.

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

Certaines personnes aiment utiliser CHR (34) *:

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

* Remarque: CHAR () est utilisé comme formule de cellule Excel, par exemple en écrivant "= CHAR (34)" dans une cellule, mais pour le code VBA, vous utilisez la fonction CHR ().

Brain2000
la source
28
Je préfère créer une variable globale: Public Const vbDoubleQuote As String = "" "" 'représente 1 guillemet double (") Public Const vbSingleQuote As String ="' "'représente 1 guillemet simple (') et l'utilise comme ceci: Shell" explorer.exe "& vbDoubleQuote & sPath & vbDoubleQuote, vbNormalFocus
gicalle
La réponse de @gicalle est vraiment chouette, elle prend toute la confusion du `` combien de guillemets simples et doubles '' à une définition où elle peut être documentée
rolinger
1
J'utilise beaucoup de définitions globales dans tous mes projets VBA (quand je n'ai pas le choix d'utiliser autre chose que VBA !!) qui définissent toutes les choses courantes comme le retour chariot, les guillemets, etc.
lance
11

Une autre solution consiste à créer une chaîne avec un caractère de substitution temporaire. Ensuite, vous pouvez utiliser REPLACE pour changer chaque caractère temporaire en guillemets doubles. J'utilise le tilde comme caractère de remplacement temporaire.

Voici un exemple d'un projet sur lequel j'ai travaillé. Il s'agit d'une petite routine utilitaire pour réparer une formule très compliquée si / quand la cellule est piétinée accidentellement. C'est une formule difficile à entrer dans une cellule, mais ce petit utilitaire la corrige instantanément.

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

Ce n'est vraiment qu'une simple astuce de programmation, mais cela facilite la saisie de la formule dans votre code VBA.

D Zeller
la source
8

Tous les guillemets entre guillemets doubles qui entourent la chaîne doivent être modifiés en double. Par exemple, j'avais une des chaînes de fichier json: "delivery": "Standard", dans Vba Editor je l'ai changé en "" "delivery" ":" "Standard" "," et tout fonctionne correctement. Si vous devez insérer beaucoup de chaînes similaires, ma proposition d'abord, insérez-les toutes entre "", puis avec l'éditeur VBA remplacez "inside into" ". Si vous faites une erreur, l'éditeur VBA affiche cette ligne en rouge et vous corrigerez cette erreur.

Sharunas Bielskis
la source
5

Je préfère la réponse de tabSF. mettre en œuvre la même chose à votre réponse. voici mon approche

Worksheets("Sheet1").Range("A1").Value = "=IF(Sheet1!A1=0," & CHR(34) & CHR(34) & ",Sheet1!A1)"
Jobin Lopez
la source
4

J'ai écrit une petite routine qui copie la formule d'une cellule dans le presse-papiers que l'on peut facilement coller dans 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

Il est initialement publié sur la section Vault des forums Chandoo.org .

shrivallabha.redij
la source