ฉันจะแปลงจำนวนเต็มเป็นสตริงใน Excel VBA ได้อย่างไร


คำตอบ:


262

CStr(45) คือทุกสิ่งที่คุณต้องการ (ฟังก์ชั่นแปลงสตริง)


1
CStr(45)เพื่อความแม่นยำ
Kouichi C. Nakamura

สิ่งนี้จะไม่ทำงานสำหรับ e + หมายเลขที่แปลงแล้ว! เช่น 7.7685099559e + 11 จะแสดงเป็น "7.7685099559e + 11" ไม่เป็นไปตามที่คาดไว้: "776850995590" ดังนั้นฉันค่อนข้างจะบอกว่านี่จะเป็นแบบทั่วไปมากกว่า:CStr(CDbl(***))
Mahhdy

อาจตอบสนองความต้องการของคำถาม แต่ก็ยังไม่สมบูรณ์และไม่เพียงพอในบางสถานการณ์ บ่อยครั้ง (เช่นการตั้งชื่อแฟ้มวัตถุประสงค์) ตัวเลขที่คุณอาจต้องการที่จะสร้างศูนย์นำหน้าเช่นว่าจะกลายเป็น7 007คุณอาจต้องการระบุจำนวนทศนิยมหรือรวมตัวคั่นหลักพัน หากรายละเอียดเหล่านี้มีความสำคัญต่อคุณ: excelfunctions.net/vba-format-function.html
cartbeforehorse


51

เวลาส่วนใหญ่คุณไม่จำเป็นต้อง "แปลง"; VBA จะทำแปลงชนิดปลอดภัยโดยปริยายสำหรับคุณโดยไม่ต้องCStrใช้ตัวแปลงเช่น

โค้ดด้านล่างใช้งานได้โดยไม่มีปัญหาใด ๆ เนื่องจากตัวแปรเป็นประเภทสตริงและการแปลงประเภทโดยนัยจะทำเพื่อคุณโดยอัตโนมัติ!

Dim myVal As String
Dim myNum As Integer

myVal = "My number is: "
myVal = myVal & myNum

ผลลัพธ์:

"หมายเลขของฉันคือ: 0"

คุณไม่จำเป็นต้องได้รับสิ่งแฟนซีสิ่งนี้เช่นกัน:

Dim myString as String
myString = 77

"77"

ครั้งเดียวที่คุณจะต้องแปลงคือเมื่อตัวแปรชนิดไม่ชัดเจน (เช่นประเภทตัวแปรหรือเซลล์Value(ซึ่งเป็นตัวแปร))

แม้ว่าคุณจะไม่ต้องใช้CStrฟังก์ชั่นหากคุณกำลังทบต้นด้วยตัวแปร String อื่นหรือค่าคงที่ แบบนี้:

Sheet1.Range("A1").Value = "My favorite number is " & 7

"หมายเลขโปรดของฉันคือ 7"

ดังนั้นกรณีที่หายากเพียงอย่างเดียวคือเมื่อคุณต้องการเก็บค่าจำนวนเต็มลงในตัวแปรหรือค่าเซลล์เมื่อไม่รวมกับสตริงอื่น (ซึ่งเป็นกรณีที่ค่อนข้างหายากฉันอาจเพิ่ม):

Dim i as Integer
i = 7
Sheet1.Range("A1").Value = i

7

Dim i as Integer
i = 7
Sheet1.Range("A1").Value = CStr(i)

"7"


2
ฉันไม่เข้าใจว่าทำไมคำตอบนี้ไม่ได้รับการโหวตมากขึ้นเพราะมันเป็นความจริง เป็นที่น่าสังเกตว่าการแปลงประเภทไม่ได้ดำเนินการเสมอไปขึ้นอยู่กับผู้ให้บริการที่ใช้อยู่ ตัวอย่างเช่นการดำเนินการ + จะไม่ขยายจำนวนเต็มไปยังสตริงเสมอ
Mark Ch

1
@ MarkCh ฉันรู้ว่านี่เก่า แต่ ... อาจเป็นเพราะการแปลงโดยนัยที่น่ารังเกียจและการเรียกสมาชิกเริ่มต้นของ VBA เป็นสิ่งที่ทำให้รหัส VBA อ่อนแอมากน่าแปลกใจและมีแนวโน้มที่ผิดพลาด? จะไม่มีคำถามครึ่ง VBA มากมายใน SO หากไม่ใช่การแปลงโดยปริยายการเข้าถึงโดยปริยายการเข้าถึงสมาชิกเริ่มต้นโดยนัยการใช้อาร์เรย์ 1 ที่มีOption Base 1นัยโดยใช้การพิมพ์โดยนัยด้วยDef[Type](boy that EVIL!) โดยปริยาย ... คุณได้รับ - สิ่งเดียวที่ดีโดยนัยใน VBA คือไวยากรณ์การโทรโดยนัยซึ่งทำให้Callล้าสมัยอย่างชัดเจน
Mathieu Guindon

7

ในกรณีของฉันไม่พบฟังก์ชัน CString แต่การเพิ่มสตริงว่างลงในค่าก็ใช้ได้เช่นกัน

