2009-10-20 10 views
3

alt text http://i33.tinypic.com/2dhhcwm.pngComment puis-je trouver les cellules avec des données contiguës dans une rangée dans Excel VBA?

Étant donné l'image ... Si je sais que certaines données commencent à la plage ("B3").
Comment puis-je trouver les cellules avec des données contiguës jusqu'à la cellule E3? Puisque F3 est vide, G3 et suivants ne doivent pas être pris en compte. Le résultat peut être un objet de plage (B3: E3) ou le nombre de cellules (4 dans ce cas).

En définissant B3 comme la cellule active et de faire ..

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

je reçois le compte, mais cette méthode ne permet pas, en cas que B3 contient des données, il compte les cellules jusqu'à la fin de la drap.
Bien sûr, cela pourrait également être réalisé en bouclant à travers les cellules, mais je préfère utiliser une fonction de feuille de calcul ou une autre méthode efficace.

Répondre

1

Vous pouvez utiliser la propriété CurrentRegion. Cela renvoie la plage qui est contiguë à la plage spécifiée. Alors ...

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

Cependant, si vous aviez des données dans les lignes 4 et ci-dessous (disons que vous aviez des données dans B4: E6), alors vous obtiendrez ces résultats

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

Est-ce que vous étiez après?

+0

Bonne idée mais je pourrais avoir des données sur les lignes au-dessus et au-dessous de cette rangée ainsi CurrentRegion peut ne pas retourner les bonnes valeurs. –

+0

Est-ce que CurrentRegion.Columns.Count ne fonctionnerait pas pour vous? – dendarii

+0

Je pense que CurrentRegion renvoie toujours la zone de délimitation qui est> = la zone utilisée. Par conséquent, étant donné qu'il possède des en-têtes de colonne, CurrentRegion.Columns renvoie toujours 4. –

3

Il semble que vous essayez de déterminer le nombre de colonnes continues utilisées dans une rangée, à partir de la cellule B3.

Le code ci-dessous renverra les valeurs de $ B $ 3: $ E $ 3 et $ 4 en fonction de vos données. Si la cellule B3 ne dispose de données, il retournera $ B $ 3 et 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

Semble être bon! Laissez-moi vérifier cela. –

2

Intersect(Activecell.CurrentRegion, ActiveCell.EntireRow)

Retournera B3: E3. Vous pouvez également

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

rMyRange sera également de retour B3: E3

+0

La deuxième solution semble être bonne! Encore une fois, laissez-moi vérifier cela! –

0

Selon la façon dont vous le besoin général d'obtenir, il pourrait être aussi simple que

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

Si vous voulez lier dans la ActiveCell, essayez

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

WorksheetFunction.count ne fonctionnera pas car je ne connais pas le paramètre e4 au moment de la compilation, vérifiez mes réponses à dendarii. Laissez-moi jeter un oeil à l'autre. –

1

J'aime utiliser une fonction t hat compte les colonnes contenant des valeurs jusqu'à ce qu'elles rencontrent une cellule vide. La valeur de retour peut être utilisée pour configurer une boucle FOR NEXT pour passer d'une table à une autre. Voici comment je le ferais:

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 
Questions connexes