La boucle ne se fait pas
Bonjour tout le monde. Dans le but d'automatiser ou semi-automatiser beaucoup de tâches professionnelles à divers postes de mon travail, j'ai entrepris de me former de manière autodidacte (pas de formations possibles...) au code VBA, puisque nous travaillons beaucoup avec des documents Excel (gestion des stocks, gestions comptables, extraction de logiciels de GEF, ...). Voici un premier sub, lequel est lancé depuis un fichier pattern, récupère les info d'un autre fichier, et les place dans un tableau modèle. Le code est le suivant, donc :
Sub Facture_CDS_Pasteur()
Application.DisplayAlerts = False ' n'affichera pas les messages d'alertes et d'invit
Application.ScreenUpdating = False ' n'affichera pas les maj successives de la procédure à l'écran, donc l'exécution sera plus rapide
Application.Calculation = xlCalculationManual ' le calcul est effectué sur demande de l'utilisateur, et non automatiquement si changement (de données, formules, ...)
Workbooks.Open "C:\Users\pha33\Downloads\2022_Facture_CDS_Pasteur.xlsx"
'pour simplifier la navigation, on copie et colle le feuillet du doc BI4 dans un feuillet de la facture
Dim cln As Worksheet, colonne As Worksheet, clnn As New Worksheet
Set cln = Workbooks("2022_Facture_CDS_Pasteur.xlsx").Sheets(1)
Set colonne = Workbooks("lancement macro CDS PASTEUR - Mmmm yy.xlsm").Sheets(1)
Set clnn = Workbooks("lancement macro CDS PASTEUR - Mmmm yy.xlsm").Sheets(2)
cln.Columns("F:F").Select
Selection.NumberFormat = "0.00%"
Selection.Columns.AutoFit
cln.Copy Before:=Workbooks("lancement macro CDS PASTEUR - Mmmm yy.xlsm").Sheets(2)
Workbooks("2022_Facture_CDS_Pasteur.xlsx").Close Savechanges:=True
'renomme le premier onglet
colonne.Select
colonne.Name = Format(Now, "dd-mm-yyyy")
' remplir la facture
Dim lgn As Integer, ligne As Integer, deux As Integer, cinq As Integer, dix As Integer, vingt As Integer
lgn = 5
ligne = 20
'deux = clnn.Application.WorksheetFunction.CountIf(Columns("F:F"), "2.10%")
'cinq = clnn.Application.WorksheetFunction.CountIf(Columns("F:F"), "5.50%")
'dix = clnn.Application.WorksheetFunction.CountIf(Columns("F:F"), "10%")
'vingt = clnn.Application.WorksheetFunction.CountIf(Columns("F:F"), "20%")
Do While clnn.Cells(lgn, 6).Value = "0.021"
If colonne.Range("A" & ligne).MergeArea = "" Then
colonne.Cells(ligne, "1:4") = clnn.Cells(lgn, 1).Value
colonne.Cells(ligne, 5) = clnn.Cells(lgn, 4).Value
colonne.Cells(ligne, 6) = clnn.Cells(lgn, 5).Value
ElseIf colonne.Range("A" & ligne).MergeArea <> "" Then
colonne.Rows(ligne).EntireRow.Select
Selection.Copy
Selection.Insert Shift:=xlDown
colonne.Cells(ligne, "1:4") = clnn.Cells(lgn, 1).Value
colonne.Cells(ligne, 5) = clnn.Cells(lgn, 4).Value
colonne.Cells(ligne, 6) = clnn.Cells(lgn, 5).Value
End If
lgn = lgn + 1
ligne = ligne + 1
Loop
End SubMon problème est que la tableau ne se rempli pas ; il devait prendre les valeurs à un endroit précis (cellules A5, D5, E5) selon une condition (tva = 2.1%), et les mettre dans le tableau voulu selon condition ( si cellule vide, alors ok, sinon création d'une ligne identique juste au-dessus et on rempli).
J'ai fait des tests msgbox (clnn.cells(5,6).value)), et la fenêtre n'affiche aucune valeur, tandis qu'elle devrait afficher 2.1% ou 0.021. Idem pour cln. Ceci soutendrait donc que ma déclaration range clnn ou cln n'est pas bonne, d'où la non réaction du sub ?
Voici le tableau pattern, pour que vous compreniez où et comment le remplissage doit se faire. J'espère avoir été assez complet et compréhensible. Pouvez-vous m'y aider svp ?
Bonjour
Au lieu de
Do While clnn.Cells(lgn, 6).Value = "0.021"tester (avec cln, pas clnn) et col 8 au lieu de 6 et la valeur sans la partie entière et une virgule
Do While Format(cln.Cells(20, 8).Value, "#.###") = ",021"Re! Merci pour votre prompt retour. En effet, le fait de passer par l'application "format" passe bien ! Un fois ceci corrigé, la boucle s'est mise à opérer, mais des messages d'erreur sont apparus pour las applications .MergeArea et Cells(ligne, "1:4"). Comment déclare-t'on une application MergeArea du coup ? Si on souhaite déclarer uns cellule résultant d'une fusion, comment la déclarer dans un objet range ou cells ?
Sinon, quand les cellules sont vides, elles se remplissent convenablement, mais si la cellule devant récupérer les valeurs est pleine, l'insert de la ligne ne s'effectue pas et la boucle s'arrête. Auriez-vous une explication ?
C'est bon, j'ai trouvé la faille!
Le fichier qui servait de "donneur de valeurs", des cellules fusionnées existaient!!!!! Ainsi, dès que la boucle tombait sur la première ligne fusionnée, cela s'arrêtait, car considérée comme vide je suppose... Aaaaah, ces requêteurs!!!!!!!
Il a donc fallut qu'après le copier-coller du feuillet voulu, je sélectionne le tout, unmerge et suppressions de lignes vides. C'est fait donc, merci beaucoup ^^