如何在Excel VBA中将整数转换为字符串?

How Do I Convert an Integer to a String in Excel VBA?

提问人:HelloWorld1 提问时间:7/22/2012 最后编辑:DragonthoughtsHelloWorld1 更新时间:12/23/2022 访问量:1054858

问:

如何在Excel VBA中将整数值“45”转换为字符串值“45”?

VBA 字符串 类型转换 整数

评论


答:

100赞 Brian 7/22/2012 #1

尝试 CStr() 函数

Dim myVal as String
Dim myNum as Integer

myVal = "My number is:"
myVal = myVal & CStr(myNum)
288赞 Yosem 7/22/2012 #2

CStr(45)就是你所需要的(转换字符串函数)

评论

2赞 Mahhdy 11/28/2019
这不适用于 E+ 转换后的号码!即 7.7685099559e+11 将显示为“7.7685099559e+11”,而不是预期:“776850995590” 所以我宁愿说这将是更通用的:CStr(CDbl(***))
0赞 cartbeforehorse 1/29/2020
它可能回答了问题的需求,但在某些情况下也是不完整和不充分的。通常(例如,出于文件命名目的),您可能希望创建零前缀数字,使其变为 .您可能还希望指定小数点数或包含千位分隔符。如果这些详细信息对您很重要:excelfunctions.net/vba-format-function.html7007
57赞 LimaNightHawk 8/21/2015 #3

大多数时候,您不需要“转换”;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"

只有当变量 Type 不明确时(例如,Type Variant 或 Cell's( Variant)),您才需要转换。Value

即便如此,如果您与另一个 String 变量或常量复合,您也不必使用函数。喜欢这个:CStr

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 11/11/2015
我不明白为什么这个答案没有更多的选票,因为它是真的。值得注意的是,类型转换并不总是进行,这取决于使用的操作员。例如,+ 运算并不总是将整数扩大为字符串。
1赞 Mathieu Guindon 8/22/2017
@MarkCh我知道这很旧,但是......也许是因为 VBA 令人讨厌的隐式转换和默认成员调用使如此多的 VBA 代码变得脆弱、令人惊讶和容易出错?如果不是隐式转换、隐式可访问性、隐式默认成员访问、隐式基于 1 的数组、隐式类型(男孩,那是邪恶的!)、隐式类型,那么 SO 上的 VBA 问题就不会有一半......你明白了 - VBA 中唯一好的隐式内容是使显式过时的隐式调用语法。Option Base 1Def[Type]Call
7赞 Julian Kuchlbauer 7/15/2016 #4

就我而言,找不到函数 CString。 但是在值中添加空字符串也有效。

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

评论

2赞 Mathieu Guindon 8/22/2017
没有人谈论,这是一个 VB.NET 功能。将空字符串文字连接起来以创建字符串是一种非常蹩脚的转换方法。用于显式类型转换 - 这是一种隐式类型转换,任何阅读该代码的人都会大吃一惊。对不起,我在发布后这么晚才找到这个答案,我希望我能早点投反对票。CStringCStr
3赞 Slai 8/4/2016 #5

不声明变量的最短方法是使用 Type Hints

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

这不会与 一起编译。类型不会是 but 和Option ExplicitVariantStringInteger

3赞 dolphus333 11/8/2016 #6

如果要拉入的字符串恰好是十六进制数(如 E01),则即使使用 CStr 函数,即使首先将其存放在 String 变量类型中,Excel 也会将其转换为 0。解决此问题的一种方法是将 ' 附加到值的开头。

例如,从 Word 表中提取值并将其引入 Excel 时:

strWr = "'" & WorksheetFunction.Clean(.cell(iRow, iCol).Range.Text)
0赞 Jonathan 3/22/2018 #7

另一种方法是将数值的两个解析部分拼接在一起:

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

我发现这比因为根据我的经验似乎没有转换来自变体的十进制数更成功。CStr()CStr()

0赞 user2648008 4/11/2019 #8

如果您有一个有效的整数值,并且您的要求是比较值,则可以简单地进行如下所示的比较。

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
1赞 Mahhdy 11/28/2019 #9

公认的答案适用于较小的数字,最重要的是当您从 Excel 工作表中获取数据时。因为较大的数字将自动转换为科学数字,即 E+10。
所以我认为这会给你更一般的答案。我没有检查它是否有任何垮台。

CStr(CDbl(#yourNumber#))

这将适用于 E+ 转换后的号码!因为 just 将显示为“7.7685099559e+11”,而不是预期的:“776850995590” 所以我宁愿说我的答案将是更通用的结果。CStr(7.7685099559e+11)

问候 M

2赞 Gajendra Santosh 2/27/2020 #10

enter image description here

    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 将数字转换为文本

0赞 Dave Green 10/27/2022 #11

可能也值得在转换中添加修整,因为整数转换时会使用推断(正号)和应用(负号)值的前导空格进行转换。

为了比较:

1/

lsDogsAge = "Barker is " & Cstr(liAgeInteger) & "years old"

2/

lsDogsAge = "Barker is " & Trim(Cstr(liAgeInteger)) & "years old"

1/ 巴克is__7

2/ 巴克is_7

具有讽刺意味的是,这个论坛的软件会自动截断双倍空格,所以我使用了下划线