2009-10-20 1 views
3

alt text http://i33.tinypic.com/2dhhcwm.pngКак найти ячейки со смежными данными в строке в Excel VBA?

Учитывая изображение ... Если я знаю, что есть некоторые данные, начиная с Range ("B3").
Как я могу найти ячейки со смежными данными, которые до ячейки E3? Поскольку F3 пуст G3, он не должен рассматриваться. Результатом может быть либо объект диапазона (B3: E3), либо количество ячеек (в этом случае 4).

Устанавливая B3 в качестве активной ячейки и делать ..

Range(ActiveCell, ActiveCell.End(xlToRight).Count 

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

ответ

1

Вы можете использовать свойство CurrentRegion. Это возвращает диапазон, который смежн к указанному диапазону. Так что ...

Range("B3").CurrentRegion returns the range B3:E3 
Range("B3").CurrentRegion.Columns.Count returns 4 
Range("B3").CurrentRegion.Cells.Count also returns 4 

Однако, если у вас есть данные в строках 4 и ниже (скажем, у вас есть данные в B4: E6), то вы получите эти результаты

Range("B3").CurrentRegion returns the range B3:E6 
Range("B3").CurrentRegion.Columns.Count returns 4 
Range("B3").CurrentRegion.Cells.Count returns 16 

это то, что вы были после?

+0

Хорошая идея, но у меня могут быть данные о строках выше и ниже указанной строки, поэтому CurrentRegion может не возвращать правильные значения. –

+0

Будет ли CurrentRegion.Columns.Count работать не для вас? – dendarii

+0

Я думаю, что CurrentRegion всегда возвращает ограничительную область, которая> = используемая область. Поэтому, учитывая, что он имеет заголовки столбцов, CurrentRegion.Columns всегда будет возвращаться 4. –

3

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

Код ниже вернет значения $ B $ 3: $ E $ 3 и 4 на основе ваших данных. Если только ячейка B3 имеет данные, то он вернет $ B $ 3 и 1.

Sub GetDataArea() 

Dim strCellToTest As String 
Dim rngMyRange As Range 
Dim lngColumns As Long 

strCellToTest = "B3" 

lngColumns = ActiveWorkbook.ActiveSheet.Range("" & strCellToTest).End(xlToRight).Column - 1 

If lngColumns >= 256 Then 
Set rngMyRange = ActiveWorkbook.ActiveSheet.Range("" & strCellToTest) 
lngColumns = 1 
Else 
Set rngMyRange = ActiveWorkbook.ActiveSheet.Range _ 
(strCellToTest & ":" & Range("" & strCellToTest).Offset(0, lngColumns - 1).Address) 
End If 

MsgBox "Columns: " & lngColumns & vbCr & vbLf & "Range: " & rngMyRange.Address 

End Sub 
+0

Кажется, это хорошо! Позвольте мне проверить это. –

2

Intersect(Activecell.CurrentRegion, ActiveCell.EntireRow)

Вернется B3: E3. В качестве альтернативы

If IsEmpty(ActiveCell.Offset(0,1).Value) Then 
    Set rMyRange = ActiveCell 
Else 
    Set rMyRange = ActiveCell.Parent.Range(ActiveCell, ActiveCell.End(xlToRight)) 
End If

rMyRange также вернется B3: E3

+0

Второе решение кажется хорошим! Опять же позвольте мне проверить это! –

0

В зависимости от того, насколько вообще вам необходимо, это может быть столь же просто, как

Application.WorksheetFunction.Count([b4:e4]) 

Если вы хотите, чтобы связать в ActiveCell, попробуйте

Application.WorksheetFunction.Count(intersect(activecell.CurrentRegion, activecell.EntireRow)) 
+0

WorksheetFunction.count не будет работать, поскольку я не знаю параметр e4 во время компиляции, проверьте мои ответы на dendarii. Позвольте мне взглянуть на другую. –

1

Мне нравится использовать функцию t hat подсчитывает столбцы, содержащие значения, пока не встретит пустую ячейку. Возвращаемое значение может использоваться для установки цикла FOR NEXT для извлечения таблицы. Вот как бы я это сделал:

Sub tester() 
    Dim Answer 
    Answer = CountColumns(3, 2) 
    MsgBox "There are " & Answer & " columns." 
End Sub 
Public Function CountColumns(ByVal startRow As Integer, ByVal startColumn As Integer) 
    'Pass starting location in spreadsheet for function to loop through until 
    'empty cell is found. Return count of columns function loops through 

    Do While ActiveSheet.Cells(startRow, startColumn).Value <> "" 
     startColumn = startColumn + 1 
    Loop 
    startColumn = startColumn - 1 
    CountColumns = startColumn 
End Function