Làm cách nào để đặt dấu ngoặc kép trong một chuỗi trong vba?


116

Tôi muốn chèn một câu lệnh if vào một ô thông qua vba bao gồm dấu ngoặc kép.

Đây là mã của tôi:

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

Do dấu ngoặc kép, tôi đang gặp vấn đề với việc chèn chuỗi. Làm cách nào để xử lý dấu ngoặc kép?


Không phải là một câu trả lời trực tiếp, nhưng bạn có chắc chắn về chuỗi đó không? Đó là một tham chiếu hình tròn và không bắt đầu bằng dấu bằng.
JimmyPena

@JimmyPena Tôi nghĩ đó có thể chỉ là mã ví dụ. Tôi đang gửi một bản chỉnh sửa, bất kể
Farfromunique

Câu trả lời:


182

Tôi thấy cách dễ nhất là tăng gấp đôi các dấu ngoặc kép để xử lý một câu trích dẫn.

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

Một số người thích sử dụng CHR (34) *:

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

* Lưu ý: CHAR () được sử dụng như một công thức ô Excel, ví dụ: viết "= CHAR (34)" trong một ô, nhưng đối với mã VBA, bạn sử dụng hàm CHR ().


28
Tôi thích tạo một biến toàn cục: Public Const vbDoubleQuote As String = "" "" 'đại diện cho 1 dấu ngoặc kép (") Public Const vbSingleQuote As String ="' "'đại diện cho 1 dấu nháy đơn (') và sử dụng nó như sau: Shell" explorer.exe "& vbDoubleQuote & sPath & vbDoubleQuote, vbNormalFocus
gicalle

Câu trả lời của @gicalle thực sự rất gọn gàng, tất cả sự nhầm lẫn của 'có bao nhiêu dấu ngoặc kép đơn và dấu ngoặc kép' thành một định nghĩa mà nó có thể được ghi lại
rolinger

1
Tôi sử dụng rất nhiều định nghĩa toàn cục trong tất cả các dự án VBA của mình (khi tôi không có lựa chọn nào khác trong việc sử dụng thứ gì đó ngoài VBA !!) xác định tất cả những thứ phổ biến như ký tự xuống dòng, dấu ngoặc kép, v.v.
roll

11

Một công việc khác là xây dựng một chuỗi với một ký tự thay thế tạm thời. Sau đó, bạn có thể sử dụng REPLACE để thay đổi từng ký tự tạm thời thành dấu ngoặc kép. Tôi sử dụng dấu ngã làm ký tự thay thế tạm thời.

Đây là một ví dụ từ một dự án mà tôi đã và đang thực hiện. Đây là một thủ tục tiện ích nhỏ để sửa chữa một công thức rất phức tạp nếu / khi ô vô tình bị dẫm lên. Đây là một công thức khó để nhập vào một ô, nhưng tiện ích nhỏ này sẽ sửa nó ngay lập tức.

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

Đây thực sự chỉ là một thủ thuật lập trình đơn giản, nhưng nó giúp nhập công thức trong mã VBA của bạn khá dễ dàng.


8

Tất cả các dấu ngoặc kép bên trong dấu ngoặc kép bao quanh chuỗi phải được thay đổi nhân đôi. Ví dụ, tôi có một trong các chuỗi tệp json: "delivery": "Standard", Trong Vba Editor, tôi đã thay đổi nó thành "" "delivery" ":" "Standard" "" và everythig hoạt động chính xác. Nếu bạn phải chèn nhiều chuỗi tương tự, đề xuất của tôi trước tiên, hãy chèn tất cả chúng vào giữa "", sau đó với trình chỉnh sửa VBA thay thế "bên trong thành" ". Nếu bạn nhầm lẫn, trình chỉnh sửa VBA hiển thị dòng này màu đỏ và bạn sẽ sửa lỗi này.


5

Tôi thích câu trả lời của tabSF hơn. triển khai tương tự cho câu trả lời của bạn. đây là cách tiếp cận của tôi

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

4

Tôi đã viết một quy trình nhỏ sao chép công thức từ một ô vào khay nhớ tạm mà người ta có thể dễ dàng dán vào 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

Ban đầu nó được đăng trên Phần Vault của diễn đàn Chandoo.org .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.