Jak umieścić podwójne cudzysłowy w ciągu znaków w VBA?


116

Chcę wstawić instrukcję if w komórce za pośrednictwem VBA, która zawiera podwójne cudzysłowy.

Oto mój kod:

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

Z powodu podwójnych cudzysłowów mam problemy z wstawieniem ciągu. Jak postępować w podwójnych cudzysłowach?


Nie jest to bezpośrednia odpowiedź, ale czy jesteś pewien co do tego ciągu? To odniesienie cykliczne i nie zaczyna się od znaku równości.
JimmyPena

@JimmyPena Myślę, że to prawdopodobnie tylko przykładowy kod. Przesyłam zmianę,
mimo wszystko

Odpowiedzi:


182

Uważam, że najłatwiejszym sposobem jest podwojenie cudzysłowów, aby obsłużyć ofertę.

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

Niektórzy lubią używać CHR (34) *:

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

* Uwaga: CHAR () jest używany jako formuła komórki Excela, np. Pisząc "= ZNAK (34)" w komórce, ale dla kodu VBA używasz funkcji CHR ().


28
Wolę tworzyć zmienną globalną: Public Const vbDoubleQuote As String = "" "" 'reprezentuje 1 podwójny cudzysłów (") Public Const vbSingleQuote As String ="' "'reprezentuje 1 pojedynczy cudzysłów (') i używa go w ten sposób: Shell" explorer.exe "& vbDoubleQuote & sPath & vbDoubleQuote, vbNormalFocus
gicalle

Odpowiedź @gicalle jest naprawdę zgrabna, przenosi całe zamieszanie związane z `` iloma pojedynczymi i podwójnymi cudzysłowami '' do jednej definicji, w której można to udokumentować
rolinger

1
Używam wiele globalnych określa w wszystkich moich projektów VBA (gdy nie mam wyboru w użyciu coś innego niż VBA !!), które definiują wszystkie wspólne rzeczy jak powrót karetki, cudzysłowy itp
rolek

11

Innym obejściem jest utworzenie łańcucha z tymczasowym znakiem zastępczym. Następnie możesz użyć polecenia REPLACE, aby zmienić każdy znak tymczasowy na podwójny cudzysłów. Używam tyldy jako tymczasowego znaku zastępczego.

Oto przykład z projektu, nad którym pracowałem. Jest to mały program narzędziowy służący do naprawy bardzo skomplikowanej formuły, jeśli / kiedy komórka zostanie przypadkowo nadepnięta. Wejście do komórki jest trudnym wzorem, ale to małe narzędzie natychmiast to naprawia.

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

To naprawdę prosta sztuczka programistyczna, ale sprawia, że ​​wprowadzanie formuły do ​​kodu VBA jest całkiem łatwe.


8

Wszystkie podwójne cudzysłowy w cudzysłowie, które otaczają ciąg, należy zmienić dwukrotnie. Jako przykład miałem jeden z ciągów plików json: "delivery": "Standard", w edytorze VBA zmieniłem go na "" "delivery" ":" "Standard" "," i wszystko działa poprawnie. Jeśli musisz wstawić wiele podobnych ciągów, najpierw moja propozycja wstaw je wszystkie między "", a następnie za pomocą edytora VBA zamień "wewnątrz na" ". Jeśli popełnisz błąd, edytor VBA pokaże tę linię na czerwono i poprawisz ten błąd.


5

Wolę odpowiedź tabSF. wdrażając to samo do swojej odpowiedzi. poniżej jest moje podejście

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

4

Napisałem małą procedurę, która kopiuje formułę z komórki do schowka, którą można łatwo wkleić w Edytorze 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) & 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

Został pierwotnie opublikowany w sekcji Vault for Chandoo.org .

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.