VBA_Excel_For l oop слишком большое значение 1 - PullRequest
1 голос
/ 15 апреля 2020

Я работаю над кодом VBA и читаю значения из столбца, чтобы затем вернуть массив с номерами строк, в которых ячейка пуста.

Кажется, что работает нормально, но у меня есть одно приращение слишком много на il oop, хотя его запись установлена ​​как фиксированное значение. Следствием этого является то, что он создает одно дополнительное значение в массиве "arr", значение которого равно 0.

Не могу понять, почему. Кто-нибудь может мне помочь?

Sub Main()
Dim NbrEnvoi As Integer: NbrEnvoi = 0

triEnvoi
NbrEnvoi = UBound(triEnvoi)

For i = 0 To NbrEnvoi
    row = triEnvoi(i)
'    appelFonctionMail (row)
Next

End Sub
'*******************************************************************************************
Function triEnvoi() As Variant
'trier les adhérents qui ont déjà eu leur reçu de don
Dim arr() As Integer
Dim sizeArray As Integer: sizeArray = 0

For i = 3 To LastLine
    If IsEmpty(Cells(i, Range("RecuEnvoye").Column)) = True Then
        ReDim Preserve arr(sizeArray + 1)
        sizeArray = UBound(arr)
        arr(sizeArray - 1) = i
    End If
Next
MsgBox (arr(0) & arr(1) & arr(2))
triEnvoi = arr
End Function

Спасибо всем :)

Ответы [ 3 ]

2 голосов
/ 15 апреля 2020

Вы можете сделать что-то вроде этого:

Dim arr(), sz As Long, c As Range
sz = 0

For Each c In Selection.Cells
    If Len(c.Value) = 0 Then
        ReDim Preserve arr(0 To sz)
        arr(sz) = c.Row
        sz = sz + 1 '<< this is the ubound for the *next* item (if any)
    End If
Next c

Debug.Print Join(arr, ", ")
1 голос
/ 15 апреля 2020

Вместо переопределения массива вы всегда должны использовать коллекцию, когда размер массива не может быть определен во время компиляции.

Примерно так:

Option Explicit

Sub Main()
    Dim NbrEnvoi As Collection
    Set NbrEnvoi = triEnvoi

    Dim item As Variant
    For Each item In NbrEnvoi
        Row = item
    '    appelFonctionMail (row)
    Next item
End Sub


'*******************************************************************************************
Function triEnvoi() As Collection
    'trier les adhérents qui ont déjà eu leur reçu de don
    Set triEnvoi = New Collection
    Dim i As Long
    For i = 3 To LastLine
        If IsEmpty(Cells(i, Range("RecuEnvoye").Column)) = True Then
            triEnvoi.Add i
        End If
    Next
End Function
1 голос
/ 15 апреля 2020

Вы можете использовать функцию WorksheetFunction.CountBlank() для подсчета пробелов и метод SpecialCells() для их сбора

следующим образом:

Function triEnvoi() As Variant
    Dim lastLine As Long, nBlanks As Long
    Dim cel As Range

    lastLine = 20 ' <-- fit it to your needs

    With Intersect(Range("RecuEnvoye").EntireColumn, Rows(3).Resize(lastLine - 3 + 1))
        nBlanks = WorksheetFunction.CountBlank(.Cells)
        If nBlanks > 0 Then
            ReDim arr(1 To nBlanks)
            nBlanks = 0
            For Each cel In .SpecialCells(xlCellTypeBlanks)
                nBlanks = nBlanks + 1
                arr(nBlanks) = cel.Row
            Next
            triEnvoi = arr
        End If
    End With
End Function

, и ваша подпрограмма Main() будет тогда:

Sub main()
    Dim v As Variant, i As Long

    v = triEnvoi

    If Not IsEmpty(v) > 0 Then
        For i = LBound(v) To UBound(v)
            appelFonctionMail triEnvoi(i)
        Next
    End If

End Sub
...