0
votes

Obtenir la plage utilisée dans la colonne de la table ListObject

J'utilise ce code pour obtenir la plage utilisée dans une colonne de table Listobject mais je me demandais s'il y avait une meilleure façon de faire cela avec Listobjects comme code est sujet aux erreurs.

Dim Lastrow As Integer
Dim rng as Range

Lastrow = ActiveSheet.Cells(Rows.Count, 2).End(xlUp).Row
Set rng = Range("B12:B" & Lastrow)


0 commentaires

4 Réponses :


0
votes

De cette manière, vous éviterez les erreurs car vos erreurs proviennent de la ActiveSheet qui peuvent être différentes si l'utilisateur interagit:

Dim Lastrow As Long 'don't use Integer is a Long cut to the integer
Dim rng As Range

With ThisWorkbook.Sheets("MySheet") 'Change MySheet to your working sheet name
    Lastrow = .Cells(.Rows.Count, 2).End(xlUp).Row
    Set rng = .Range("B12:B" & Lastrow)
End With

De cette façon, toutes vos données seront proviennent de la feuille MySheet à la fois le LastRow et le rng . Vous pouvez remarquer que j'utilise un point devant Cells , Rows.count et Range . Cela signifie qu'il fait référence à la feuille sur la ligne: With ThisWorkbook.Sheets ("MySheet")


0 commentaires

1
votes

Ce qui suit sélectionnera la plage de vos données dans la colonne 2 du tableau

╔══════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
â•‘                                      Selecting Areas Of A Table With VBA                                     â•‘
╠══════════════════════════════════════╦═══════════════════════════════════════════════════════════════════════╣
â•‘                Select                â•‘                               VBA Coding                              â•‘
╠══════════════════════════════════════╬═══════════════════════════════════════════════════════════════════════╣
â•‘ Entire Table                         â•‘ ActiveSheet.ListObjects("Table1").Range.Select                        â•‘
╠══════════════════════════════════════╬═══════════════════════════════════════════════════════════════════════╣
â•‘ Table Header Row                     â•‘ ActiveSheet.ListObjects("Table1").HeaderRowRange.Select               â•‘
╠══════════════════════════════════════╬═══════════════════════════════════════════════════════════════════════╣
â•‘ Table Data                           â•‘ ActiveSheet.ListObjects("Table1").DataBodyRange.Select                â•‘
╠══════════════════════════════════════╬═══════════════════════════════════════════════════════════════════════╣
â•‘ Third Column                         â•‘ ActiveSheet.ListObjects("Table1").ListColumns(3).Range.Select         â•‘
╠══════════════════════════════════════╬═══════════════════════════════════════════════════════════════════════╣
â•‘ Third Column (Data Only)             â•‘ ActiveSheet.ListObjects("Table1").ListColumns(3).DataBodyRange.Select â•‘
╠══════════════════════════════════════╬═══════════════════════════════════════════════════════════════════════╣
â•‘ Select Row 4 of Table Data           â•‘ ActiveSheet.ListObjects("Table1").ListRows(4).Range.Select            â•‘
╠══════════════════════════════════════╬═══════════════════════════════════════════════════════════════════════╣
â•‘ Select 3rd Heading                   â•‘ ActiveSheet.ListObjects("Table1").HeaderRowRange(3).Select            â•‘
╠══════════════════════════════════════╬═══════════════════════════════════════════════════════════════════════╣
â•‘ Select Data point in Row 3, Column 2 â•‘ ActiveSheet.ListObjects("Table1").DataBodyRange(3,                    â•‘
â•‘                                      â•‘   2).Select                                                           â•‘
╠══════════════════════════════════════╬═══════════════════════════════════════════════════════════════════════╣
â•‘ Subtotals                            â•‘ ActiveSheet.ListObjects("Table1").TotalsRowRange.Select               â•‘
â•‘                                      â•‘                                                                       â•‘
╚══════════════════════════════════════╩═══════════════════════════════════════════════════════════════════════╝

Il existe un guide très complet sur la façon de sélectionner différentes parties du ListObject ici

Dim tbl as ListObject
Dim rng as Range

set tbl = ActiveSheet.ListObjects("YourTableName")

set rng = tbl.ListColumns(2).DataBodyRange


3 commentaires

Tom, je pense que cela sélectionne même les cellules vides dans la colonne 2 du tableau?


J'essaie de transmettre votre réponse à une liste combobox de formulaire utilisateur mais ne semble pas fonctionner


@JoannaMikalai Oui, ça ira - comme le vôtre ci-dessus. Si vous voulez des cellules non vides, vous pouvez essayer d'utiliser set rng = tbl.ListColumns (2) .DataBodyRange.SpecialCells (xlCellTypeCons‌ tants) qui, selon la façon dont vos données sont, peuvent omettre les cellules vides. Comment le transmettez-vous à la ComboBox.List ? Cela peut être dû au fait que vous lui passez l'objet range. Essayez plutôt d'utiliser ComboBox.List = rng.Value2



0
votes
Sub F()
    Dim tbl As ListObject
    Dim col As ListColumn
    Set tbl = ActiveSheet.ListObjects("Table1")
    Set col = tbl.ListColumns(2)
End Sub

0 commentaires

0
votes

J'utilise ceci:

Dim lastrow as Long, tbl As ListObject
With Sheets("Sheet1")
    Set tbl = .ListObjects("MyTable")
    With tbl
        'Siddharth Rout, Feb 2018
        'http://www.siddharthrout.com/index.php/2018/02/10/find-last-row-and-last-column/
        'https://stackoverflow.com/questions/11169445/error-in-finding-last-used-cell-in-vba
        lastrow = .ListColumns(1).Range.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
        .DataBodyRange(lastrow, 1).Resize(1, 3) = Array(Date, "some text", "some text")
    End With
    Set tbl = Nothing
End With


0 commentaires