Строки VBA.Граф в выборе



Я ищу, чтобы выяснить, сколько строк пользователь выбрал для отображения в верхней части листа рядом с кнопкой действия, т. е. кнопка говорит "генерировать электронную почту", а рядом с ней говорит "x выбранных элементов".



Поскольку это обновляется каждый раз, когда выбор изменяется, у меня есть следующий код:



Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Sheet1.Range("E1") = Target.Rows.Count & " items selected"
End Sub


Это прекрасно работает, если пользователь выбирает последовательные строки, например, 7: 10 возвращает 4.



Моя проблема заключается в том, что пользователь выбрал строки 7 и 10. Он вернет только 1 (строки в первая часть подборки).



Из того, что я нашел, нет способа просто получить это значение из свойства, но я не могу понять, как перебирать все части выбора/цели и вычислять сумму строк. Тогда есть также возможность, что пользователь выберет, скажем, A7, C7 и A10. A7 и C7 относятся к одному и тому же элементу, поэтому на самом деле это должно рассматриваться только как один, а не два, что, я думаю, мой гипотетический код будет делать...



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



Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Sheet1.Range("E1") = getRowCount(Target) & " items selected"
End Sub

Function getRowCount(selectedRanges As Ranges)
rowCount = 0
For Each subRange In selectedRanges
rowCount = rowCount + subRange.Rows.Count
Next

getRowCount = rowCount
End Function
497   5  

5 ответов:

Я думаю, что это сработает. (Так и было, когда я попробовал.)

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    'Create a range containing just column A
    Dim subRange As Range
    Dim r As Range
    For Each subRange In Target.Areas
        If r Is Nothing Then
            Set r = subRange.EntireRow.Columns(1)
        Else
            Set r = Union(r, subRange.EntireRow.Columns(1))
        End If
    Next
    'Count how many cells in the combined column A range
    Sheet1.Range("E1") = r.Cells.Count & " items selected"
End Sub
Sub NumberOfRowsSelected()
Dim vMatch As Variant, aRows() As Long, r As Range, x As Long

ReDim Preserve aRows(x)
aRows(x) = 0

For Each r In Selection.Cells
    vMatch = Application.Match(r.Row, aRows, 0)

    If IsError(vMatch) Then
        x = x + 1
        ReDim Preserve aRows(0 To x)
        aRows(x) = r.Row
    End If
Next r

MsgBox UBound(aRows)

End Sub

Переработанный код, преобразованный в функцию

Sub NumberOfRowsSelected()
    MsgBox RowsCount(Selection)
End Sub

Function RowsCount(rRange As Range) As Long
Dim vMatch As Variant, aRows() As Long, r As Range, x As Long

ReDim Preserve aRows(x)
aRows(x) = 0

For Each r In rRange.Cells
    vMatch = Application.Match(r.Row, aRows, 0)

    If IsError(vMatch) Then
        x = x + 1
        ReDim Preserve aRows(0 To x)
        aRows(x) = r.Row
    End If
Next r

RowsCount = UBound(aRows)

End Function

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

Function getRowCount(rng As Range) As Long
    Dim c As Range
    ' Keep track of which rows we've already counted
    Dim countedrows As String: countedrows = ","
    ' Loop over cells in range
    For Each c In rng
        ' Check if already counted
        If Not InStr(countedrows, "," & c.Row & ",") > 0 Then
            ' Add to counted list
            countedrows = countedrows & c.Row & ","
        End If
    Next c
    ' Get number of rows counted
    Dim rowsarr() As String: rowsarr = Split(countedrows, ",")
    getRowCount = UBound(rowsarr) - LBound(rowsarr) - 1
End Function

Вам нужно подсчитать строки в каждом Area, которые пользователь имеет selected.
https://msdn.microsoft.com/en-us/vba/excel-vba/articles/range-areas-property-excel

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    Dim rArea As Range
    Dim lCount As Long

    For Each rArea In Selection.Areas
        lCount = lCount + rArea.Rows.Count
    Next rArea

    Sheet1.Range("E1") = lCount

End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim cell As Range
Dim i, currentRow As Long: i = 0
'get row of first cell in range
currentRow = Target.Cells(1, 1).row

For Each cell In Target
    'if row is different, then increase number of items, as it's next item
    If Not currentRow = cell.row Then
       i = i + 1
       currentRow = cell.row
    End If
Next cell

Range("E1").Value = i

End Sub

Comments

    Ничего не найдено.