Avec VISUAL BASIC créer un tableau

Fermé
benny - 18 mars 2009 à 14:26
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 - 19 mars 2009 à 10:06
Bonjour,
je souhait faire un tableau:
j'ai deux colone -les lieus des pannes
-les pannes
je veux savoir le nombre de pannes par lieus. donc j'éfface les doublon de mes pannes et de mes lieus é je mets les lieus dans une colonne é mes pannes dans une ligne.
maintenant le problème sé l'équation ki va me permetre de sortir le nombre de pannes par lieu... jespère ke l'on poura m'aidé merci d'avance
je vous donne le début :


Sub installation()

ranger

compter

classement

edit_graphe

End Sub
_____________________________________________________________________________________

Sub ranger()
'j'écris les toutes les installations du query et j'éfface les doublons
'======================================================================
Worksheets("brouillon").Range("A2:E1000").Value = Null
Sheets("QUERY").Select
Range("I2:I1000").Select
Selection.Copy
Sheets("brouillon").Select
Range("B2").Select
ActiveSheet.Paste
Sheets("QUERY").Select
Range("D1:D1000").Select
Selection.Copy
Sheets("brouillon").Select
Range("A1").Select
ActiveSheet.Paste
' Range("A1").Select
Application.CutCopyMode = False
Range("A1:A1000").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range( _
"C1"), Unique:=True




End Sub
___________________________________________________________________________________________

Sub compter()

Worksheets("brouillon").Range("D2:E1000").Value = 0

lignea = 2
ligneb = lignea
lignec = 2

pasvide = True
test = Worksheets("brouillon").Cells(lignea, 1).Value
While pasvide = True
lignec = 2
pasvide1 = True
test1 = Worksheets("brouillon").Cells(lignec, 3).Value
While pasvide1 = True
If Worksheets("brouillon").Cells(lignec, 3).Value = Worksheets("brouillon").Cells(lignea, 1).Value Then
Worksheets("brouillon").Cells(lignec, 4).Value = Worksheets("brouillon").Cells(lignec, 4).Value + 1
Worksheets("brouillon").Cells(lignec, 5).Value = Worksheets("brouillon").Cells(lignec, 5).Value + Worksheets("brouillon").Cells(lignea, 2).Value
pasvide1 = False
End If

If Worksheets("brouillon").Cells(lignec, 3).Value <> Worksheets("brouillon").Cells(lignea, 1).Value Then
lignec = lignec + 1
End If
test1 = Worksheets("brouillon").Cells(lignec, 3).Value
If test1 = "" Then
pasvide1 = False
End If
Wend


lignea = lignea + 1
test = Worksheets("brouillon").Cells(lignea, 1).Value
If test = "" Then
pasvide = False
End If

Wend

Worksheets("brouillon").Range("A1:B1000").Value = Null

End Sub
A voir également:

8 réponses

lermite222 Messages postés 8724 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
18 mars 2009 à 14:59
bonjour,
beh à première vue y à pas photo
Tu vide la feuille
Worksheets("brouillon").Range("D2:E1000").Value = 0

lignea = 2
ligneb = lignea
lignec = 2

pasvide = True
ensuite tu veux savoir ce qu'il y a dedans
test = Worksheets("brouillon").Cells(lignea, 1).Value
mais bien sûr c'est zéro puisque 3 ligne plus haut tu met tout à zéro ????
Alors ?? j'ai rien compris
A+
0
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
18 mars 2009 à 15:19
Bonjour,

Je ne comprends pas non plus pourquoi enlever les doublons s'il faut faire un comptage ??? ou alors j'ai pas tout bien compris ... :o|

Sinon voilà un exemple qui permet de compter les pannes par lieux et les pannes par type de pannes

Option Explicit

Private tabLieux()
Private TabPanne()
Private indLieux As Long
Private indPanne As Long


Sub main()

    indLieux = 0
    indPanne = 0

    initTableau
    
    comptePanneParLieu
    
    compteTypedePanneparPanne
    
End Sub

Public Sub initTableau()
Dim ws As Worksheet
Dim lig As Long

    Set ws = Worksheets(1)
    lig = 2
    ReDim tabLieux(indLieux)
    With ws
        While .Range("A" & lig).Value <> ""
            If doesExist(.Range("A" & lig).Value, tabLieux) = False Then
                ReDim Preserve tabLieux(indLieux)
                tabLieux(indLieux) = .Range("A" & lig).Value
                indLieux = indLieux + 1
            End If
        lig = lig + 1
        Wend
        
        lig = 2
        ReDim TabPanne(indPanne)
        While .Range("B" & lig).Value <> ""
            If doesExist(.Range("B" & lig).Value, TabPanne) = False Then
                ReDim Preserve TabPanne(indPanne)
                TabPanne(indPanne) = .Range("B" & lig).Value
                indPanne = indPanne + 1
            End If
        lig = lig + 1
        Wend
    End With
    
End Sub

