Excel VBA Изменение диапазонов и выбор случайных ячеек - PullRequest
0 голосов
/ 29 мая 2018

У меня есть диапазон ячеек, из которого я выбираю одну отдельную ячейку, удаляю ячейку из диапазона и затем выбираю другую случайную ячейку.Этот цикл выполняется в общей сложности 6 раз.

После завершения каждого цикла и Range.Count, и Range.Address отражают удаление, но во время выполнения цикла он будет продолжать потенциально выбирать удаленные ячейки.Я использую функцию удаления клеток в другом месте, и она работает как ожидалось.

Если и счетчик, и адреса диапазона показывают удаление, почему выбираются эти удаленные ячейки?Что я делаю не так?

Код выглядит следующим образом:

someRange = RangeToString(namesList)
    MsgBox someRange

    someDate = namesSheet.Range("F12").Value
    For i = 1 To 3
        For j = 1 To 2
            For k = 1 To namesList.Count
                Set randomName = GetRandomName(namesList)
                MsgBox randomName & " was selected for date " & someDate & " and the size of the range is: " & namesList.Count
                available = AvailabilityCheck(randomName, someDate )
                If available = True Then
                    If i = 1 And j = 1 Then
                        namesSheet.Cells(18, "E").Value = randomName
                    ElseIf i = 1 And j = 2 Then
                        namesSheet.Cells(19, "E").Value = randomName
                    ElseIf i = 2 And j = 1 Then
                        namesSheet.Cells(18, "I").Value = randomName
                    ElseIf i = 2 And j = 2 Then
                        namesSheet.Cells(19, "I").Value = randomName
                    ElseIf i = 3 And j = 1 Then
                        namesSheet.Cells(18, "K").Value = randomName
                    ElseIf i = 3 And j = 2 Then
                        namesSheet.Cells(19, "K").Value = randomName
                    End If

                    Set namesList = ExcludeCell(namesList, genSheet.Range(randomName.Address))
                    namesString = RangeToString(namesList)
                    MsgBox namesList.Address
                Exit For
                End If
            Next k
        Next j
        If i = 1 Then
            someDate = namesSheet.Range("J12").Value
        Else
            someDate = namesSheet.Range("L12").Value
        End If
    Next i
    Set FooFunction = namesList

А функция удаления ячеек:

Function ExcludeCell(ByVal rngMain As Range, rngExc As Range) As Range

    Dim rngTemp     As Range
    Dim RNG         As Range

    Set rngTemp = rngMain
    Set rngMain = Nothing

    For Each RNG In rngTemp
        If RNG.Address <> rngExc.Address Then
            If rngMain Is Nothing Then
                Set rngMain = RNG
            Else
                Set rngMain = Union(rngMain, RNG)
            End If
        End If
    Next
    Set ExcludeCell = rngMain
End Function

1 Ответ

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

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

Вот до:

Function GetRandomName(namesList As Range) As Range

    Dim randomName As Long
    randomName = Int(Rnd * namesList.Cells.Count) + 1

    Set GetRandomName = namesList.Cells(randomName)

End Function

Вот после:

Function GetRandomName(namesList As Range) As Range

    Dim randomCell As Integer
    Dim randomName As Range

    Do
        randomCell = Int(Rnd * namesList.Cells.Count) + 1
        Set randomName = namesList.Cells(randomCell)

        If (randomName.Parent.name = namesList.Parent.name) Then
            Dim ints As Range

            For Each cell In namesList
                Set ints = Application.Intersect(cell, randomName)
                If (Not (ints Is Nothing)) Then
                    Set GetRandomName = randomName
                    Exit Do
                End If
            Next cell
        End If
    Loop
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...