Как вы получаете Excel VBA для распознавания чисел c ячеек? - PullRequest
0 голосов
/ 12 марта 2020

У меня есть таблица чисел, которые выровнены по левому краю (т. Е. Excel распознает их как текст)

Я запускаю сценарий VBA для всех ячеек:

cell.value = cell.Value * 1

Это право выравнивает их все, и Excel распознал их как числа , за исключением для десятичных знаков (например, 3.14 не работает, а 314 работает). Я также запускаю скрипт поиска и замены, где выполняется поиск пробела (""), и заменяю его пробелом (""), так что это должно избавить хотя бы от общего пробела.

Дополнительные подсказки: Если я выполню формулу = Значение (A1) в Excel, Excel распознает даже десятичные числа как число. Если я запускаю Workbookfunction.value (A1), Excel не распознает число.

Таким образом, проблема, похоже, связана с VBA (?) И десятичными числами. Любые решения?

Теперь я запустил следующее после комментариев здесь:

For Each cell In rng
Dim vNumber As Double
On Error Resume Next
'Remove space
cell.Replace What:=" ", Replacement:="", LookAt:=xlPart, _
   SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
  ReplaceFormat:=False

'Remove comma
cell.Replace What:=",", Replacement:="", LookAt:=xlPart, _
    SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
   ReplaceFormat:=False

'Check if empty, if it is: Do nothing
If IsEmpty(cell) = True Then

Else
vNumber = CDbl(cell.Value)
cell.Value = vNumber
End If

'Check if numeric
If IsNumeric(cell) = True Then
cell.Interior.Color = RGB(0, 254, 0)
cell.Interior.TintAndShade = 0.8

Else
cell.Interior.Color = RGB(100, 0, 0)
cell.Interior.TintAndShade = 0.8

End If
Next cell

Результатом является следующее До и После (где один с Двойным, а другой с Вариантом. Каким-то образом его перезапись ячейки, которые не являются десятичными ...

enter image description here

enter image description here

Ответы [ 3 ]

1 голос
/ 12 марта 2020

Val(Cells(1,1).Value преобразует строку в число, если это число c, в ноль, если это не так. «123ab c» будет преобразовано в число 123. IsNumeric(Cells(1,1).Value) вернет True, если в строке ячейки нет числовых символов c.

Кстати, функция VBA Val () будет игнорировать пробелы. Val(123 456") вернет номер 123456.

Код ниже будет соответствовать вашим обновленным требованиям. Пожалуйста, попробуйте.

Sub ConvertTextToNumbers()

    Dim Rng As Range
    Dim Cell As Range
    Dim Arr As Variant
    Dim R As Long

    With Worksheets("Sheet1")           ' modify to suit
        Set Rng = .Range(.Cells(2, "B"), .Cells(.Rows.Count, "B").End(xlUp))
        Arr = Rng.Value

        For R = 1 To UBound(Arr)
            ' remove commas and spaces
            Arr(R, 1) = Val(Replace(Replace(Arr(R, 1), " ", ""), ",", ""))
        Next R

        Rng.Offset(0, 1).Value = Arr

        For Each Cell In Rng.Offset(0, 1)
            Cell.Interior.Color = IIf(Cell.Value, vbGreen, vbRed)
        Next Cell
    End With
End Sub
1 голос
/ 12 марта 2020

Вы пробовали конвертацию?

Sub test()

    Dim rng As Range, cell As Range

    With ThisWorkbook.Worksheets("Sheet1")

        Set rng = .Range("A1:A5")

        For Each cell In rng
            .Range("B" & cell.Row).Value = CDbl(cell)
        Next cell

    End With

End Sub

Результаты:

enter image description here

1 голос
/ 12 марта 2020

Вам необходимо преобразовать значение ячейки в двойное число. Например:

Dim myDouble As Double
myDouble = CDbl(Range("A1").Value)
Debug.Print myDouble
myDouble = myDouble + 1
Debug.Print myDouble

Строки с 3 по 5 просто для демонстрации того, что они распознаются как десятичные.

...