Microsoft 365 VBA

blancolie

XLDnaute Impliqué
Bonjour le forum,

j'aimerais comprendre certaines expressions trouver ds le codage VBA.

tablo(i, 4)) : le i veut dire quoi et tablo également ?
For i ?

merci de votre aide
 

blancolie

XLDnaute Impliqué
bonjour dans ce code suivant :

VB:
If Not vide And LCase(IIf(fournisseur = "", "", tablo(i, 4)) & Chr(1) & tablo(i, 1)) Like critere Then
        n = n + 1
        resu(n, 1) = tablo(i, 4)
        resu(n, 2) = tablo(i, 1)
        resu(n, 3) = tablo(i, 2)
        resu(n, 4) = tablo(i, 5)
        resu(n, 5) = tablo(i, 6)
    End If


tablo, c'est le nom du tableau qu on a déclaré et je suppose que resu c'est pareil. et N et I représente bien les lignes je suppose ?

Merci.
 

blancolie

XLDnaute Impliqué
bonjour dans ce code suivant :

VB:
If Not vide And LCase(IIf(fournisseur = "", "", tablo(i, 4)) & Chr(1) & tablo(i, 1)) Like critere Then
        n = n + 1
        resu(n, 1) = tablo(i, 4)
        resu(n, 2) = tablo(i, 1)
        resu(n, 3) = tablo(i, 2)
        resu(n, 4) = tablo(i, 5)
        resu(n, 5) = tablo(i, 6)
    End If


tablo, c'est le nom du tableau qu on a déclaré et je suppose que resu c'est pareil. et N et I représente bien les lignes je suppose ?

Merci.
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonsoir @blancolie :)

D'après ce que je comprends et devine, en français sans VB:

Préparation :
  • On lit des données issues d'une feuille de classeur qu'on place dans un tableau de nom tablo (variable tablo)
  • On déclare sans doute un tableau resu qui sera le résultat souhaité (variable resu)

Traitement :
  • On va parcourir les lignes du tableau tablo en incrémentant la variable i
  • Si les valeurs de la ligne i répondent à certaines conditions alors :
  • on va écrire des données dans la tableau résultat à une ligne plus bas que la dernière ligne écrite (c'est pourquoi on incrémente n via n=n+1). On écrit les données dans resu à la ligne n.
A la fin :
  • A la fin de la boucle les résultats sont dans le tableau resu et le nombre de lignes écrites dans le tableau est n (si on a commencé à écrire à la ligne 1)
  • En général, on transfert le tableau résultat resu sur une feuille Excel

Donc i et n désigne (logiquement) un numéro de ligne de tableau (respectivement de tablo et de resu)
 
Dernière édition:

blancolie

XLDnaute Impliqué
je cherche à rajouter des critères sur ce code mais j'échoue. as tu une idée pour y arriver ? merci de ton aide

VB:
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, [B:F]) Is Nothing Then Exit Sub
Dim vide As Boolean, fournisseur$, critere$, tablo, resu(), i&, n&
vide = [B2] & [C2] & [D2] & [E2] = ""
fournisseur = [B2]
critere = LCase(fournisseur & Chr(1) & CStr([C2])) & "*"   'textes commenant par C2....
tablo = Sheets("BDD_Technique").[A2].CurrentRegion.Resize(, 6) 'matrice, plus rapide
ReDim resu(1 To UBound(tablo), 1 To 7)
For i = 2 To UBound(tablo)
    If Not vide And LCase(IIf(fournisseur = "", "", tablo(i, 4)) & Chr(1) & tablo(i, 1)) Like critere Then
        n = n + 1
        resu(n, 1) = tablo(i, 4) 'Numero 4 = Fournisseur / resu(n, 1) = B
        resu(n, 2) = tablo(i, 1) 'Numero 1 = plante /resu(n, 2) = C
        resu(n, 3) = tablo(i, 2) 'Numero 2 = couleur/resu(n, 3) = D
        resu(n, 4) = tablo(i, 5) 'Numéro 5 = contenance / resu(n, 4) =E
        resu(n, 5) = tablo(i, 6)  'Numero 6 = Marché / resu(n, 5) =F
    End If
Next
'---restitution---
Application.EnableEvents = False 'd_sactive les _vnementssss
If FilterMode Then ShowAllData 'si la feuille est filtr_e
With [B5] '1re cellule de restitutionnnn
    If n Then
        .Resize(n, 7) = resu
        .Resize(n, 7).Borders.Weight = xlThin 'bordures
    End If
    .Offset(n).Resize(Rows.Count - n - .Row + 1, 7).ClearContents 'RAZ en dessous
    .Offset(n).Resize(Rows.Count - n - .Row + 1, 7).Borders.LineStyle = xlNone
End With
Columns(3).AutoFit 'ajustement largeur
ActiveWindow.ScrollRow = 1 'cadrage
With UsedRange: End With 'actualise la barre de d_filement verticale
Application.EnableEvents = True 'r_active les _vnementssss
End Sub
 

Pièces jointes

  • Fichier demande de devis1.xlsm
    83.3 KB · Affichages: 6

mapomme

XLDnaute Barbatruc
Supporter XLD
Re,

Je ne connais pas ton code.
resu est une variable. On peut la nommer comme on veut : resu, tabloresultat, toto, mavariable.
Tout comme la variable i qui contient un nombre ou la variable n qui contient aussi un nombre.
(le terme "contenir" est impropre mais suffit largement quand on débute)

Affecter du texte à une variable nombre aboutira à une erreur. Affecter un nombre à une variable texte aboutira à une erreur (c'est plus compliqué en VBA, mais ça devrait être comme ça)

Dans le code, on a l'instruction :
VB:
tablo = Sheets("BDD_Technique").[A2].CurrentRegion.Resize(, 6)
Que fait cette instruction ? Grosso modo, elle ordonne à VBA de placer les valeurs d'une plage d'une feuille Excel (la base de données qui nous intéresse) dans un tableau nommé tablo.

A ce stade, tablo est donc un tableau qui comporte autant de ligne que la base de donnée. Ce nombre de ligne de table s'écrit : UBound(tablo)

Avec ces renseignements, on va déclarer un tableau pour stocker le résultat. Ce tableau, on le nomme resu. On va le dimensionner à autant de ligne que tablo et avec 7 colonnes:
Code:
ReDim resu(1 To UBound(tablo), 1 To 7)
 

blancolie

XLDnaute Impliqué
tablo = Sheets("BDD_Technique").[A2].CurrentRegion.Resize(, 6), cette ligne va récupérer les infos dans l'onglet BDD_technique.

ce code n'est pas de moi mais me plait mais rajouter des critères car je veux que le filtrage soit le plus précis. regarde mon fichier post 51
 

Statistiques des forums

Discussions
312 211
Messages
2 086 294
Membres
103 171
dernier inscrit
clemm