【问题标题】:Excel VBA- how to identify cells with scientific notationExcel VBA-如何用科学计数法识别单元格
【发布时间】:2018-06-05 00:42:11
【问题描述】:

我已经搜索过 SO,但未能成功找到解决方案 - 您如何通过 Excel vba 识别列中采用科学计数法的单元格?

这是我试图通过带有科学记数法的自动过滤行来隔离的代码...

Private Sub cmdMoveScientificNotation_Click()

Dim objExcel As Excel.Application
Dim objWB As Excel.Workbook
Dim objWBtoAdd As Excel.Workbook
Dim newWS As Excel.Worksheet
Dim objWS As Excel.Worksheet
Dim i As Long
Dim Lrow As Long
Dim strSearch As String
Dim myRange As Range
Dim Cell As Range


Set objExcel = New Excel.Application

objExcel.Visible = True

Set objWB = Workbooks.Open("C:\TEST\Drop\Bank.xlsx", , False)
Set objWBtoAdd = Workbooks.Add
Set newWS = objWBtoAdd.ActiveSheet

Set objWS = objWB.ActiveSheet

    With objWS

        Lrow = .Range("A" & .Rows.Count).End(xlUp).Row
        myRange = .Range("A1:V" & Lrow)

            For Each Cell In myRange
                If (Cell.NumberFormat = "0.00E+00") Then
                .AutoFilter Field:=2, Criteria1:=strSearch
                .SpecialCells(xlTypeVisible).EntireRow.Copy
                End If

            Next Cell


    End With

newWS.PasteSpecial


End Sub

【问题讨论】:

  • 您需要在 VBA 中专门完成此操作吗?还是您只需要目视识别?如果你只想知道“哪些是科学记数法,它们是中间带“E”的数字,比如123E+00
  • 有时人们会想太多,并认为他们需要 VBA,而实际上他们并不需要。有时 VBA 太过分了,所以为什么不提出一个 OP 可能不知道的简单解决方案 - 即使 OP 无法使用该解决方案,未来搜索此问题的人可能会发现答案很有用。
  • @urdearboy “有时”是轻描淡写的!如前所述,与 VBA 所需的知识水平相比,所问内容所需的知识水平。我认为 OP 正在寻找的答案甚至不是使用数字格式对话框,而是 寻找 E! :)

标签: excel vba notation


【解决方案1】:

类似:

If IsNumeric(cell.Value) And cell.text like "*E*" Then

如果数字太长而无法适应单元格的宽度,Excel 有时会在不更改数字格式的情况下切换到科学记数法。

如果您只需要查找已格式化为科学格式的单元格,请查看:

cell.NumberFormat

【讨论】:

  • 这是基于 +1 给出的信息的正确答案(我怀疑可能已经给出了错误信息,现在 OI 真的很好奇我是否正确!)
【解决方案2】:

我怀疑您可能在问题错误中使用了 标签。如果您只是想一眼看出哪些单元格是科学记数法,您可以...

  1. 查找中间有“E”的单元格,例如123E+00(见下文)。

  2. 突出显示一个单元格并通过按 Ctrl+1 打开 数字格式 对话框来检查它的格式,g 在这里您可以查看Scientific是否被选中。


示例:

在下面的示例中,混合了格式为 NumberScientific 的单元格>。我突出显示格式为 Scientific Notation 的单元格,以便您看到差异。


更多信息:


编辑:

我仍然不确定这个目标的目标是什么,但如果目标是确定哪些单元格的值当前以科学记数法显示,这里有一个替代解决方案。

例如,在某些情况下,当列被调整为太窄而无法显示整个(标准符号)数字时,单元格将自动以科学记数法格式化(自我缩写)。

在 VBA 中,单元格的 .Text 属性始终返回 显示“格式化”值(与返回 实际“原始”的 .Value 属性相反潜在价值)。

因此,可以使用这样的函数来识别当前使用科学记数法显示的单元格:

Function displayedAsScientific(c As Range) As Boolean
  Application.Volatile
  displayedAsScientific = IsNumeric(c.Value) And InStr(c.Text, "E") > 0
End Function

这张图片可能有助于也可能不会帮助展示:?

【讨论】:

  • 由于问题在标题中显示 VBA 并被标记为 vba,我很确定发帖人要求的是程序化解决方案。
  • 是的,请使用 VBA
  • 能否请您澄清一下如何将最后一行指定为动态 - 我遇到了问题...
【解决方案3】:

如果范围已格式化为科学计数法,这将适用于 ONE 单元格并返回一个 msgbox。

Sub BillNye
Dim MyRange As Range
Set MyRange = Range("A1")

If (MyRange.NumberFormat = "0.00E+00") Then
MsgBox "Scientific"
End If
End Sub

这将扫描范围 A1:A10 的科学格式,如果它是科学的,则在 B 列的单元格中发表评论。您将需要修改您的范围并根据需要偏移等式。正如代码所示,您可以将 B 列过滤为“科学”,以仅查看科学格式的值。

Sub BillNye()

Dim MyRange As Range
Set MyRange = Range("A1:A10")
Dim Cell As Range

For Each Cell In MyRange
    If (Cell.NumberFormat = "0.00E+00") Then
    Cell.Offset(, 1) = "Scientific"
    End If
Next Cell

End Sub

我建议将最后一行的范围修改为动态的(除非你只需要使用一次,那么静态范围就可以了。)

【讨论】:

  • 也可以是0.000E+00
  • Tim,我正在尝试用科学计数法自动过滤单元格,这样我就可以将它们移到另一个工作表中,然后在开头添加一个撇号。我试图在整个列中执行此操作(添加撇号),但是行数超过 200k,它真的很慢。所以我想也许只专注于过滤掉科学计数法中的行
  • 谢谢 urdearboy——这似乎就是我要找的东西。非常感谢 - 我真的很感激。
  • Urdearboy- 您能否指定如何将最后一行表示为动态?我遇到了以下问题:
  • 第2列
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-18
相关资源
最近更新 更多