Supprimer un bloc en VBA

cs_ilma Messages postés 1 Date d'inscription mercredi 25 août 2010 Statut Membre Dernière intervention 27 août 2010 - 27 août 2010 à 01:19
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 - 28 août 2010 à 14:19
Bonjour à Tous,

Je galère en ce moment avec VBA ( débutante )

Je vous explique mon problème :

j'ai une feuille excel avec 4400 lignes et 44 colonnes divisé par bloc (100 blocs), chaque bloc à 43 lignes et 44 colonnes, les blocs sont séparés par des lignes de 0.
Ce que je vais faire c'est un programme qui calcule la distance euclidienne pour chaque ligne, ensuite supprimer le bloc qui contient la ligne qui la plus petite distance.

Voilà mon programme :




For b = 1 To 100
iStartRow(b) = (b - 1) * 44 + 1 'définir les blocs
iEndRow(b) = (b - 1) * 44 + 44


For i = iStartRow(b) To iEndRow(b)
l = 0 'calculer la distance
For j = 1 To 44
l = l + Cells(i, j) * Cells(i,j)
Next j


d(i) = Sqr(l)


a = d(1)

If d(i) < a Then
a = d(i) 'trouver la distance minimale
End If

Next i

Next b


mbs=100

For b = 1 To mbs
For i = iStartRow(b) To iEndRow(b)
For j = 1 To 44
If d(i) = a Then
Range(Cells(iStartRow(b), 1), Cells(iEndRow(b), 43)).Select 'supprimer le bloc ( c'est ce qui ne marche pas en fait, il supprime tous les blocs)
Selection.Delete Shift:=xlToLeft


End If

Next j

Next i
mbs = mbs - 1
Next b




Merci pour votre aise

2 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
27 août 2010 à 08:58
Salut

La prochaine fois que tu as besoin de coller du code, utilise la coloration syntaxique 3ème icone à droite plus facile à relire.

Je n'ai rien compris au but de ton programme, à la notion de distance, mais pas grave.

Donc, ça te supprime tous les blocs.
Je remets en forme le code :
    mbs=100
    For b = 1 To mbs
        For i = iStartRow(b) To iEndRow(b)
            For j = 1 To 44
                If d(i) = a Then
                    Range(Cells(iStartRow(b), 1), Cells(iEndRow(b), 43)).Select
                    ' supprimer le bloc (c'est ce qui ne marche pas en fait,
                    ' il supprime tous les blocs)
                    Selection.Delete Shift:=xlToLeft
                End If
            Next j
        Next i
        mbs = mbs - 1
    Next b

Première chose : mbs
L'instruction For n'est interprétée qu'une seule fois, au démarrage de l'itération. Donc, même si tu modifies la valeur de mbs (avec le mbs = mbs - 1), 'b' incrémentera quand même jusqu'à la valeur de mbs prévue initialement.

Dans le Select précédent le Delete, tu sembles définir un ensemble de 43 lignes.
A quoi te sert la boucle For j ?
N'y aurait-il pas double emploi ?
En plus, tu ne te sers pas de ta variable j

Que vaut a ?
Que valent d(i) au moment du test avec a ?
Pour le savoir --> débogage :
- F9 sur une ligne de code
Le programme s'y arrêtera au prochain passage
Survole avec la souris tes variables pour visualiser leur contenu, ou va dans la fenêtre de debogage (Ctrl-G) et tape
? maVariable
pour qu'elle s'inscrive dans la fenêtre.
- F8 pour avancer d'une ligne de code
- F5 pour continuer normalement

Vala
Jack, =fr MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
28 août 2010 à 14:19
Mais y-a pas de quoi
0
Rejoignez-nous