Нахождение пропущенных номеров в заданном диапазоне - PullRequest
0 голосов
/ 29 мая 2019

У меня проблема с поиском пропущенных значений в заданном диапазоне. Например, у меня есть:

Столбец А: 3, 5, 7, 9, 10, 11 Я хочу, чтобы VBA или формула в Excel, чтобы вернуться Колонка B: 1, 2, 4, 6, 8, 12, 13 -> 30

Окончательное число в столбце B будет различным. Я хочу, чтобы это изменилось в зависимости от усмотрения пользователя. Для моей проблемы я работаю с днями месяца. Таким образом, январь, февраль и март имеют разные общие дни. Я видел много примеров, но все они основаны на массиве в таблице. Что если я захочу изменить массив на 1-30, 1-31 или 1-28 (в зависимости от того, какой месяц я смотрю)?

Ответы [ 5 ]

1 голос
/ 29 мая 2019

Это похоже на формулу, указанную OP в комментарии выше, но обобщено для определенного пользователем числа:

=IFERROR(SMALL(IF(ISERROR(MATCH(ROW(A$1:INDEX(A:A,C$2)),D$2:INDEX(D:D,COUNT(D:D)+ROW(D$1)),0)),
ROW(A$1:INDEX(A:A,C$2))),ROW()-ROW(A$1)),"")

Должен быть введен как формула массива с использованием Ctrl Shift Enter

enter image description here

EDIT

Вы можете изменить формулу, чтобы задать начальную и конечную точки:

=IFERROR(SMALL(IF(ISERROR(MATCH(ROW(INDEX(A:A,C$2):INDEX(A:A,C$3)),D$2:INDEX(D:D,COUNT(D:D)+ROW(D$1)),0)),
ROW(INDEX(A:A,C$2):INDEX(A:A,C$3))),ROW()-ROW(A$1)),"")

Это работает с датами, если столбец B отформатирован соответствующим образом:

enter image description here

0 голосов
/ 29 мая 2019

возможное решение формулы будет ФОРМУЛА Массива: CTRL + SHIFT + ENTER

{=SMALL(IF(COUNTIF(A:A,ROW(INDIRECT("1:"&MAX(A:A)-MIN(A:A)+1))+MIN(A:A)-1)=0,ROW(INDIRECT("1:"&MAX(A:A)-MIN(A:A)+1))+MIN(A:A)-1),ROW())}

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

0 голосов
/ 29 мая 2019

Вы можете попробовать:

Option Explicit

Sub test()

    Dim LastRowA As Long, LastRowB As Long, i As Long, StartValue As Long, EndValue As Long
    Dim rng As Range

    StartValue = 1
    EndValue = 30

    With ThisWorkbook.Worksheets("Sheet1")

        LastRowA = .Cells(.Rows.Count, "A").End(xlUp).Row

        Set rng = .Range("A1:A" & LastRowA)

        For i = StartValue To EndValue

            If Application.WorksheetFunction.CountIf(rng, i) = 0 Then

                LastRowB = .Cells(.Rows.Count, "B").End(xlUp).Row

                If LastRowB = 1 And .Range("B" & LastRowB).Value = "" Then
                    .Range("B1").Value = i
                Else
                    .Range("B" & LastRowB + 1).Value = i
                End If

            End If

        Next i

    End With

End Sub

Результаты:

enter image description here

0 голосов
/ 29 мая 2019

Итак, вот пример:

enter image description here

Формула в B2:

=IFERROR(INDEX(ROW($A$1:$A$30),MATCH(0,IFERROR(MATCH(ROW($A$1:$A$30),$A$2:$A$7,0),COUNTIF($B$1:$B1,ROW($A$1:$A$30))),0)),"")

Подтверждено с помощью Ctrl Shift Ввод

Вы можете изменить эту часть ROW($A$1:$A$30) по своему вкусу, чтобы включить больший диапазон чисел (или меньше) в зависимости от месяца.

0 голосов
/ 29 мая 2019

Вот как будет выглядеть код VBA:

Option Explicit
Sub MissingNumbers()

    Dim C As Range
    Dim LastRow As Long
    Dim FirstNumber As Long
    Dim LastNumber As Long
    Dim i As Long
    Dim MyNumbers As New Scripting.Dictionary 'Need Microsoft Scripting Runtime library checked on references

    FirstNumber = 1 'here goes your first number to check
    LastNumber = 30 'here goes the last number to check

    'Assume you have a column A with all the values and column B will hold the missing ones
    With ThisWorkbook.Sheets("MySheet") 'Change MySheet for your working sheet name
        LastRow = .Cells(.Rows.Count, 1).End(xlUp).Row 'Last Row on column A
        'Store your existing numbers in the dictionary
        For Each C In .Range("A2:A" & LastRow) 'I'm assuming you have headers on row 1
            MyNumbers.Add C.Value, 1
        Next C
        LastRow = 2 'starting on row 2 for column B
        'Loop through all the numbers you want to check
        For i = FirstNumber To LastNumber
            'If the number doesn't exist on the dictionary
            If Not MyNumbers.Exists(i) Then
                .Cells(LastRow, 2) = i 'write it on the next available row for columnB
                LastRow = LastRow + 1 'add 1 number to last row so we don't overwrite results
            End If
        Next i
    End With

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