Minitableur excel avec flexgrid

Soyez le premier à donner votre avis sur cette source.

Vue 6 003 fois - Téléchargée 1 188 fois


Description

après plusieurs recherches sur le site et sur internet pour trouver un exemple de code pour un tableur en vb6, je me suis mis en tête de le construire moi-même.ce tableur n'est pas aussi complet que excel mais il permet de voir comment jouer avec les propriétés et méthodes du contrôle msflexgrid.

Source / Exemple :


Dim i, j, k, R, c As Long

Private Sub Combo_Click()
'procedure pour les operations

Dim s, min, max As Long       'variable qui doit contenir le resultat
Dim cpt As Integer

   If (Combo.ListIndex = 0) Then             'si on clique sur le 1er elt alors
      s = 0                                  'initialisation du résultat
      For i = 1 To grille.ColSel - 1         'boucle de parcours jusqu'a l'avant dernière cellule
          If (grille.TextMatrix(grille.RowSel, i) <> "") Then       'si la cellule n'est pas vide alors
             If (IsNumeric(grille.TextMatrix(grille.RowSel, i))) Then
                Text1.Text = grille.TextMatrix(grille.RowSel, i)         'on fait passer la valeur de la cellule courante dans la textbox
                s = s + Val(Text1.Text)                                  'et on additionne
             End If
          End If
      Next
      grille.TextMatrix(grille.RowSel, grille.ColSel) = s             'on fait glisser le resultat dans la cellule selectionnee
   End If
   If (Combo.ListIndex = 1) Then                                  'on fait pareil pour les autres opérations
      s = 1
      For i = 1 To grille.ColSel - 1
          If (grille.TextMatrix(grille.RowSel, i) <> "") Then
             If (IsNumeric(grille.TextMatrix(grille.RowSel, i))) Then
                Text1.Text = grille.TextMatrix(grille.RowSel, i)
                s = s * Val(Text1.Text)
             End If
          End If
      Next
      grille.TextMatrix(grille.RowSel, grille.ColSel) = s
   End If
   If (Combo.ListIndex = 2) Then
      s = 0
      For i = 1 To grille.ColSel - 1
          If (grille.TextMatrix(grille.RowSel, i) <> "") Then
             If (IsNumeric(grille.TextMatrix(grille.RowSel, i))) Then
                Text1.Text = grille.TextMatrix(grille.RowSel, i)
                s = (Val(Text1.Text)) - s
             End If
          End If
      Next
      grille.TextMatrix(grille.RowSel, grille.ColSel) = s
   End If
   If (Combo.ListIndex = 3) Then
      For i = 1 To grille.ColSel - 1                  'boucle pour stocker la 1ere valeur dans min en tant que valeur minimu au depart
          If (IsNumeric(grille.TextMatrix(grille.RowSel, i))) Then   'si l'expression est numerique alors
             min = Val(grille.TextMatrix(grille.RowSel, i))       'le minimum est la 1ere valeur numerique trouvée
             Exit For                      'on sort de la boucle
          End If
      Next
      For i = 1 To grille.ColSel - 1
          If (grille.TextMatrix(grille.RowSel, i) <> "") Then
             If (IsNumeric(grille.TextMatrix(grille.RowSel, i))) Then
                If (Val(grille.TextMatrix(grille.RowSel, i)) < min) Then min = Val(grille.TextMatrix(grille.RowSel, i))    'si la valeur est numerique et qu'elle est plus petite que le minimum alors cette valeur devient le minimum
             End If
          End If
      Next
      grille.TextMatrix(grille.RowSel, grille.ColSel) = min          'affiche le minimu dans la cellule selectionnée
   End If
   If (Combo.ListIndex = 4) Then
      s = 0
      cpt = 0
      For i = 1 To grille.ColSel - 1
          If (grille.TextMatrix(grille.RowSel, i) <> "") Then
             If (IsNumeric(grille.TextMatrix(grille.RowSel, i))) Then
                Text1.Text = grille.TextMatrix(grille.RowSel, i)
                s = s + Val(Text1.Text)
                cpt = cpt + 1
             End If
          End If
      Next
      grille.TextMatrix(grille.RowSel, grille.ColSel) = s / cpt
   End If
   If (Combo.ListIndex = 5) Then
      For i = 1 To grille.ColSel - 1
          If (IsNumeric(grille.TextMatrix(grille.RowSel, i))) Then       'idem que pour le maximum
             max = Val(grille.TextMatrix(grille.RowSel, i))
             Exit For
          End If
      Next
      max = Val(grille.TextMatrix(1, 1))
      For i = 1 To grille.ColSel - 1
          If (grille.TextMatrix(grille.RowSel, i) <> "") Then
             If (IsNumeric(grille.TextMatrix(grille.RowSel, i))) Then
                If (Val(grille.TextMatrix(grille.RowSel, i)) > max) Then max = Val(grille.TextMatrix(grille.RowSel, i))
             End If
          End If
      Next
      grille.TextMatrix(grille.RowSel, grille.ColSel) = max
   End If
