【问题标题】:VBA: Convert number format / refresh cellVBA:转换数字格式/刷新单元格
【发布时间】:2021-11-21 17:16:24
【问题描述】:

我有一个很简单的问题。

我有一些可以在 Excel 中轻松转换的单元格,但我找不到在 VBA 中转换的简单方法。

单元格包含格式为 35,00 的数字,并且表现得像数字(我可以添加它们)。但不认为与数字格式 35 相同。

如果我单击单元格,它们将转换为 35 格式,因此被视为这样。

为什么重要? 因为我正在使用代码Cells(WorksheetFunction.Match(r.Offset(, -4), Sheets(4).Range("I3:I50"), 0) + 2, 9)。如果格式为 35,则代码运行良好,但如果格式为 35,00,则代码不起作用。

这是我尝试将 35,00 转换为 35 的内容。

什么在 Excel 中不起作用:

  1. 更改格式(标准或数字)
  2. 复制/粘贴

Excel 中的工作原理:

  1. 双击单元格并离开
  2. 不复制任何内容并将其添加到单元格中
  3. 将“,”替换为“,”

什么在 VBA 中不起作用:

1)

Application.Calculation = xlCalculationManual
Application.Calculation = xlCalculationAutomatic
Range("A3").Calculate
With Selection
    .NumberFormat = "General"
    .Value = .Value
End With
  1. 有选择 .NumberFormat = "0" .Value = .Value 结束于

Range("I1:I40") = Range("I1:I40").Value
Range("I2").Select
Application.CutCopyMode = False
Selection.Copy
Range("G:I").Select
Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlAdd, SkipBlanks:= _
    False, Transpose:=False
Columns("D:F").Select
Selection.Replace What:=",", Replacement:=",", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False, FormulaVersion:=xlReplaceFormula2

什么在 VBA 中起作用:
1.

Selection = CLng(Selection)   '-- work only for 1 cell

为了让它发挥作用,我会做一个 For Each ,它对我需要的东西来说有点太多了。有没有办法一次转换范围?

奇怪的是,当我在 Excel 中修复问题时录制宏(例如将“,”替换为“,”),生成的 VBA 代码不起作用。

这是一个不屈不挠的示例文件:

https://docs.google.com/spreadsheets/d/1sSUo3tTORe6xLmj38EoMT0-SopNdr3Uk/edit?usp=sharing&ouid=112578955965682987037&rtpof=true&sd=true

【问题讨论】:

    标签: excel vba string numbers


    【解决方案1】:

    vba:

    编辑:

    • 看来您的系统小数点符号和工作表上的小数点符号可能不同
    • 在这种情况下,你必须先纠正它
    • 在导入数据时最容易纠正,因为它通常是数据导入方法中的一个选项
    • 如果做不到,试试这个 VBA 宏:
    Option Explicit
    Sub text2num()
        Dim range2Convert As Range, c As Range
        
    Set range2Convert = ThisWorkbook.Worksheets("sheet9").Range("d129:d131")
        For Each c In range2Convert
            c.NumberFormat = "General"
            c.Value = WorksheetFunction.NumberValue(c.Value, ",", ".")
        Next c
    End Sub
    

    备注 -根据您的工作簿更改 Range2Convert 参数 -请注意,VBA NumberValue 函数似乎需要指定小数点和千位分隔符。我猜有数千个 - 您可能想要更改它以匹配传入数据的任何内容,如果不是点的话。不用就不用了

    【讨论】:

    • 感谢 Ron 的帮助,不幸的是,我尝试了您的代码,但没有成功。对于我所有的测试,结果总是没有任何改变。您可以在示例文件中看到确切的数据。该值如下所示:35000,00
    • @OQC 看起来您在 Windows 区域设置中将dot 设置为小数点。如果是这种情况,那么您的输入将被解释为文本字符串。查看我编辑的答案
    • 奇怪的是,我在逗号分隔符中。在 Excel 中我可以这样做:将 "," 替换为 "," 就可以了。
    • @OQC 不是分隔符,是小数
    【解决方案2】:

    这是我目前为止最好的:

    Selection.TextToColumns Destination:=Range("1"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
        Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _
        :=Array(1, 1), TrailingMinusNumbers:=True
    

    它一次转换 1 列。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-25
      • 1970-01-01
      • 2013-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-02
      相关资源
      最近更新 更多