2 votes

Excel 2016: Insérer une ligne CI-DESSUS trouve le résultat dans le tableau

Je suis nouveau en programmation et j'essaie de comprendre les concepts. Ce que j'essaie d'accomplir :

  1. Boucler à travers la première table pour obtenir une chaîne de caractères à rechercher
  2. Ensuite trouver la première occurrence de cette chaîne dans une deuxième table (si elle existe)
  3. Insérer/copier ensuite une ligne (de la première table) dans la deuxième table AU-DESSUS de la ligne où l'occurrence a été trouvée (dans la deuxième table)...ou si aucune occurrence n'existe : ajouter une nouvelle ligne en bas de la deuxième table et insérer/copier la ligne là-bas.

Je pense que j'ai la deuxième partie qui fonctionne correctement

Je bloque sur la manière d'utiliser l'approche ListObject pour faire cela correctement. J'ai essayé d'utiliser une approche avec 'activecell' mais cela ne me donne pas la bonne position dans la table. J'ai beaucoup cherché et trouvé très peu d'informations sur l'insertion ou même le collage à des emplacements dynamiques dans une table en utilisant l'approche ListObject.

Dim lastRow, eachRow1, unitRow, qtyRow As Long
Dim ws1, ws2, ws3 As Worksheet
Dim tbl1, tbl2, tbl3 As ListObject
Dim chkFrst As Boolean
Dim qtyValue, yumItem As String
Dim qty, stockQty, calcQty As Integer
Dim lastDate, reDate As Date
Dim findRng As Range
Dim NewRow, addRow As ListRow
Set ws1 = Sheets("UPDATE")
Set ws2 = Sheets("DATA")
Set ws3 = Sheets("LOG")
Set tbl1 = ws1.ListObjects("Update_Table")
Set tbl2 = ws2.ListObjects("Data_Table")
Set tbl3 = ws3.ListObjects("Log_Table")

For unitRow = 1 To tbl1.ListRows.Count
    yumItem = tbl1.ListColumns("ITEM").DataBodyRange.Cells(unitRow, 1).Value
    Set findRng = tbl3.Range.Find(What:=yumItem)
    If findRng Is Nothing Then
        Set NewRow = tbl3.ListRows.Add(AlwaysInsert:=True)
        NewRow.Range.RowHeight = 25
        NewRow.Range = tbl1.DataBodyRange.Cells.Range("A" & unitRow & ":O" & 
        unitRow).Value
    Else
        Application.Goto findRng, True
        ActiveCell.EntireRow.Insert Shift = xlDown
        Dim crntRow As Long
        crntRow = ActiveCell.Row
        Set NewRow = tbl3.InsertRowRange.Cells.Range(crntRow)
        NewRow.Range = tbl1.DataBodyRange.Cells.Range("A" & unitRow & ":O" & 
        unitRow).Value
   End If
Next unitRow

Toute aide est grandement appréciée!

1voto

K.Dᴀᴠɪs Points 7620

Vous pouvez utiliser EntireRow.Insert avec votre plage FindRng.

Set findRng = tbl3.Range.Find(What:=yumItem)
findRng.EntireRow.Insert Shift:=xlDown

Cela créera une nouvelle ligne directement au-dessus de votre plage. Cela déplacera vers le bas la ligne trouvée, laissant une ligne vide à sa place.1


Vous voulez seulement insérer une nouvelle ligne pour certaines colonnes? Remplacez simplement EntireRow par Columns(). L'exemple ci-dessous va insérer une ligne pour les colonnes A:C:

findRng.Columns("A:C").Insert Shift:=xlDown

_<sup>1</sup> Merci pour <a href="https://stackoverflow.com/questions/49344216/excel-2016-insert-row-above-find-result-in-table/49344320?noredirect=1#comment85688898_49344320">avoir clarifié</a> ce point, Jeeped!_

0voto

Mike Points 39

Merci pour l'astuce, je pensais que je devais utiliser ListRows.Add pour correspondre au format ListObject. Donc insérer la ligne n'est pas un problème mais je dois formater les cellules d'une certaine manière et j'ai besoin de référencer la nouvelle ligne donc j'ai essayé

findRng.Columns("A:O").Insert Shift:=xlDown
Set NewRow = findRng.Offset(-1, 0)
NewRow.Range.RowHeight = 25
NewRow.Range = tbl1.DataBodyRange.Cells.Range("A" & 
unitRow & ":O" & unitRow).Value

Mais maintenant j'obtiens 'mauvais nombre d'arguments ou affectation de propriété non valide'. Comment définir la nouvelle ligne?

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