End Sub

Private Sub Form_Load()
  
  
  'je fais d'abord le design de la grille
  
  
  grille.Rows = 51          'je place le nombre de lignes a 50
  grille.Cols = 51          'je place aussi le nombre de colonnes a 50
  grille.RowHeight(0) = 400      'je definis la taille des lignes par defaut
  grille.ColWidth(0) = 400       'je definis la taille descolones par defaut
      
  'initialisation des variables compteurs pour les en-tetes de colonnes avec le code ascii de A
  
  j = 65
  k = 65
  
  'boucles pour mettre les lettres des colonnes fixes
  
  For i = 1 To 26               'pour commencer a la 2eme colonne et liste les lettres de A a Z
      grille.TextMatrix(0, i) = Chr(j)                'inscrit la lettre dans la cellule correspondante par conversion du code ascii
      j = j + 1                       'incremente le code ascii pour passer a la lettre suivante
  Next i
  j = 65        'reinitialisation de j a A
  
  For i = i To grille.Cols - 1       ' pour commencer après la lettre Z
      grille.TextMatrix(0, i) = Chr(j) & Chr(k)   'recommence le comptage des lettres avec 2lettres
      k = k + 1
  Next i
  
  'boucle pour numeroter les lignes
  
  For i = 1 To grille.Rows - 1
      grille.TextMatrix(i, 0) = i
  Next i
  
  'boucle pour centrer les lettres a l'interieur des colonnes
  
  For i = 1 To grille.Cols - 1         'j'initialise tjrs i a 1 pour ne pas prendre en compte la 1ere cellule
      grille.ColAlignmentFixed = flexAlignCenterCenter
  Next i
  
  'initialisation de la boite de saisie a la taille des cellules
  
  Text1.Width = grille.CellWidth
  Text1.Height = grille.CellHeight
  Text2.Text = "A1"
End Sub

Private Sub Form_Resize()

  'une astuce personnelle dont je suis particulièrement contant qui consiste a redimensionner la grille en fonction de la form @eba-zogo lionel junior(lez-j)
  
  grille.Height = Form1.Height - 1000
  grille.Width = Form1.Width - 500
  
End Sub

Private Sub grille_Click()
   'gestion de l'affichage de la position courante
   
    Text1.Visible = False                  'quand l'utilisateur clique sur la grille la textbox est masquée
    Text2.Text = grille.TextMatrix(0, grille.ColSel) & grille.RowSel         'la deuxiemme textbox affiche la lettre de la colonne et le numéro de la ligne donc la position
    
    
End Sub

