Problème code débutant VBA

Bonjour,

Je suis un grand débutant VBA, j'essaie de faire en VBA ce que je faisais auparavant par formule.

Sur la feuille f1 j'ai une liste de mouvement de vacancier qui vont d'un poit A à un point B, seul ceux qui vont ou viennent de disney m'interessent. Je veut donc les comptabiliser par date, heure et mouvement (sens), seul le nombres de passager (Pax) total m'intérèsse égalemment (pas bébé, enfant, adultes).

Avec mon code, le tableau sur la feuille f2 se remplit mais mal ( on compare avec le deuxième tableau qui est rempli avec des formules et qui est juste). Il manque donc sur le premier tableau de f2 plusieur ligne présente sur le second.

Je ne suis pas assez calé ppour arriver à trouver mon erreur c'est pour cela que je fais appel à la communauté excel-pratique.

Voici le code et le fichier en téléchargement.

 
Sub xPlore()

 Dim i As Integer              'Déclaration de i, n° de ligne dans F1
 Dim j As Integer              'Déclaration de j, n° de colonnes des heures dans F2
 Dim k As Integer             'Déclaration de k, n° de ligne des heures dans F2
 Dim m As Integer            ''Déclaration de m, n° colonnes dans F2 pour les sens
 Dim z As Integer              'Déclaration de z, nbr de pax
 Dim NbLg As Integer
 Dim F1 As Worksheet
 Dim F2 As Worksheet

  Application.ScreenUpdating = False
  Set F1 = Sheets("f1")
  Set F2 = Sheets("f2")
  F2.Range("F7 : I194").ClearContents

  j = 5
  k = 7
  z = 0

  With F1

    NbLg = .Range("A" & Rows.Count).End(xlUp).Row
    For i = 2 To NbLg

        If .Range("E" & i) = F2.Cells(3, j) Then                                                       ' On recherche la date de f2 dans f1
            For k = 7 To 194                                                                                     ' on attribue à k les lignes d'heures des tablaux récap de F2
                If F1.Range("S" & i) = F2.Range("E" & k) Then                                  'dans le cas ou l'on trouve la date, on cherche l'heure
                   For m = 6 To 9                                                                                  'colonnes de f2 contenant le sens
                        If F1.Range("P" & i) = F2.Cells(6, m) Then                                 'on cherche le sens de f2 dans f1
                           z = F1.Range("K" & i)                                                               ' on nomme z le nbr de pax de la ligne concérnée
                           F2.Cells(k, m) = F2.Cells(k, m) + z                                          ' on additionne les pax et on affiche le nbr dans la cellule concérnée
                        End If
                    Next m
                End If
            Next k
        End If

     Next i

   End With

End Sub
23entrainement-vba.xlsm (163.10 Ko)

Bonjour,

pourquoi pas un TCD qui est étudié pour et fait ça tout seul ? Plus que la mise en forme à faire.

Tu peux même regrouper par heure si tu veux un tableau plus lisible avec moins de lignes.

eric

PS: pour ton code As Integer est un peu juste (->256).

Déclare As Long

10entrainement-vba.xlsm (241.54 Ko)

Bonjour et merci de vous intéresser à mon cas.

Je préfère ce format car pour tenir les 300ko j'ai effacé les autres tableaux de f2 mais il y en a 31 (un par jour) et visuellement je peux voir ce qui m'attend chaque jour du mois en un coup d’œil ( et je copie-colle tout cela dans un autre fichier dans lequel je fais des stats depuis des années) il me suffit de mettre la date du premier jour du mois et les 31 jours se remplissent. Cependant j'ai supprimé plein de ligne pour rentrer dans les 300ko mais il peux y en avoir plus de 7000 couvrant plusieurs mois. Pa formules comme je faisais avant ça fonctionne très bien mais je voulais le faire par VBA car je découvre celui-ci et veux m'améliorer.

J'ai suivi les premières pages du cours VBA d'excel-pratique et il est écrit pour les variables :

Byte Numérique Nombre entier de 0 à 255.

Integer Numérique Nombre entier de -32'768 à 32'767.

et donc je pensait que "integer" était suffisant, mais je vais tester avec "long"

Bonjour,

le vba est il nécessaire ?

un tcd peut convenir non ?

oups : pas rafraichi... hello Eriiic

P.

La solution VBA me plait plus mais je n'y arrive pas

visuellement je peux voir ce qui m'attend chaque jour du mois en un coup d’œil

Avec un TCD aussi.

Tu peux regrouper par année, mois, filtrer ce que tu veux (avec des segments éventuellement) etc

Personnellement je ne suis pas un adepte de refaire en vba ce qu'excel fait déjà beaucoup mieux avec les fonctionnalités de base.

eric

Je viens de tester avec "long" au lieu de "integer" mais le problème persiste...


Merci eeric, tu as tout à fait raison, le TCD conviendrais parfaitement (patrick1957 m'en a fait un très beau), mais j'éssai en VBA pour le plaisir et m'excerser );

Sans tester car je ne tiens pas à rechercher laquelle des 999 lignes te manque je pense que tu risques d'être exposé au problème de perte de précision sur les heures.

Essaie avec :

If round(F1.Range("S" & i),8) = round(F2.Range("E" & k),8) Then

Par ailleurs ton code ira 100 fois plus vite si tu charges toutes les données dans une variable tableau et que tu travailles avec plutôt que de lire les cellules une par une.

eric

re,

si beaucoup de lignes, il faudra passer par un dictionnaire alors et un tableau

P.

Merci eriiic ça fonctionne correctement, peut tu m'expliquer le

petit bout de code que tu m'as donnée ?

Pour ce qui est de la variable tableau ou dictionnaire, je ne sais pas le faire mais si un de vous peux me faire un exemple je lui serait reconnaissant.

Il faut arrondir les valeurs à 8 chiffres après la virgule pour les voir égales.

Ajoute ces les lignes sous celle modifiée pour visualiser la différence :

If F1.Range("S" & i) <> F2.Range("E" & k) Then
    MsgBox "F1 : " & F1.Range("S" & i) & vbLf & "F2 : " & F2.Range("E" & k) & vbLf & "mais différence = " & F1.Range("S" & i) - F2.Range("E" & k)
    Stop
End If

J'ai mis un stop que tu puisses visualiser les expression dans la fenêtre Espions.

Ex tableau et comment utiliser une des valeur(ligne,colonne) :

Dim tabl
tabl = F1.[A1].Resize(NbLg, 20).Value
MsgBox tabl(2, 3)

eric

Bonjour,

un petit truc à essayer mais je suis au bout de mes facultés

P.

9boban-test.xlsm (248.91 Ko)

Merci bcp pour les explication eriiic et jeteste et decortique patrick1957.

bonne soirée

Rechercher des sujets similaires à "probleme code debutant vba"