LEN() возвращает неверное значение в VBA

#vba #excel

#vba #excel

Вопрос:

У меня есть этот простой набор данных:

 230
16000
230
230000
230000
230000
16000000
230000
230000
  

все, что я хочу, это получить длину каждой ячейки, но когда я пишу этот код:

 Sub LengthOfCell()
Dim c As Long
Dim result As Integer

c = ActiveCell.Value
result = Len(c)
Debug.Print (result)


End Sub
  

это дает мне 2 для первой ячейки (230), когда должно быть 3 и 4 для любого числа, содержащего более 3 цифр. не знаю, что я делаю не так. это просто для подтверждения концепции для более крупного подраздела:

 Public Sub SortMyData()

'approach: convert line to string and concatenate to that as it's a lot less picky than Excel's formats, then replace cell value with the new string.
'          Excel will then define the string type as either Percentage or Scientific depending on the magnitude.
Dim i As Integer
Dim N_Values As Integer

N_Values = Cells(Rows.Count, 2).End(xlUp).Row
            'Range("B6", Range("B5").End(xlDown)).Count

For i = 6 To N_Values 'iteration loop from 6 (first row of value) to N_Values (last filled row)
    Cells(i, 3).NumberFormat = "0"

    If Cells(i, 2).NumberFormat <> "0.0%" Then
        Cells(i, 2).NumberFormat = "0.0%"
        Cells(i, 2).Value = Cells(i, 2).Value / 100

        ElseIf Len(Cells(i, 3).Value > 3) Then
            Cells(i, 3).Value = Cells(i, 3).Value / 1000

        ElseIf Cells(i, 3).Value = Null Then
            Cells(i, 3).Value = 0

    Else
        Cells(i, 2).Value
        Cells(i, 3).Value
    End If
       ' If Len(Cells(i, 3) > 3) Then
           ' Cells(i, 3).Value = Cells(i, 3).Value / 1000
           ' ElseIf Cells(i, 3).Value = Null Then
                'Cells(1, 3).Value = 0
       ' Else
           ' Debug.Print
       ' End If
Next

 End Sub
  

Ответ №1:

Закрытие ) находится в неправильном месте.

 If Len(Cells(i, 3).Value > 3) Then
  

должно быть

 If Len(Cells(i, 3).Value) > 3 Then
  

Len(Cells(i, 3).Value > 3) вычислит значение Len("True") или Len("False") , поэтому оно всегда будет истинным (любое ненулевое число является истинным)

Комментарии:

1. я мог бы поцеловать тебя прямо сейчас !!!!…. Спасибо!… я пытался заставить это работать в течение недели !… одно неверно помещенное «)», вот и все, что было!

2. Я не могу поверить, что никто не заметил этого до сих пор. Хорошая работа!!

3. @RaulGonzales деление процентов на 100 также может дать вам неожиданные результаты, потому что, например .Value 123% , значение равно 1,23

Ответ №2:

Len — это функция строкового типа

@Shai Rado, пожалуйста, будьте осторожны с такими утверждениями в ответах для новичков…

F1: функция Len
Возвращает Long, содержащий количество символов в строке или количество байтов, необходимых для хранения переменной.

Комментарии:

1. спасибо за исправление, я имел в виду, поскольку пользователь хотел найти количество символов (цифр) в ячейке

Ответ №3:

Не уверен, почему вы вообще включаете Dim c As Long фрагмент — почему бы не попробовать это:

 Sub LengthOfCell()
Dim result As Integer

result = Len(ActiveCell.Value)
Debug.Print (result)


End Sub
  

Для меня это работает нормально..

Ответ №4:

Поскольку вы ищете количество символов (цифр) в ячейке, вам нужно изменить Dim c As String и немного изменить свой код, это даст вам результат, который вы ищете.

Смотрите Краткое описание ниже:

 Sub LengthOfCell()

Dim c               As String
Dim i               As Long
Dim result          As Integer

For i = 1 To 9
    c = CStr(Cells(i, 1).Value)
    result = Len(c)
    Debug.Print result
Next i

End Sub
  

Комментарии:

1. это было именно то, что я искал! Спасибо!.. итак, результаты, которые я получал раньше, были количеством байтов?

2. @RaulGonzales да, и вы ищете количество символов (цифр) в каждой ячейке

Ответ №5:

Похоже, существует путаница между значением и отображаемым текстом. Range().Value вернет необработанное значение ranges, где as, Range().Text или Cstr(Range().Value) вернет форматированное значение.

введите описание изображения здесь

 Sub Demo()
    Dim r As Range

    For Each r In Range("A2:A9")
        r.Value = 230
        r.Offset(0, 1) = r.NumberFormat
        r.Offset(0, 2) = Len(r.Value)
        r.Offset(0, 3) = Len(r.Text)
        r.Offset(0, 4) = Len(CStr(r.Value))

    Next

End Sub
  

Комментарии:

1. это то, что я искал. это условие, которое мне нужно проверить: если Len(ячейки (i, 3).Text> 3), то ячейки (i, 3).Значение = Ячейки (i, 3).Значение / 1000 ElseIf Ячейки (i, 3).Значение = Null Затем ячейки (i, 3).Значение = 0 ячеек Else (i, 2). Значение ячеек (i, 3).Значение End Если проблема, с которой я сталкиваюсь, заключается в том, что программа не проверяет, что ячейка содержит 3 символа или меньше, и, следовательно, она продолжает делиться на 1000, пока не перейдет в 0, поэтому яне знаете, что делать?

2. @RaulGonzales похоже, вы просто хотите проверить, больше ли число или равно 1000 If Cells(i, 3) >= 1000 Then Cells(i, 3) = Cells(i, 3) / 1000

3. @Slai Привет, приятель, нет, мне нужно знать, что если ячейка содержит 3 цифры или меньше, она больше не будет делиться на 1000. на данный момент программа игнорирует это условие, и каждый раз, когда я запускаю код, он делит все на 1000?

4. @RaulGonzales но то, что вы говорите, в точности соответствует тому, что написал Слай.

5. @ShaiRado Я думаю, это будет зависеть от его определения цифр. Например, 12 против 1200%