2013-11-18 4 views
7

Рассмотрят следующий макрос VBA в ExcelExcel VBA - Союз диапазонов и его поддиапазоны

Sub foo() 
    Dim aRng As Range: Set aRng = ActiveSheet.Range("A1:J1") 
    Dim bRng As Range: Set bRng = ActiveSheet.Range("A4:J4") 
    Dim cRng As Range: Set cRng = ActiveSheet.Range("A10:J10") 

    Dim uRng As Range: Set uRng = Union(aRng, bRng, cRng) 
    uRng.Style = "Good" 
    uRng.Cells(2, 1).Style = "Bad" 
End sub 

Результаты: Ряды 1 "A1:J1", "A4:J4", "A10:J10" являются хорошими и клеткой "A2"является плохим. Я ожидал, что ячейка "A4" будет плохой. «A2» не находится в uRng; почему он будет возвращен uRng.Cells(2,1)?

Другие странности: uRng.Rows.Count = 1 и uRng.Columns.Count = 10. Неужели я не ожидаю, что uRng будет 3х10? Или это не определено, потому что позиции aRng, bRng и cRng друг другу не указаны?

+0

Вчера я задал вопрос о диапазонах.Они не ведут себя так, как вы ожидали бы :([My Range Question] (http://stackoverflow.com/questions/20035121/why-can-i-reference-cells-in-a-range-that-shouldnt-exist -and-how-do-i-find-the) – Sam

+0

легко проверить. Просто заполните свой диапазон (оставьте любые другие ячейки пустыми) и выполните «Application.Worksheetfunction.CountaA (uRng)». Таким образом, вы можете видеть нет – Takedasama

+0

Я вижу, что вы уже приняли ответ :) Но я все равно продолжу и отправлю свой ответ, так как я набрал много ... lol –

ответ

9

Они фактически рассматриваются как три отдельных диапазонов, доступных из uRng через Range.Areas собственности:

http://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.range.areas(v=office.11).ASPX

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

Sub foo() 
    Dim aRng As Range: Set aRng = ActiveSheet.Range("A1:J1") 
    Dim bRng As Range: Set bRng = ActiveSheet.Range("A4:J4") 
    Dim cRng As Range: Set cRng = ActiveSheet.Range("A10:J10") 

    Dim uRng As Range: Set uRng = Union(aRng, bRng, cRng) 
    uRng.Style = "Good" 
    uRng.Areas(2).Cells(1, 1).Style = "Bad" 
End Sub 

также, приведенный ниже код даст вам тот же результат:

Sub foo2() 
    Dim uRng As Range: Set uRng = [A1:J1,A4:J4,A10:J10] 
    uRng.Style = "Good" 
    uRng.Areas(2).Cells(1, 1).Style = "Bad" 
End Sub 
+1

Интересно ... 'uRng .Areas (2) .Cells (2,1). Выберите «выбирает» A5. Спасибо – cheezsteak

+1

+ 1 красиво сделано :) –

4

AuRng.Cells(2, 1) работает только для смежных диапазонов, а не для непрерывного диапазона. Для того, чтобы выбрать ячейку в конкретной области, вы должны решить эту область, а затем использовать .Cells(r,w)

Например

uRng.Areas(n).Cells(r, c) 

Где n это область, которую вы хотите записать и r, c являются строки/столбца.

B. Строки. Работы с 1 Площадь. Поэтому, чтобы найти количество строк в несмежном диапазоне, вам придется зацикливаться.

Смотрите этот пример

Option Explicit 

Sub foo() 
    Dim aRng As Range: Set aRng = ActiveSheet.Range("A1:J1") 
    Dim bRng As Range: Set bRng = ActiveSheet.Range("A4:J4") 
    Dim cRng As Range: Set cRng = ActiveSheet.Range("A10:J10") 
    Dim rngArea As Range 
    Dim rwCount As Long 

    Dim uRng As Range: Set uRng = Union(aRng, bRng, cRng) 

    If uRng.Areas.Count > 1 Then 
     Debug.Print "It's a non-contiguous range" 
     For Each rngArea In uRng.Areas 
      rwCount = rwCount + rngArea.Rows.Count 
     Next 
     Debug.Print "The range has " & rwCount & " rows" 
    Else 
     Debug.Print "It's a contiguous range" 
     Debug.Print "The range has " & uRng.Rows.Count & " rows" 
    End If 
End Sub 

C. Существует странность в columns.count, а, но так как все диапазон имели одинаковое количество столбцов, вы не relaize это. Попробуйте это

Option Explicit 

Sub foo() 
    Dim aRng As Range: Set aRng = ActiveSheet.Range("A1:J1") 
    Dim bRng As Range: Set bRng = ActiveSheet.Range("A4:K4") '<~~ I changed this. 
    Dim cRng As Range: Set cRng = ActiveSheet.Range("A10:J10") 

    Dim uRng As Range: Set uRng = Union(aRng, bRng, cRng) 

    '~~> This will still give you 10 instead of `11` 
    Debug.Print uRng.Columns.Count 
End Sub 

Таким образом, та же логика применяется и для поиска количества столбцов.

IMP: Теперь это зависит от того, как вы хотите подсчитать количество строк/столбцов. Что делать, если строки/столбцы областей перекрываются? В таком случае вы хотите суммировать количество строк/столбцов или фактических строк/столбцов Excel в этом непересекающемся диапазоне?

+0

В следующий раз я подожду несколько часов, прежде чем выбрать ответ – cheezsteak

+0

lol :) Не беспокойтесь :) –

+0

Я заметил, что если бы я использовал «A2: J2» вместо «A4»: K4 «тогда будет две области 2x10 и 1x10. Таким образом, районы зависят от того, какие диапазоны являются отдельными, а какие диапазоны не объединены. – cheezsteak

Смежные вопросы