Подтвердить что ты не робот

Что действительно имеет свойство range.Rows Excel?

Хорошо, я заканчивал надстройки на проект унаследованной Excel-VBA приложения, и я еще раз наталкиваюсь на загадку таинственных range.Rows (?) И worksheet.Rows свойств.

Кто-нибудь знает, что эти свойства действительно делают и что они должны предоставить мне? (Примечание: все это, вероятно, относится и к соответствующим свойствам *.Columns).

Я действительно хотел бы иметь возможность использовать его для возврата диапазона строк, например:

   SET rng = wks.Rows(iStartRow, iEndRow)

Но мне никогда не удавалось заставить это сделать это, хотя Intellisense показывает два аргумента для этого. Вместо этого я должен использовать один из двух или трех других (очень грязных) методов.

Помощь очень бесполезна (как правило, так для Office VBA), и поиск в Google для "Rows" не очень полезен, независимо от того, сколько других терминов я добавлю к нему.

Единственные вещи, для которых я смог использовать это: 1) возвращать одну строку в качестве диапазона (rng.Rows(i)) и 2) возвращать количество строк в диапазоне (rng.Rows.Count). Это оно? Неужели больше ничего не подходит для этого?

Пояснение: я знаю, что он возвращает диапазон и что есть другие способы получить диапазон строк. Я спрашиваю, что конкретно мы получаем от .Rows() который мы еще не получаем от .Cells() и .Range()? Мне известны две вещи: 1) более простой способ вернуть диапазон одной строки и 2) способ подсчета количества строк в диапазоне.

Есть ли еще что-нибудь?

4b9b3361

Ответ 1

Range.Rows и Range.Columns возвращают по существу тот же диапазон, за исключением того факта, что новый Range имеет флаг, который указывает, что он представляет строки или столбцы. Это необходимо для некоторых свойств Excel, таких как Range.Count и Range.Hidden, а также для некоторых методов, таких как Range.AutoFit():

  • Range.Rows.Count возвращает количество строк в диапазоне.
  • Range.Columns.Count возвращает количество столбцов в диапазоне.
  • Range.Rows.AutoFit() autofits строки в Range.
  • Range.Columns.AutoFit() автоподтверждает столбцы в Range.

Вы можете обнаружить, что Range.EntireRow и Range.EntireColumn полезны, хотя они все еще не совсем то, что вы ищете. Они возвращают все возможные столбцы для EntireRow и всех возможных строк для EntireColumn для представленного диапазона.

Я знаю это, потому что SpreadsheetGear для .NET поставляется с .NET API, которые очень похожи на API Excel. API SpreadsheetGear поставляется с несколькими сильно типизированными перегрузками для индексатора IRange, включая тот, который вы, вероятно, пожелаете Excel:

  • IRange this[int row1, int column1, int row2, int column2];

Отказ от ответственности: у меня есть SpreadsheetGear LLC

Ответ 2

Range.Rows, Range.Columns и Range.Cells - это объекты Excel.Range, в соответствии с функциями VBA Type():

? TypeName (Selection.rows)
Ассортимент
Однако это не вся история: те возвращенные объекты являются расширенными типами, которые наследуют каждое свойство и метод из Excel:: Range - но .Columns и .Rows имеют специальное значение для... Каждый итератор и специальное свойство .Count, которое aren 't совершенно так же, как итератор родительского объекта Range и count.

Итак. Cells повторяется и учитывается как набор диапазонов с одной ячейкой, как и итератор по умолчанию родительского диапазона.

Но. Колонки повторяются и подсчитываются как набор вертикальных поддиапазонов, каждый из которых имеет ширину в один столбец;

... И .Rows повторяется и подсчитывается как набор горизонтальных поддиапазонов, каждый из которых имеет высоту в одну строку.

Самый простой способ понять это - пройти этот код и посмотреть, что выбрали:

Открытый Sub Test() 

Для каждого поддиапазона в ParentRange.Rows   SubRange.Select Следующий
Для каждого поддиапазона в ParentRange.Columns   SubRange.Select Следующий
Для каждого поддиапазона в ParentRange   SubRange.Select Следующий
End Sub
Наслаждаться. И попробуйте с помощью пары объединенных ячеек, чтобы увидеть, как могут быть нечетные объединенные диапазоны.

Ответ 3

Ваши два примера - это единственные вещи, которые я когда-либо использовал для свойств Rows и Columns, но в теории вы могли бы сделать с ними что-нибудь, что можно сделать с помощью объекта Range.

Возвращаемый тип этих свойств сам является Range, поэтому вы можете делать такие вещи, как:

Dim myRange as Range
Set myRange = Sheet1.Range(Cells(2,2),Cells(8,8))
myRange.Rows(3).Select

который выберет третью строку в myRange (ячейки B4: H4 в Sheet1).

update: Чтобы сделать то, что вы хотите сделать, вы можете использовать:

Dim interestingRows as Range
Set interestingRows = Sheet1.Range(startRow & ":" & endRow)

update # 2: Или, чтобы получить подмножество строк из другого диапазона:

Dim someRange As Range
Dim interestingRows As Range

Set myRange = Sheet1.Range(Cells(2, 2), Cells(8, 8))

startRow = 3
endRow = 6

Set interestingRows = Range(myRange.Rows(startRow), myRange.Rows(endRow))

Ответ 4

Поскольку результат .Rows помечен как состоящий из строк, вы можете "Для каждого" его обрабатывать каждую строку отдельно, например:

Function Attendance(rng As Range) As Long
Attendance = 0
For Each rRow In rng.Rows
    If WorksheetFunction.Sum(rRow) > 0 Then
        Attendance = Attendance + 1
    End If
Next
End Function

Я использую это для проверки посещаемости в любой из нескольких категорий (разные столбцы) для списка людей (разные строки).

(И, конечно же, вы можете использовать .Columns для выполнения "Для каждого" по столбцам в диапазоне.)

Ответ 5

Я не уверен, но я думаю, что вторым параметром является красная селедка.

Оба .Rows и .Columns берут два необязательных параметра: RowIndex и ColumnIndex. Попробуйте использовать ColumnIndex, например. Rows(ColumnIndex:=2) генерирует ошибку для обоих .Rows и .Columns.

Мое ощущение, что оно унаследовано в некотором смысле от свойства Cells(RowIndex,ColumnIndex), но подходит только первый параметр.

Ответ 6

Я обнаружил, что использую range.Rows для его эффектов в методе Copy. Он копирует высоту строк из начала координат в пункт назначения, что является поведением, которое я хочу.

rngLastRecord.Rows.Copy Destination:=Sheets("Availability").Range("a" & insertRow)

Если бы я использовал rngLastRecord.Copy вместо rngLastRecord.Rows.Copy, высота строк была бы тем, что было там до копии.

Ответ 7

Возможно, это битка, но следующий код делает то, что вы, похоже, хотите сделать:

Set rng = wks.Range(wks.Rows(iStartRow), wks.Rows(iEndRow)).Rows

Ответ 8

Я нашел, что это работает:

Rows(CStr(iVar1) & ":" & CStr(iVar2)).Select

Ответ 9

Есть другой способ: возьмите это как пример

Dim sr As String    
sr = "6:10"
Rows(sr).Select

Все, что вам нужно сделать, это преобразовать переменные iStartRow, iEndRow в строку.