ฉันจะใส่เครื่องหมายคำพูดคู่ในสตริงใน vba ได้อย่างไร


116

ฉันต้องการแทรกคำสั่ง if ในเซลล์ผ่าน vba ซึ่งมีเครื่องหมายคำพูดคู่

นี่คือรหัสของฉัน:

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

เนื่องจากอัญประกาศคู่ฉันมีปัญหากับการแทรกสตริง ฉันจะจัดการกับเครื่องหมายคำพูดคู่ได้อย่างไร


ไม่ใช่คำตอบโดยตรง แต่คุณแน่ใจเกี่ยวกับสตริงนั้นหรือไม่? เป็นการอ้างอิงแบบวงกลมและไม่ได้ขึ้นต้นด้วยเครื่องหมายเท่ากับ
JimmyPena

@JimmyPena ฉันคิดว่านั่นอาจเป็นแค่โค้ดตัวอย่าง ฉันกำลังส่งการแก้ไขโดยไม่คำนึงถึง
Farfromunique

คำตอบ:


182

ฉันพบวิธีที่ง่ายที่สุดคือการเพิ่มเครื่องหมายคำพูดเป็นสองเท่าเพื่อจัดการกับใบเสนอราคา

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 ()


28
ฉันชอบสร้างตัวแปรส่วนกลาง: Public Const vbDoubleQuote As String = "" "" 'แทน 1 double quote (") Public Const vbSingleQuote As String ="' "'แทน 1 single quote (') และใช้ดังนี้: Shell" explorer.exe "& vbDoubleQuote & sPath & vbDoubleQuote, vbNormalFocus
gicalle

คำตอบของ @gicalle นั้นเรียบร้อยจริงๆมันทำให้ความสับสนของ 'คำพูดเดี่ยวและคู่จำนวนเท่าใด' ออกไปสู่คำจำกัดความเดียวที่สามารถบันทึกได้
rolinger

1
ฉันใช้คำจำกัดความทั่วโลกจำนวนมากในโครงการ VBA ทั้งหมดของฉัน (เมื่อฉันไม่มีทางเลือกในการใช้อย่างอื่นนอกจาก VBA !!) ที่กำหนดสิ่งทั่วไปทั้งหมดเช่นการคืนค่าขนส่งเครื่องหมายอัญประกาศคู่ ฯลฯ
ม้วน

11

วิธีแก้ไขอีกประการหนึ่งคือการสร้างสตริงที่มีอักขระทดแทนชั่วคราว จากนั้นคุณสามารถใช้ REPLACE เพื่อเปลี่ยนอักขระ temp แต่ละตัวเป็นเครื่องหมายคำพูดคู่ ฉันใช้เครื่องหมายทิลเดเป็นอักขระแทนชั่วคราว

นี่คือตัวอย่างจากโครงการที่ฉันกำลังดำเนินการอยู่ นี่เป็นรูทีนยูทิลิตี้เล็กน้อยในการซ่อมแซมสูตรที่ซับซ้อนมากหาก / เมื่อเซลล์ถูกเหยียบโดยไม่ได้ตั้งใจ มันเป็นสูตรที่ยากในการเข้าไปในเซลล์ แต่ยูทิลิตี้เล็ก ๆ นี้แก้ไขได้ทันที

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 ของคุณค่อนข้างง่าย


8

เครื่องหมายคำพูดคู่ทั้งหมดภายในเครื่องหมายคำพูดคู่ซึ่งเกินกว่าสตริงจะต้องเปลี่ยนเป็นสองเท่า ตัวอย่างเช่นฉันมีสตริงไฟล์ json: "delivery": "Standard" ใน Vba Editor ฉันเปลี่ยนเป็น "" "delivery" ":" "Standard" "" และ everythig ทำงานได้อย่างถูกต้อง หากคุณต้องแทรกสตริงที่คล้ายกันจำนวนมากข้อเสนอของฉันก่อนอื่นให้แทรกทั้งหมดระหว่าง "" จากนั้นใช้ตัวแก้ไข VBA แทนที่ "inside into" "หากคุณทำผิดตัวแก้ไข VBA จะแสดงบรรทัดนี้เป็นสีแดงและคุณจะแก้ไข ข้อผิดพลาดนี้


5

ฉันชอบคำตอบของ tabSF มากกว่า ใช้สิ่งเดียวกันกับคำตอบของคุณ ด้านล่างนี้คือแนวทางของฉัน

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

4

ฉันได้เขียนกิจวัตรเล็ก ๆ ที่คัดลอกสูตรจากเซลล์ไปยังคลิปบอร์ดซึ่งสามารถวางใน 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

มีการโพสต์ครั้งแรกในส่วนห้องนิรภัยของฟอรัม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.