ChatGPT解决这个技术问题 Extra ChatGPT

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

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


B
B. Go

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


CStr(45),准确地说。
这不适用于 e+ 转换后的数字!即 7.7685099559e+11 将显示为“7.7685099559e+11”而不是预期:“776850995590”所以我宁愿说这将是更通用的一个:CStr(CDbl(***))
它可以回答问题的需要,但在某些情况下它也是不完整和不充分的。通常(例如,出于文件命名目的)您可能希望创建以零为前缀的数字,以便 7 变为 007。您可能还想指定小数位数或包含千位分隔符。如果这些详细信息对您很重要:excelfunctions.net/vba-format-function.html
B
Brian

试试 CStr() 函数

Dim myVal as String;
Dim myNum as Integer;

myVal = "My number is:"
myVal = myVal & CStr(myNum);

VBA 不需要分号(用于检测语句结束的 ; 字符)
L
LimaNightHawk

大多数时候,您不需要“转换”; VBA 将为您进行安全的隐式类型转换,无需使用像 CStr 这样的转换器。

下面的代码没有任何问题,因为变量是 String 类型,并且会自动为您完成隐式类型转换!

Dim myVal As String
Dim myNum As Integer

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

结果:

“我的号码是:0”

您甚至不必花哨,这也可以:

Dim myString as String
myString = 77

“77”

唯一需要转换的情况是变量类型不明确(例如,类型变体或单元格的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”


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

就我而言,找不到函数 CString 。但是向该值添加一个空字符串也可以。

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

没有人谈论 CString,它是一个 VB.NET 函数。连接一个空字符串文字来生成一个字符串是一种非常蹩脚的转换方法。使用 CStr 进行显式类型转换 - 这是一种隐式类型转换,并且会引起阅读该代码的任何人的注意。抱歉,我在发布后这么晚才找到这个答案,我希望我能早点投反对票。
d
dolphus333

如果您拉入的字符串恰好是一个十六进制数字,例如 E01,那么即使您使用 CStr 函数,即使您首先将其存入 String 变量类型,Excel 也会将其翻译为 0。解决此问题的一种方法是将 ' 附加到值的开头。

例如,当从 Word 表中提取值并将它们带到 Excel 中时:

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

S
Slai

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

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

这不会与 Option Explicit 一起编译。类型不是 Variant,而是 StringInteger


G
Gajendra Santosh

https://i.stack.imgur.com/KtJXH.png

    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

Reffer: MrExcel.com – Convert numbers to text with VBA


M
Mahhdy

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

CStr(CDbl(#yourNumber#))

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

问候,米


S
Stephen Rauch

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

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

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


u
user2648008

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

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