Private Sub comptePanneParLieu()
Dim ws1 As Worksheet
Dim ws2 As Worksheet
Dim lig1 As Long
Dim lig2 As Long
Dim i As Long
Dim cpt As Long

    Set ws1 = Worksheets(1)
    Set ws2 = Worksheets(2)
    lig2 = 2
    
    With ws1
        For i = LBound(tabLieux()) To UBound(tabLieux())
            cpt = 0
            lig1 = 2
            While .Range("A" & lig1).Value <> ""
                If .Range("A" & lig1).Value = tabLieux(i) Then
                    cpt = cpt + 1
                End If
            lig1 = lig1 + 1
            Wend
            ws2.Range("A" & lig2).Value = tabLieux(i)
            ws2.Range("B" & lig2).Value = cpt
            lig2 = lig2 + 1
        Next i
    End With
    
End Sub

Private Sub compteTypedePanneparPanne()
Dim ws1 As Worksheet
Dim ws2 As Worksheet
Dim lig1 As Long
Dim lig2 As Long
Dim i As Long
Dim cpt As Long

    Set ws1 = Worksheets(1)
    Set ws2 = Worksheets(2)
    lig2 = 2
    
    With ws1
        For i = LBound(TabPanne()) To UBound(TabPanne())
            cpt = 0
            lig1 = 2
            While .Range("B" & lig1).Value <> ""
                If .Range("B" & lig1).Value = TabPanne(i) Then
                    cpt = cpt + 1
                End If
            lig1 = lig1 + 1
            Wend
            ws2.Range("D" & lig2).Value = TabPanne(i)
            ws2.Range("E" & lig2).Value = cpt
            lig2 = lig2 + 1
        Next i
    End With
End Sub

Private Function doesExist(ByVal str As Variant, ByRef tbl()) As Boolean
Dim i As Long

    For i = LBound(tbl()) To UBound(tbl())
        If tbl(i) = str Then
            doesExist = True
            Exit Function
        End If
    Next i
    
    doesExist = False
    
End Function


;o)

EDIT: J'ai apporté des corrections.
0
merci Polux31 mais il me di k'il ya pliein de "beug" (que 'ai esseiller de rectifier avec pas trop de succè)
pour se qui non pas compris
sur une page appellé brouillon
j'ai une première colonne avec les lieu des pannes (A) avec 1 nombre indéfini de lieu
j'ai une deuxième colonne avec les différente pannes (B) celon les lieus
a partir de sa je souhait sortir 1 tableau ki me donnera le nombre de panne par lieu
par exempl sur la ligne (sur la ligne 1 é a partir de la colonne E) je vais mettre les différentes pannes (pour sela jutilise le système des doublons)
ensuite je vais mettre les différent lieu(toujour le système des doublons) sur une colonne (a partir de la ligne 2 et la colonne E)
et la vien mon problème (ki me prend la tète depuis hier midi) je veu compter le nombre de pannes par lieu é l'écrire dans mon tableau.
voila si je pouvais avoir un petit coup de pouce sa marrangerè bien merci d'avance
0
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
19 mars 2009 à 09:30
Bonjour,

As-tu remarqué que j'avais apporté des corrections. Il suffit d'adapter à ton fichier (le nom des feuilles, les colonnes etc...). Ca fonctionne très bien chez moi.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 7 248
19 mars 2009 à 09:34
Bonjour,

Tu veux absolument le faire en vba ?
Sinon tu le tableau croisé dynamique (TCD) dans le menu données qui est prévu pour...
# Cliquer dans la base
# Données/Rapport de tableau croisé
# Cliquer sur Disposition
# Lieux en ligne, nbPannes en colonne, nbPannes dans données
# Double-clic sur nbPannes , puis Somme
et si tu veux approfondir les TCD : http://boisgontierjacques.free.fr/

eric
0
pour POLUX31: oui je pense que la majeur parite des beugs vien de l'adaptation mais il y'a certainne chose que je n'arrive pas à adapter comme
Private tabLieux()
Private TabPanne()
Private indLieux As Long
Private indPanne As Long
j'arrive pa a voir a quoi cela correspond.
pour eriiic: je veux ke celase face automtiquement donc sé pa super. mais j'ai utilisé ton idé pour enregistrer une macro mé s'est pa super
je continue a chercher é si quelqu'un a une idé k'il n'ézite pas merci d'avance
0
eriiic Messages postés 24603 Date d'inscription mardi 11 septembre 2007 Statut Contributeur Dernière intervention 15 décembre 2024 7 248
19 mars 2009 à 10:03
re,

c'était pas super car il fallait seulement Lieux en ligne et nbPannes dans données (pas nbPannes en colonne)
Et si tu rajoutes/modifies les données il faut 'actualiser les données' avec le ! rouge
http://www.cijoint.fr/cjlink.php?file=cj200903/cijjaseSzP.xls

eric
0
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
19 mars 2009 à 10:06
Private tabLieux() et Private TabPanne() sont, ce que l'on appelle des tableaux. Dans tabLieux on stocke les lieux, en passant pas la fonction doesExist(), on évite les doublons. Idem pour tabPanne qui stocke les pannes.

indLieux et indPanne sont des index utilisés pour allouer un élément en mémoire à chaque tableau.

Ensuite, la procédure comptePanneParLieu() compte combien de fois on trouve chaque élément du tableau tabLieux dans la colonne A, ce qui me donne le nombre de panne par lieu.

La procédure compteTypedePanneparPanne() compte de fois on trouve chaque élément du tableau tabPanne dans la colonne B, ce qui me donne le nombre de panne par type de panne.

Le résultat s'affiche dans l'onglet 2 du classeur.
0