Здравствуйте в столбце B есть числа от 300 до 800 (числа не по порядку) пожалуйста, подскажите, как макросом сделать проверку на пропущенное число и вывести пропущенные числа в MsgBox
См. вариант. Предполагается, что числа отсортированы по возрастанию. Если у Вам нужна сортировка в макросе, то включите макрорекордер и запишите эту сортировку. Потом добавите в мой код. Если пропусков ОЧЕНЬ много, то вместо 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
Юрий М написал: Предполагается, что числа отсортированы по возрастанию.
Я сначала тоже хотел предложить автору темы сначала отсортировать данные по В, но потом подумал, что скорее всего у него и так есть сортировка на листе по другим столбцам, а делать сортировку по В, потом находить пропущенные числа и потом возвращать первоначальную сортировку не совсем удобно. Поэтому я бы сначала загнал бы все числа из В в массив, отсортировал бы его, а потом бы прогнал поиск пропущенных чисел уже по массиву.
Юрий М, а можно вообще без сортировки сделать: определить массив 300 to 800, потом в массив по индексу числа из столбца В заносить единицу, останется вывести индексы значения которых не раны единице
Да куча вариантов... Вот только у меня сомнения, что автор справится с написанием на массивах. А тут мой готовый код. Если нельзя отсортировать на месте, то копируем столбец В в любой свободный столбец, сортируем, меняем номер столбца и запускаем макрос. Я так понимаю, что нужен конечный результат - он есть )
Юрий М написал: Вот только у меня сомнения, что автор справится с написанием на массивах.
Тогда мой готовый код:
Код
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
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