Строки 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
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-excelPrivate 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