2 votes

Comment sélectionner les lignes d'un tableau/compléter un tableau ?

La mise en place : J'ai un document Excel avec un formulaire pour saisir des données, les données de ce formulaire sont saisies dans un tableau pour faciliter la saisie de plusieurs lignes de données. Du moins, c'est ce que je pensais.

J'essaie donc de sélectionner la table pour insérer ses données aux endroits appropriés. Ma question, je pense, est la suivante : dois-je sélectionner une ligne du tableau à la fois, ou le tableau entier et traiter chaque ligne séparément. Et comment dois-je m'y prendre ?

J'ai essayé Sheets("Form").Range("dataForm[#ALL]").Select et plusieurs variantes, mais aucune n'a fonctionné.

Si je sélectionne le tableau dans son ensemble, je dois pouvoir traiter chaque ligne séparément et si je sélectionne chaque ligne individuellement, je dois pouvoir commencer par le haut du tableau car les données doivent être dans l'ordre.

Des idées ?

EDit : Pour ajouter des détails. J'ai un formulaire comme indiqué ci-dessus et ses données doivent être insérées dans différentes tables en fonction de la valeur de certaines cellules du formulaire. Pour faciliter la discussion, nous nommerons ce type de cellule, il a trois valeurs possibles, comme défini dans une liste déroulante. Ces valeurs sont le revenu, la dépense et le transfert. En fonction de ces valeurs, nous décidons dans quel tableau ajouter les données. Les revenus dans le tableau des revenus, les dépenses dans le tableau des dépenses, etc.

Ce que j'essaie de faire, c'est de sélectionner autant de lignes qu'il y en a et d'insérer chacune d'entre elles dans la bonne table. Le tri est un peu plus compliqué que ce que j'ai expliqué, mais si je peux comprendre le tri initial, il devrait être simple de le trier plusieurs fois.

5voto

Doug Glancy Points 15254

Cela devrait vous aider à répondre à vos questions.

Sub TableStuff()
Dim lo As Excel.ListObject
Dim loRow As Excel.ListRow
Dim i As Long

Set lo = ActiveSheet.ListObjects(1)
With lo
'this is the address of the whole table
Debug.Print .Range.Address
    For i = 1 To 10
        Set loRow = .ListRows.Add(i)
        loRow.Range.Cells(1).Value = "test" & i
    Next i
Debug.Print .Range.Address
'address of data rows
Debug.Print .DataBodyRange.Address
End With
End Sub

J'ai publié deux articles sur mon blog à propos des tables. A récente pourrait également apporter des éclaircissements.

EDIT : Sur la base des commentaires ci-dessous et de la modification de l'OP :

Cela suppose deux tables sur Activesheet, tblSource et tblIncome. Elle filtre la table source sur Revenu, copie les lignes visibles et les insère à la fin de la table Revenu. Enfin, il supprime les lignes source (toutes sauf une).

Vous devrez ajouter une boucle pour que cela fonctionne pour les deux autres catégories :

Sub MoveTableStuff()
Dim loSource As Excel.ListObject
Dim loTarget As Excel.ListObject
Dim SourceDataRowsCount As Long
Dim TargetDataRowsCount As Long

Set loSource = ActiveSheet.ListObjects("tblSource")
Set loTarget = ActiveSheet.ListObjects("tblIncome")
With loSource
    .Range.AutoFilter Field:=1, Criteria1:="income"
    SourceDataRowsCount = .ListColumns(1).DataBodyRange.SpecialCells(xlCellTypeVisible).Count
End With
With loTarget
    TargetDataRowsCount = .DataBodyRange.Rows.Count
    .Resize .Range.Resize(.Range.Rows.Count + SourceDataRowsCount, .Range.Columns.Count)
    loSource.DataBodyRange.SpecialCells(xlCellTypeVisible).Copy
    .DataBodyRange.Cells(TargetDataRowsCount + 1, 1).PasteSpecial (xlPasteValues)
    Application.CutCopyMode = False
End With
With loSource
    .Range.AutoFilter
    .DataBodyRange.Offset(1).Resize(.DataBodyRange.Rows.Count - 1, .DataBodyRange.Columns.Count).Rows.Delete
End With
End Sub

1voto

StanFish Points 145

Si vous avez déjà donné un nom à votre tableau, j'ai une fonction qui permet d'obtenir l'ensemble de ses données :

Public Function GetTableByName(ByVal ws As Worksheet, ByVal tbName As String) As Range

    Dim lObj As ListObject

    For Each lObj In ws.ListObjects
        If Trim(UCase(lObj.Name)) = Trim(UCase(tbName)) Then
            Set GetTableByName = lObj.DataBodyRange
            Exit Function
        End If
    Next lObj

End Function

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X