Страницы: 1
RSS
Проверка на пропущенное число
 
Здравствуйте
в столбце B есть числа от 300 до 800 (числа не по порядку)
пожалуйста, подскажите, как макросом сделать проверку на пропущенное число и вывести пропущенные числа в MsgBox
Изменено: sashgera - 23.06.2016 11:48:47
 
См. вариант. Предполагается, что числа отсортированы по возрастанию. Если у Вам нужна сортировка в макросе, то включите макрорекордер и запишите эту сортировку. Потом добавите в мой код. Если пропусков ОЧЕНЬ много, то вместо MsgBox нужно будет выводить на лист.
Код
Sub Macro1()
Dim LastRow As Long, i As Long, j As Long, Stroka As String
    LastRow = Cells(Rows.Count, 2).End(xlUp).Row
    For i = 3 To LastRow
        If Cells(i, 2) - Cells(i - 1, 2) > 1 Then
            For j = Cells(i - 1, 2) + 1 To Cells(i, 2)
                If j = Cells(i, 2) Then
                    Exit For
                End If
                If Stroka = "" Then
                    Stroka = j
                Else
                    Stroka = Stroka & ", " & j
                End If
            Next
         End If
    Next
    MsgBox Stroka
End Sub
 
Ещё момент: числа в столбце В начинаются со второй строки.
 
Цитата
Юрий М написал:
Предполагается, что числа отсортированы по возрастанию.
Юрий М,, Нет, числа не отсортированы по порядку (этого и не
нужно). Например, в столбце B (начиная с третьей строки) есть числа от 300 до
800, в каких-то строках этого столбца пропущены числа – 425, 311, 555. Вот эти
пропущенные числа и нужно показать в MsgBox
 
Цитата
Юрий М написал: Предполагается, что числа отсортированы по возрастанию.
Я сначала тоже хотел предложить автору темы сначала отсортировать данные по В, но потом подумал, что скорее всего у него и так есть сортировка на листе по другим столбцам, а делать сортировку по В, потом находить пропущенные числа и потом возвращать первоначальную сортировку не совсем удобно. Поэтому я бы сначала загнал бы все числа из В в массив, отсортировал бы его, а потом бы прогнал поиск пропущенных чисел уже по массиву.
Не стреляйте в тапера - он играет как может.
 
Цитата
sashgera написал:
числа не отсортированы по порядку
Так отсортируйте их - мой макрос выведет пропущенные.
 
Цитата
Ts.Soft написал:
я бы сначала загнал бы все числа из В в массив, отсортировал бы его, а потом бы прогнал поиск пропущенных чисел уже по массиву.
Согласен ) Но мне неизвестна причина, по которой автор отказывается отсортировать.
 
Создать массив размерностью по количеству чисел в диапазоне.
Arr(1) - соответствует первому числу 300, Arr(2)  - 301...

Пробежаться по числам. Если число есть, в элемент массива, соответствующий числу, записать True.
Далее пробежаться по массиву с True и выбрать нужное
Код
If Arr(i)=False Then
       k=k+1
       ArrN(k)=i+299
End If
 
Юрий М, а можно вообще без сортировки сделать:
определить массив 300 to 800, потом в массив по индексу числа из столбца В заносить единицу, останется вывести индексы значения которых не раны единице
Не стреляйте в тапера - он играет как может.
 
Ts.Soft, вы правы, на листе уже есть сортировка по другим столбцам
 
Да куча вариантов... Вот только у меня сомнения, что автор справится с написанием на массивах. А тут мой готовый код. Если нельзя отсортировать на месте, то копируем столбец В в любой свободный столбец, сортируем, меняем номер столбца и запускаем макрос.
Я так понимаю, что нужен конечный результат - он есть )
 
Цитата
Юрий М написал: Вот только у меня сомнения, что автор справится с написанием на массивах.
да, сам наверное не справлюсь, но копировать в другой столбец, а потом сортировать - не совсем удобно
 
Цитата
sashgera написал: копировать в другой столбец, а потом сортировать - не совсем удобно
Макрос ведь это может сделать.
Вручную искать пропущенные удобнее? ))
Тогда ищите темы про сортировку массива.
 
Цитата
Юрий М написал:
Вот только у меня сомнения, что автор справится с написанием на массивах.
Тогда мой готовый код:
Код
Sub Net_Chisla()
    Dim Chisla(300 To 800)
    For i = 1 To Cells(Rows.Count, 2).End(xlUp).Row
        If Cells(i, 2) >= 300 And Cells(i, 2) <= 800 Then
            Chisla(Cells(i, 2)) = 1
        End If
    Next i
    Stroka = ""
    For i = 300 To 800
        If Chisla(i) <> 1 Then
            If Stroka = "" Then
                    Stroka = i
                Else
                    Stroka = Stroka & ", " & i
            End If
        End If
    Next i
    MsgBox Stroka
End Sub
Не стреляйте в тапера - он играет как может.
 
Ts.Soft, большое спасибо!
 
То, что предлагал в сообщении №8:
Код
Sub Net_Chisla2()
Dim ArrTemp(300 To 800), ArrData()
Dim sStr As String
Dim i As Long
    i = Cells(Rows.Count, 2).End(xlUp).Row
    ArrData = Range("B1:B" & i).Value

    For i = 1 To UBound(ArrData)
        If ArrData(i, 1) >= 300 Then
            If ArrData(i, 1) <= 800 Then ArrTemp(ArrData(i, 1)) = True
        End If
    Next i
    
    For i = 300 To 800
        If ArrTemp(i) = False Then sStr = sStr & " " & i
    Next i

    MsgBox Trim(sStr)
End Sub
 
vikttur, спасибо, работает!
Страницы: 1
Читают тему
Наверх