Problème boucle

Bonsoir à vous,

je suis actuellement sur des macros afin de simplifier ma comptabilité mais j'ai un problème de boucle pouvez vous me dire pourquoi la boucle ne s'arrête pas svp ?

Private Sub ValiderSaisie_Click()
Dim x As Integer
x = 1
If D1.Value Like "1*" Then
Sheets("Comptes de Capital").Activate
ElseIf D1.Value Like "2*" Then
Sheets("Comptes d'Immobilisations").Activate
ElseIf D1.Value Like "3*" Then
Sheets("Comptes de Stocks et En-Cours").Activate
ElseIf D1.Value Like "4*" Then
Sheets("Comptes de Tiers").Activate
ElseIf D1.Value Like "5*" Then
Sheets("Comptes Financiers").Activate
ElseIf D1.Value Like "6*" Then
Sheets("Comptes de Charges").Activate
ElseIf D1.Value Like "7*" Then
Sheets("Comptes de Produits").Activate
Else
Sheets("Comptes Spéciaux").Activate
End If
Do Until Cells(x, 1).Value = D1.Value
x = x + 1
Loop
Cells(x, 2) = MD1.Value
End Sub

Merci à vous, bonne soirée

Bonjour,

A mon avis, elle ne s'arrête pas parce que la condition n'est jamais remplie.

Ici, la boucle n'est pas nécessaire donc voici une proposition de modification avec la fonction match (équivalent de EQUIV) :

Private Sub ValiderSaisie_Click()

dim tfeuilles as variant, sname as string, ligne as long

tfeuilles = array("Capital", "Immos", "Stocks", "Tiers", "Treso", "Charges", "Produits", "Spe") '<<< NOMS SIMPLIFIES (ce serait mieux)
sname = tfeuilles(-1 + left(D1.Value, 1)*1) 'racine de compte détermine l'item à renvoyer (! -1 car tfeuilles est en base 0 !)

with sheets(sname) 'avec feuille obtenue
    ligne = application.match(D1.value*1, .columns(1), 0) 'ligne = position corresp. D1.value dans colonne 1
    .cells(ligne, 2) = MD1.value 'sur cette ligne, en col2, valeur de M1
end with

End Sub

CODE EDITE

Cdlt,

Bonsoir 3GB,

Question du soir pour application.match : Mieux de le faire sur une range ou sur une colonne entière ? Ca n'impacte la vitesse d'execution ?

Merci !

Bonne soirée !

Salut Ergotamine,

Franchement, je n'ai jamais fait de test à ce niveau là... Mais ça ne prend pas de temps, surtout dans le contexte présent.

En revanche, j'ai fait des essais en cherchant à remplacer les fonctions Excel (match, countif, ...) par des fonctions personnalisées en bouclant sur des tableaux dynamiques. Et la fonction "native" est toujours plus rapide que la fonction perso. Après, je n'exclus pas la possibilité de mal m'y être pris mais on voit une vraie différence quand les plages passées en argument sont importantes, différence qu'on ne peut pas imputer à simple instruction chronophage en début de fonction.

Donc, je pense que ça n'affecte pas négativement la vitesse au contraire. Je pense aussi qu'il faut éviter les boucles tant que possibles, surtout quand on a des fonctions à disposition faites pour ça.

Edit : Et en plus, les boucles prennent de la place !

Bonsoir,

Oui pour les boucles je suis en phase. Mais je me suis toujours dit que par exemple la fonction INDEX(EQUIV()) était plus rapide sur matrice définie sur sur des feuilles et colonnes entières (d'où les tables structurées, etc ...).

Après je suis peut être dans l'erreur !

Bonne soirée !

Oui, c'est sur que sur feuille, c'est plus rapide. Et je te rejoins tout à fait : autant se créer un tableau plutôt que garder toute la colonne dans la formule. Dans le code, j'ai pas le sentiment que l'utilisation de ces fonctions ralentisse, même sur une colonne entière. Déjà, en général, on a pas un enchainement de fonctions qui testent une poignée de plages et les fonctions ne semblent pas exactement les mêmes... Je t'invite à faire des essais avec application.sumproduct ! Tu verras que c'est moins intéressant. J'aimerais en savoir plus honnêtement.

Ce que je sais, c'est qu'il est possible de faire des calculs à l'aide de la fonctions EVALUATE. C'est pratique pour les cas plus complexes. Mais là, je trouve qu'on sent que l'exécution peut peiner, comme si on réalisait le calcul sur feuille.

J'ai édité le code au cas où Luigi !

Rechercher des sujets similaires à "probleme boucle"