Methode Row avec double variable
Bonjour mesdames et messieurs !
Voila mon cas :
J'ai un tableau avec une liste de référence, parfois la même référence se suit.
J'ai donc mis des variables afin d'avoir la plage de lignes successives avec la même référence afin de les grouper.
Seulement ma méthode Range pour sélectionner les lignes pour les grouper ne fonctionnent pas.
J'ai tenté ce code
Sheets("Historique Production").Range(Cells(i + 1, 1), Cells(Dernligne2 - 1, 1)).Selectou
Sheets("Historique Production").Range("A" & i + 1 & ": H" & Dernligne2 - 1).SelectJ'ai tenté avec la méthode Row également mais sans succès, malheureusement j'ai remplacé ma ligne.
Si quelqu'un peut m'aiguiller j'en serais fort content !
Merci d'avance pour l'aide que vous me fournirez
Peuto
bonjour
ces 2 instructions sont correctes au niveau de la syntaxe. Vérifier que dernligne2 a bien une valeur > 1
Voila le code complet.
Dernligne2 = Sheets("Historique Production").Range("A" & Rows.Count).End(xlUp).Row + 1
If Sheets("Historique Production").Cells(Dernligne2 - 1, 6) > 1 Then
For i = Dernligne2 To 4 Step -1
If Not Sheets("Historique Production").Cells(i, 4) = Sheets("Historique Production").Cells(i + 1, 4) Then
Sheets("Historique Production").Cells(Dernligne2, 1) = nof
Sheets("Historique Production").Cells(Dernligne2, 2) = Now()
Sheets("Historique Production").Cells(Dernligne2, 4) = Sheets("Historique Production").Cells(Dernligne2 - 1, 4)
Sheets("Historique Production").Cells(Dernligne2, 6) = Sheets("Historique Production").Cells(Dernligne2 - 1, 6)
Sheets("Historique Production").Cells(Dernligne2, 5) = Application.WorksheetFunction.Sum(Range(Cells(i + 1, 5), Cells(Dernligne2 - 1, 5)))
Sheets("Historique Production").Range(Cells(i + 1, 1), Cells(Dernligne2 - 1, 1)).Select
Selection.Rows.Group
ActiveSheet.Outline.ShowLevels RowLevels:=1
Exit For
End If
Next iDonc pour décrire, le programme rajoute une ligne pour chaque palette produite. Je vérifie donc que le numéro palette de la ligne au dessus Dernligne2 est supérieur a 1.
Si c'est le cas, je vérifie a partir de dernligne2 jusqu'en haut du tableau pour avoir la 1ere ligne avec une référence différente.
Quand je l'ai trouvé, je copie sur Dernligne2 les données de quantité, nombre de palette... afin d'avoir une ligne récapitulative.
Et ensuite je sélectionne les lignes puis je les groupes.
Mais j'ai erreur 1004 : Erreur définie par l'application ou par l'objet
Qui se trouve sur la ligne de sélection de la plage.
bonjour,
le code n'apporte rien. peux-tu mettre un extrait de ton fichier dans lequel tu peux reproduire l'erreur ?
Voila le fichier très épuré.
L'erreur se produit lorsqu'on clique sur le bouton "fin de production".
Pour le détail, vu que j'ai épuré, il est possible de déclarer les palettes mais le numéro reste à 0, il faut donc le modifier dans la feuille historique production (je l'ai fais sur la version que je vous envoie que vous puissiez faire fin de production tout de suite).
Et la dernière chose, c'est que pour pouvoir appuyer sur "fin de production" il faut impérativement marquer quelque chose dans la case commentaire.
Peuto
Il y a également le code de la somme qui se trouve juste au dessus du code qui provoque l'erreur qui n'est pas correcte.
Quand l'erreur se produit, le code de la somme est exécuter mais si l'on va dans historique production on constate que le calcul a donné 0.
Je ne sais pas si ca peut être lié
bonjour,
proposition de correction. tu ne peux pas sélectionner une feuille et une cellule dans la même instruction. il faut le faire en 2 étapes. d'abord la feuille. puis la cellule sur la feuille
Sheets("Historique Production").Cells(Dernligne2, 1) = nof
Sheets("Historique Production").Cells(Dernligne2, 2) = Now()
Sheets("Historique Production").Cells(Dernligne2, 4) = Sheets("Historique Production").Cells(Dernligne2 - 1, 4)
Sheets("Historique Production").Cells(Dernligne2, 6) = Sheets("Historique Production").Cells(Dernligne2 - 1, 6)
Sheets("Historique Production").Cells(Dernligne2, 5) = Application.WorksheetFunction.Sum(Range(Cells(i + 1, 5), Cells(Dernligne2 - 1, 5)))
Sheets("Historique Production").Select
Range(Cells(i + 1, 1), Cells(Dernligne2 - 1, 1)).Select
Selection.Rows.Group
ActiveSheet.Outline.ShowLevels RowLevels:=1Je te remercie ! Ca marche pas encore parfaitement mais au moins il n'y a pas d'erreur..
Par hasard, pour la somme, sais-tu si ma formule est bonne ? Car elle me retourne 0.
Sinon ne t'en fais pas je retourne à mes recherches
Tu m'as déjà sorti d'un bon guêpier ! Je t'en remercie
Bonsoir,
tu veux faire la somme de quoi ?
La somme de toutes les lignes successives ayant la même référence, soit avec les variables de (i+1) jusqu'à (Dernligne2 - 2).
Sheets("Historique Production").Cells(Dernligne2, 5) = Application.WorksheetFunction.Sum(Range(Cells(i + 1, 5), Cells(Dernligne2 - 2, 5)))J'ai actuellement ceci qui me ressort 0.
bonjour,
proposition de correction
Sub FindeProde()
Dim k As Long
Dim nof As Long
Dim Dernligne As Long
Dim Dernligne2 As Long
Dim i As Long
nof = ThisWorkbook.Sheets("OF en cours").Range("H5").Value
If ThisWorkbook.Sheets("OF en cours").Range("G21").Value <> "" Then
For k = 4 To 300 Step 1
If (ThisWorkbook.Sheets("Historique Production").Cells(k, 1).Value = nof) Then
ThisWorkbook.Sheets("Historique Production").Cells(k, 7).Value = ThisWorkbook.Sheets("OF en cours").Range("G21").Value
Exit For
End If
Next k
Dernligne2 = Sheets("Historique Production").Range("A" & Rows.Count).End(xlUp).Row + 1
If Sheets("Historique Production").Cells(Dernligne2 - 1, 6) > 1 Then
'on met les infos de production en dernière ligne
Sheets("Historique Production").Cells(Dernligne2, 1) = nof
Sheets("Historique Production").Cells(Dernligne2, 2) = Now()
Sheets("Historique Production").Cells(Dernligne2, 4) = Sheets("Historique Production").Cells(Dernligne2 - 1, 4)
Sheets("Historique Production").Cells(Dernligne2, 6) = Sheets("Historique Production").Cells(Dernligne2 - 1, 6)
For i = Dernligne2 - 1 To 4 Step -1
' on recherche la première ligne de la succession de lignes contenant le même nof
If Not Sheets("Historique Production").Cells(i, 4) = Sheets("Historique Production").Cells(i + 1, 4) Then
Sheets("Historique Production").Cells(Dernligne2, 5) = Application.WorksheetFunction.Sum(Range(Cells(i + 1, 5), Cells(Dernligne2 - 1, 5)))
Sheets("Historique Production").Select
Range(Cells(i + 1, 1), Cells(Dernligne2 - 1, 1)).Select
Selection.Rows.Group
ActiveSheet.Outline.ShowLevels RowLevels:=1
Exit For
End If
Next i
End If
ActiveWorkbook.Save
End If
End SubCa fais bien plus ordonné merci
Par contre la somme ne marche toujours pas
Je fais une petite mise à jour également car les lignes se groupait mal. J'ai trouvé d'où venait le problème, voici mon nouveau code :
For i = Dernligne2 - 1 To 4 Step -1
If Sheets("Historique Production").Cells(i, 1).Value <> Sheets("Historique Production").Cells(i - 1, 1).Value And Sheets("Historique Production").Cells(i, 1) <> "" Then
Sheets("Historique Production").Cells(Dernligne2, 5) = Application.WorksheetFunction.Sum(Range(Cells(i, 5), Cells(Dernligne2 - 1, 5)))
Sheets("Historique Production").Select
Range(Cells(i, 1), Cells(Dernligne2 - 1, 1)).Select
Selection.Rows.Group
ActiveSheet.Outline.ShowLevels RowLevels:=1
Exit For
End If
Next iEnfaite au lieu de comparer la ligne (i) à la ligne (i+1), je la compare a (i-1) vu qu'on remonte le tableau. Cela devait provoquer une erreur dans le calcul de i et groupait que les 2 premières lignes systématiquement.
Le groupage de ligne se fait maintenant parfaitement et cela permet de mettre des (i) au lieu de (i+1) dans chaque formule du code.
Peuto
Bon eh bien vu que la formule de la somme est capricieuse, je me suis dit qu'une petite boucle serait mieux et ca marche niquel
For i = Dernligne2 - 1 To 4 Step -1
If Sheets("Historique Production").Cells(i, 1).Value <> Sheets("Historique Production").Cells(i - 1, 1).Value And Sheets("Historique Production").Cells(i, 1) <> "" Then
For j = i To Dernligne2 - 1 Step 1
Sheets("Historique Production").Cells(Dernligne2, 5) = Sheets("Historique Production").Cells(Dernligne2, 5) + Sheets("Historique Production").Cells(i, 5)
Next j
Sheets("Historique Production").Select
Range(Cells(i, 1), Cells(Dernligne2 - 1, 1)).Select
Selection.Rows.Group
ActiveSheet.Outline.ShowLevels RowLevels:=1
Exit For
End If
Next iAffaire résolue
Merci de toute l'aide que tu m'as apportée H2so4.
Passe une bonne journée !
Bonjour,
j'ai dû mal à comprendre où est le problème.
peux-tu mettre un exemple du résultat incorrect (et pourquoi il est incorrect) et du résultat que tu attends.
Pour le problème de la somme, le résultat restait à 0.
Sur l'image on peut voir qu'il y a 10 lignes pour chaque référence.
Pour la 1ere référence "50303TOSE" j'ai utilisé la fonction Sum, le resultat me retournait 0 comme tu peux voir.
Ensuite j'ai fais l'autre référence avec la boucle, et là la somme des 10lignes se fait bien.
Je refais le code pour te montrer ce que ca me faisais pour le groupage, j'en ai pour quelques minutes.
For i = Dernligne2 To 4 Step -1
If Not Sheets("Historique Production").Cells(i, 4) = Sheets("Historique Production").Cells(i + 1, 4) ThenVoila comment était écrit mon code ou l'erreur se produisait.
Théoriquement le (i) devait aller jusqu'à la 1ere cellule avec une référence différente.
Mais voila en image ce que cela me faisait.
Les références sont identiques mais les lignes ne se groupait pas jusqu'au bout.
Peuto
Je suis de retour, mais pas pour vous jouer un mauvais tour
Je vous expose le problème :
Donc les lignes ayant la même référence se groupent parfaitement bien. Seulement, parfois il est possible que la même référence soit reprise. Prenons le cas que je vous mets en image, l'ordre de fabrication (OF) a été fais en 2fois, il m'as donc imbriqué le 1er groupe dans le nouveau car il voit que la référence est identique.
Je souhaite donc trouver le code qui me permets de les dissocier, afin de pouvoir les regrouper tous ensemble par la suite.
J'ai testé un code mais il ne marche pas et je ne trouve rien d'autre :
Range(Cells(i, 1), Cells(Dernligne2 - 1, 1)).Select
If Rows(i).EntireRow.Hidden = True Then
Selection.Rows.Ungroup
End If
Selection.Rows.Group
ActiveSheet.Outline.ShowLevels RowLevels:=1Vu que la référence est la meme, au lieu que le (i) s'arrête à la ligne 123, il s'arrete à la ligne 119 dans le cas de l'image. J'ai donc voulu vérifier si la ligne (i) était caché, mais cela ne marche pas. Peut-être que ma condition n'est pas bonne ?
Dans l'espoir que vous pourrez m'aider
Peuto
Bon J'ai réussi à régler mon problème 8) Je viens vous donner la solution.
Le problème c'est que VBA provoque une erreur de code si il n'y a pas de lignes à dégrouper dans la sélection.
Alors j'ai mis une condition la noix, comme ca le code du dégroupage s'exécute systématiquement et je l'ai combiné avec un "On Error Resume Next" qui permettra au code de continuer en cas d'erreur. Voila ma solution :
On Error Resume Next
If Cells(i, 1) = nof Then
Selection.Rows.Ungroup
End If
Selection.Rows.Group
ActiveSheet.Outline.ShowLevels RowLevels:=1Vous remerciant à nouveau le forum et spécialement H2so4 !
Bon week end !
bonjour,
bravo pour ta persévérance.
n'oublie pas de mettre un on error goto 0 après le end if. pour détecter d'autres erreurs qui pourraient survenir. plus loin dans l'exécution du code.