Private Sub grille_DblClick()
'procédure de saisie d'informations dans les cellules de la grille

    Dim ch As String       'je déclare une variable pour reccueillir le contenu de la cellule
    Text1.Visible = False
    ch = grille.TextMatrix(grille.RowSel, grille.ColSel)
    Text1.Text = ch        'le contenu de la cellule est trasféré dans la textbox
    Text1.Left = grille.ColPos(grille.ColSel) + 265
    Text1.Top = grille.RowPos(grille.RowSel + 1) + 265
    Text1.Visible = True                             'je rends le textbox visible
    'allignement du textbox sur la cellule
    'et je passe le focus au textbox
    Text1.SetFocus
    For i = 1 To grille.Rows
        For j = 1 To grille.Cols
            grille.CellBackColor = &HFFFFFF
        Next
    Next
    'EBA-ZOGO Lionel junior
End Sub

Private Sub grille_GotFocus()
' procedure pour passer le focus à la grille et faire passer la textbox a la cellule ki a le focus
  Text1.Text = ""
  Text1.Left = grille.ColPos(grille.ColSel) + 265
  Text1.Top = grille.RowPos(grille.RowSel) + 265
  End Sub

Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
' cette procedure gere l'appui sur la touche entrée
  
  'j'utilise des variables pour incrémenter le parcours des lignes et des colonnes
  
  R = grille.RowSel + 1
  c = grille.ColSel + 1
  Do                                                                'je fais une boucle pour répéter l'opéation
     If (KeyCode = vbKeyReturn) Then                                      'si la touche entrée a été enfoncé
        grille.TextMatrix(grille.RowSel, grille.ColSel) = Text1.Text       'la cellule courante prend la valeur de la textbox
        Text1.Visible = True
        Text1.Left = grille.ColPos(grille.ColSel) + 265
        Text1.Top = grille.RowPos(R + 1) + 265
        grille.RowSel = R                                                'passage du paamete de la cellule suivante
        i = 1
        Text1.Text = grille.TextMatrix(grille.RowSel, grille.ColSel)      'la textbox prend la valeur de la nouvelle cellule sélectionnée donc vide si la cellule est vide
        Text1.SetFocus
     End If
  Loop While (grille.RowPos(R) < grille.Rows - 1)
  
End Sub

Conclusion :


je l'ai fait pour que certaines personnes n'aient plus à se casser la tete. vous pouvez le modifier à volonté.

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
10
Date d'inscription
jeudi 28 avril 2005
Statut
Membre
Dernière intervention
22 décembre 2010

Bonjour à tous,

j'ai pu remarquer un petit bug.
Celui-ci est provoqué par le double click sur la dernière ligne.

Cependant il reste sympathique comme petit tuto.
Messages postés
66
Date d'inscription
samedi 14 août 2004
Statut
Membre
Dernière intervention
5 juillet 2013

ok merci de vos remarques et encouragements
je vous promets d'en tenir compte et d'améliorer le projet et biensur il sera toujours disponible pour tout le monde.
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
18
Quand tu dimensionnes tes variables, donne un type à chacune d'elles

Dim i, j, k, R, c As Long

Seul "c" est de type Long.
Le reste est Variant.

Bonne continuation.
Messages postés
19
Date d'inscription
samedi 19 juin 2004
Statut
Membre
Dernière intervention
12 janvier 2010

Il faut juste faire attention aux erreurs de division par zéro, surtout pour le calcul de la moyen , aussi prévoir une gestion d'erreur lorsq'on clique sur les colonnes ou sur les lignes.
exemple de gstion d'erreur :
grille.TextMatrix(grille.RowSel, grille.ColSel) = s / cpt
il faut vérifier si cpt est différent de 0.
grille.TextMatrix(grille.RowSel, grille.ColSel) = iif(cpt<>0 ,s / iif(cpt<>0,cpt,1),"###")
A part ça , c'est bon code, bonne continuation.
Messages postés
114
Date d'inscription
lundi 5 février 2007
Statut
Membre
Dernière intervention
10 septembre 2010

Salut,

à priori ton fichier doc est corrompu !
Contient-il des infos/astuces ???

sinon ça a l'air sympa.
Prochaine étapes : onglets + fonctions + vba et excel n'aura qu'à bien se tenir !!!
Afficher les 7 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.