【问题标题】:How Do I Convert an Integer to a String in Excel VBA?如何在 Excel VBA 中将整数转换为字符串?
【发布时间】:2012-07-20 16:01:00
【问题描述】:

如何在 Excel VBA 中将 integer 值“45”转换为 string 值“45”?

【问题讨论】:

    标签: vba string type-conversion integer


    【解决方案1】:

    试试 CStr() 函数

    Dim myVal as String;
    Dim myNum as Integer;
    
    myVal = "My number is:"
    myVal = myVal & CStr(myNum);
    

    【讨论】:

    • VBA 不需要分号(; 用于检测语句结束的字符)
    【解决方案2】:

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

    【讨论】:

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

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

    即便如此,如果您要与另一个字符串变量或常量复合,您也不必使用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 过时。
    【解决方案4】:

    在我的例子中,没有找到函数 CString。 但是在值中添加一个空字符串也可以。

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

    【讨论】:

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

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

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

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

    【讨论】:

      【解决方案6】:

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

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

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

      【讨论】:

        【解决方案7】:

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

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

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

        【讨论】:

          【解决方案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
          

          【讨论】:

            【解决方案9】:

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

            CStr(CDbl(#yourNumber#))
            

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

            问候, M

            【讨论】:

              【解决方案10】:

                  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

              【讨论】:

                猜你喜欢
                • 2011-11-28
                • 1970-01-01
                • 2021-12-27
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2017-01-28
                • 1970-01-01
                相关资源
                最近更新 更多