Страницы: 1
RSS
особенности работы RegExp внутри For Each или ошибка в коде?
 
Написал небольшой код добивающий значения в ячейках до шаблонных значений, т.е. необходимая длина 10 символов.
Код
For Each d In rng
                lAlen = Len(d.Cells)
                If lAlen = 9 Then
                    Selection.NumberFormat = "@" 'преобразование формата ячейки, чтобы не удалялся ноль в начале
                    sA = CStr(d.Cells)
                    sB = "0" & sA
                    d.Cells = sB
                ElseIf lAlen = 0 Then
                ElseIf lAlen < 9 Then
                    lClen = 10 - lAlen
                    For i = 1 To lClen
                        sA = CStr(d.Cells)
                        sB = sA & "0"
                        d.Cells = sB
                    Next i
                ElseIf lAlen > 9 Then
                End If
            Next d
Всё работает исправно, решил несколько улучшить, и допилить проверку наличия "лишних" символов в ячейках (буквы, знаки пунктуации и т.д.) проверка работает, но когда решил вывести из под цикла часть кода основного назначения( убрать цикл For Each d In rng чтобы убрать лишние действия и оставить нетронутыми ячейки с "лишними" символами) этот кусок кода работать перестал. Моя ошибка в написании кода или какие то особенности работы этих функций?
Код
Sub СК()
'
' Макрос3 Макрос
'

'

    Dim sA, sB As String, i, lAlen, lClen, lCtr As Long, d, vChk As Variant, reIND As Object, bCheck As Boolean, rng As Range
    Set reIND = CreateObject("VBScript.RegExp")
    Set rng = Selection.Cells    'загоняем выделенные ячейки дипазон
    ' устанавливаем свойства объекта RegExp
    reIND.Global = True    ' если Global = True, то поиск ведётся во всей строке, если False, то только до первого совпадения
    reIND.IgnoreCase = False    ' игнорировать регистр символов при поиске
    reIND.Pattern = "[^0-9]"    ' шаблон для поиска
    lCtr = 0
    For Each vChk In rng
        bCheck = reIND.Test(vChk)    'проверка наличия/отсутствия текста в диапазоне
        If bCheck = True Then
            lCtr = lCtr + 1    'счетчик текстовых ячеек
        ElseIf bCheck = False Then
            lCtr = lCtr
            'For Each d In rng
                lAlen = Len(vChk)
                If lAlen = 9 Then
                    Selection.NumberFormat = "@" 'преобразование формата ячейки, чтобы не удалялся ноль в начале
                    sA = CStr(vChk)
                    sB = "0" & sA
                    vChk = sB
                ElseIf lAlen = 0 Then
                ElseIf lAlen < 9 Then
                    lClen = 10 - lAlen
                    For i = 1 To lClen
                        sA = CStr(vChk)
                        sB = sA & "0"
                        vChk = sB
                    Next i
                ElseIf lAlen > 9 Then
                End If
            'Next d
        End If
    Next vChk
    If lCtr > 0 Then
        MsgBox "В выделенном диапазоне имеются нечисловые значения - " & lCtr & "шт."
    ElseIf lCtr = 0 Then
        MsgBox "Готово"
    End If
End Sub
Изменено: Николай Федоров - 27.01.2020 16:53:52 (неправильный код 1го окна)
 
Решение проблемы найдено. Забыл проставить свойство .Cells переменной vChk вот здесь:
Код
If lAlen = 9 Then
                    Selection.NumberFormat = "@" 'преобразование формата ячейки, чтобы не удалялся ноль в начале
                    sA = CStr(vChk.Cells)
                    sB = "0" & sA
                    vChk.Cells = sB
                ElseIf lAlen = 0 Then
                ElseIf lAlen < 9 Then
                    lClen = 10 - lAlen
                    For i = 1 To lClen
                        sA = CStr(vChk.Cells)
                        sB = sA & "0"
                        vChk.Cells = sB
                    Next i
                ElseIf lAlen > 9 Then
                End If
Страницы: 1
Наверх