#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%