Dim Test As Integer, Test2 As Variant
Test = 10
Test2 = Test & ""
//Test2 is now "10" not 10

2
ไม่มีใครพูดถึงCStringซึ่งเป็นฟังก์ชั่น VB.NET การเชื่อมสตริงว่าง ๆ ตามตัวอักษรเพื่อสร้างสตริงเป็นวิธีการแปลงค่าง่อย ใช้CStrสำหรับการแปลงประเภทอย่างชัดเจน - นี่เป็นการแปลงประเภทโดยนัยและทำให้ทุกคนที่อ่านโค้ดนั้นอ่านค่า ขออภัยฉันพบคำตอบนี้ช้าเกินไปหลังจากโพสต์แล้วฉันหวังว่าฉันจะได้ลงคะแนนได้เร็วกว่านี้มาก
Mathieu Guindon

2

หากสตริงที่คุณกำลังดึงเกิดขึ้นเป็นเลขฐานสิบหกเช่น E01 ดังนั้น Excel จะแปลเป็น 0 แม้ว่าคุณจะใช้ฟังก์ชัน CStr และแม้ว่าคุณจะฝากสตริงไว้ในประเภทตัวแปร String วิธีหนึ่งในการแก้ไขปัญหาคือการผนวก 'ไปยังจุดเริ่มต้นของค่า

ตัวอย่างเช่นเมื่อดึงค่าออกจากตาราง Word และนำไปยัง Excel:

strWr = "'" & WorksheetFunction.Clean(.cell(iRow, iCol).Range.Text)

2

วิธีที่สั้นที่สุดโดยไม่ต้องประกาศตัวแปรคือด้วยคำแนะนำประเภท :

s$ =  123   ' s = "123"
i% = "123"  ' i =  123

Option Explicitนี้จะไม่รวบรวม ประเภทจะไม่Variantแต่StringและInteger


0

อีกวิธีในการทำคือแบ่งส่วนที่แยกวิเคราะห์สองส่วนของค่าตัวเลขเข้าด้วยกัน:

Cells(RowNum, ColumnNum).Value = Mid(varNumber,1,1) & Mid(varNumber,2,Len(varNumber))

ฉันพบความสำเร็จที่ดีกว่านี้CStr()เพราะCStr()ดูเหมือนจะไม่แปลงตัวเลขทศนิยมที่มาจากตัวแปรในประสบการณ์ของฉัน


0

หากคุณมีค่าจำนวนเต็มที่ถูกต้องและความต้องการของคุณคือการเปรียบเทียบค่าคุณสามารถไปข้างหน้าด้วยการเปรียบเทียบดังที่แสดงด้านล่าง

Sub t()

Dim i As Integer
Dim s  As String

' pass
i = 65
s = "65"
If i = s Then
MsgBox i
End If

' fail - Type Mismatch
i = 65
s = "A"
If i = s Then
MsgBox i
End If
End Sub

0

คำตอบที่ได้รับการยอมรับนั้นดีสำหรับจำนวนที่น้อยกว่าสิ่งสำคัญที่สุดคือในขณะที่คุณกำลังรับข้อมูลจากแผ่นงาน Excel เนื่องจากตัวเลขที่ใหญ่กว่าจะถูกแปลงเป็นตัวเลขทางวิทยาศาสตร์โดยอัตโนมัติเช่น e + 10
ดังนั้นฉันคิดว่าสิ่งนี้จะให้คำตอบทั่วไปมากขึ้น ฉันไม่ได้ตรวจสอบว่ามีข้อผิดพลาดหรือไม่

CStr(CDbl(#yourNumber#))

สิ่งนี้จะใช้ได้กับ e + หมายเลขที่แปลงแล้ว! ตามที่เพิ่งCStr(7.7685099559e+11)จะถูกแสดงเป็น "7.7685099559e + 11" ไม่เป็นไปตามที่คาดไว้: "776850995590" ดังนั้นฉันค่อนข้างจะบอกว่าคำตอบของฉันจะเป็นผลลัพธ์ทั่วไปมากขึ้น

ขอแสดงความนับถือ


0

ป้อนคำอธิบายรูปภาพที่นี่

    Sub NumToText(ByRef sRng As String, Optional ByVal WS As Worksheet)
    '---Converting visible range form Numbers to Text
        Dim Temp As Double
        Dim vRng As Range
        Dim Cel As Object

        If WS Is Nothing Then Set WS = ActiveSheet
            Set vRng = WS.Range(sRng).SpecialCells(xlCellTypeVisible)
            For Each Cel In vRng
                If Not IsEmpty(Cel.Value) And IsNumeric(Cel.Value) Then
                    Temp = Cel.Value
                    Cel.ClearContents
                    Cel.NumberFormat = "@"
                    Cel.Value = CStr(Temp)
                End If
            Next Cel
    End Sub


    Sub Macro1()
        Call NumToText("A2:A100", ActiveSheet)
    End Sub

ผู้อ้างอิง: MrExcel.com - แปลงตัวเลขเป็นข้อความด้วย VBA

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