【问题标题】:How to efficiently change number to text in VBA如何在 VBA 中有效地将数字更改为文本
【发布时间】:2021-02-01 16:17:49
【问题描述】:

我正在寻找一种创建切换的方法,我可以使用它来将单元格值更改为“常规”格式或“文本”格式,并使其显示为文本,而不是数字。

假设我有 3 个值: 2839283 8572839 5922038

我尝试过的(有效)是这样的:

Dim MyRng as Range
Dim MyCell as Range

Set MyRng = Selection

if MyRng.NumberFormat = "General" Then
   For each MyCell in MyRng
      MyCell.NumberFormat = "@"
      MyCell.Value2 = CStr(MyCell.Value2)
   next MyCell
Else
   For each MyCell in MyRng
      MyCell.NumberFormat = "General"
      MyCell.Value2 = MyCell.Value2
   next MyCell
End if

有什么方法可以在不使用 for 循环的情况下实现相同的目标?我正在努力提高效率,当这个宏应用于 20k 行时......嗯,它可以工作,但速度很慢。

我试图简单地调用:

MyRng.NumberFormat
MyRng.Value2

它适用于从文本到数字的转换,但遗憾的是它在尝试将数字转换为文本时显示不匹配错误(这就是我在那里使用循环的原因)。

有什么想法吗?

【问题讨论】:

标签: excel vba


【解决方案1】:

切换常规和文本

  • 看看这是否有点帮助或给你一个想法。

代码

Option Explicit

Sub toggleGeneralText()
   
    If TypeName(Selection) <> "Range" Then Exit Sub

    Dim rg As Range: Set rg = Selection
    
    If rg.NumberFormat = "General" Then
        Dim rCount As Long: rCount = rg.Rows.Count
        Dim cCount As Long: cCount = rg.Columns.Count
        Dim Data As Variant
        If rCount > 1 Or cCount > 1 Then
            Data = rg.Value2
        Else
            ReDim Data(1 To 1, 1 To 1): Data(1, 1) = rg.Value2
        End If
        Dim i As Long
        Dim j As Long
        For i = 1 To rCount
            For j = 1 To cCount
                Data(i, j) = CStr(Data(i, j))
            Next j
        Next i
        rg.NumberFormat = "@"
        rg.Value2 = Data
    Else
        rg.NumberFormat = "General"
        rg.Value2 = rg.Value2
    End If

End Sub

【讨论】:

    【解决方案2】:

    我之前的尝试是错误的。让我再试一次。

    Dim MyRng As Range
    Dim MyCell As Range
    
    Set MyRng = Selection
    
    If MyRng.NumberFormat = "General" Then
        MyRng.NumberFormat = "@"
        MyRng.FormulaArray = MyRng.Value2
    Else
        MyRng.NumberFormat = "General"
        MyRng.Value2 = MyRng.Value2
    End If`
    

    【讨论】:

    • 不幸的是,这会弄乱非美国语言环境中的小数点和其他数字和日期分隔符。 FormulaArray 仅接受公式 in en-us,因此在小数点为逗号 (,) 的语言环境中,数字作为数字将类似于 4,2,但在应用 @ 格式后,它将更改为4.2,这在该语言环境中不再是有效数字。更糟糕的是,42,123 将更改为 42.123,这可能意味着在 . 是千位分隔符的语言环境中乘以 1000。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-03
    相关资源
    最近更新 更多