Как найти первый столбец, который содержит более 2 чисел в диапазоне? - PullRequest
0 голосов
/ 21 сентября 2019

РЕДАКТИРОВАТЬ: Уточнил, что строка отформатирована как ОБЩАЯ;

Ожидаемый результат:

Ячейка, содержащая: "time: 02-06" ===== 4 цифры

Ячейка, содержащая: "date: 2019-11-29 "===== 8 цифр

Ячейка, содержащая:" Name1: "===== 1 цифра

У меня есть строка, котораяотформатирован как «Общий» (не должен изменяться).Я пытаюсь написать код VBA, который дает мне первый столбец в строке, который имеет более 2 цифр в ячейке.

Проблема:

IsNumeric hasn 'здесь не работает, так как ячейки отформатированы как общие и иногда в ячейках есть текст, символы и числа.

Я предполагаю, что IsNumeric решит мою проблему лучше, чем вставка массива возможных значений в CountIf., но я не уверен, как заставить числовое значение работать здесь

Попытка решения:

Dim rRange as Range
Dim firstColWithNums As Integer
Dim i as Integer

'"Schedule" is a previously-defined named range that consists of only 1 row
Set rRange = Sheet3.Range("Schedule")

For i = 1 to rRange.Columns.Count
     if Application.Worksheetfunction.Sum(Application.Worksheetfunction.Countif(rRange(1,i),{"0","1","2","3","4","5","6","7","8","9"})) > 2 Then
          firstColWithNums = i
          Exit For
     End If
Next i

Ответы [ 4 ]

1 голос
/ 21 сентября 2019

ISNUMERIC вернет TRUE для пустых ячеек.

Вот еще один метод, который ищет только цифры с помощью регулярных выражений.

Обратите внимание, что мы проверяем только первую строку диапазонапередается функции, но вы можете использовать проверку ошибок или другую логику, если это не то, что вам нужно.

Option Explicit
Function firstWith2Digits(rw As Range) As Long
    Dim RE As Object, MC  As Object
    Dim C As Range
Set RE = CreateObject("vbscript.regexp")
With RE
    .Pattern = "\d"
    .Global = True
    For Each C In rw.Rows(1).Cells 'only check first row
        Set MC = .Execute(C.Value2)
        If MC.Count >= 2 Then
            firstWith2Digits = C.Column
            Exit Function
        End If
    Next C
End With

End Function
1 голос
/ 21 сентября 2019

"Я пытаюсь написать код VBA, который дает мне первый столбец в строке с более чем 2 числами в ячейке"

Iсогласитесь с комментариями о том, что ваше приведенное выше заявление оставляет место для интерпретации того, что вы считаете «цифрами».Но в случае, если вы хотите узнать, действительно ли два или более символа в строковом значении считаются числовыми значениями, попробуйте заменить цикл в столбцах на:

For i = 1 To rRange.Columns.Count
     If Application.Evaluate("SUM(LEN(" & rRange(1, i).Address & ")-LEN(SUBSTITUTE(" & rRange(1, i).Address & ",{1,2,3,4,5,6,7,8,9,0},)))") > 2 Then
          firstColWithNums = i
          Exit For
     End If
Next i

Или, скорее, обратитесьна правильный лист, используя .Evaluate через оператор With..:

With Sheet3
    Set rRange = .Range("Schedule")
    For i = 1 To rRange.Columns.Count
        If .Evaluate("SUM(LEN(" & rRange(1, i).Address & ")-LEN(SUBSTITUTE(" & rRange(1, i).Address & ",{1,2,3,4,5,6,7,8,9,0},)))") > 1 Then
            firstColWithNums = i
            Exit For
        End If
    Next i
End With
1 голос
/ 21 сентября 2019

Я создал функцию для подсчета количества цифр в строке

Option Explicit

Function numberDigits(inp As String) As Long
    Dim i As Long
    Dim res As Long

    For i = 1 To Len(inp)
        If IsNumeric(Mid(inp, i, 1)) Then
            res = res + 1
        End If
    Next i

    numberDigits = res

End Function

И затем я изменил ваш код следующим образом

Sub codeOfOP()
    Dim rRange As Range
    Dim firstColWithNums As Integer
    Dim i As Integer

    '"Schedule" is a previously-defined named range that consists of only 1 row
    Set rRange = Sheet3.Range("Schedule")

    For i = 1 To rRange.Columns.Count
        'if Application.Worksheetfunction.Sum(Application.Worksheetfunction.Countif(rRange(1,i),{"0","1","2","3","4","5","6","7","8","9"})) > 2 Then
        If numberDigits(rRange(1, i)) > 2 Then
            firstColWithNums = i
            Exit For
        End If
    Next i
End Sub
1 голос
/ 21 сентября 2019

Согласно моему пониманию ... Формат - Общий, данные должны поступать из внешнего источника, поэтому их следует рассматривать как строку.

Попробуйте это.

Dim rRange as Range
Dim firstColWithNums As Integer
Dim i as Long
Dim j as Long
Dim Test as string

'"Schedule" is a previously-defined named range that consists of only 1 row
Set rRange = Sheet3.Range("Schedule")
firstColWithNums = 0

For i = 1 to rRange.Columns.Count
    Test = rRange(1,i).Value2
    For j = 1 to Len(rRange(1,i).Value2)
        If (IsNumeric(Mid(Test, j, 1) = True) and (firstColWithNums < 1) Then
          firstColWithNums = 1
        ElseIf (IsNumeric(Mid(Test, j, 1) = True) and (firstColWithNums = 1) Then
          firstColWithNums = i
          Exit For
        End If
    Next 'j 
    If (firstColWithNums <> 0) and (firstColWithNums = i) then 
        Exit For
    Else
        firstColWithNums = 0
    End If
Next 'i

Надеюсьпомогает

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...