Histoire de Range et de For Each...

M

marie

Guest
Bonjour à tous,
Je suis sur une fonction avec 2 Tableaux qui doit tester si un élèment du premier tab existe aussi dans le deuxième tab. Pour cela, j'utilise 2 boucles for each-next imbriquées. Ca marche, mais (si je vous écris, c'est qu'il y a un MAIS!), lorsque je fais next mouv1, il passe à la case suivante (c'est-à-dire à celle à la droite de mon mouv1), alors qu'il faudrait qu'il passe à la colonne suivante de mon tab1.
Ma question est donc: comment faire pour que le next aille au début de la ligne suivante et non à la cellule suivante de mon tableau. J'ai essayé des trucs avec des Offset, mais mon NEXT ne veut rien entendre. Je vous donne toute la fonction, car je ne suis pas sûre d'être très claire. D'avance merci pour vos astuces et si vous avez besoin de précisions, n'hésitez pas!


'Bouton Importer les mouvements pour faire évoluer le ptf
Sub Importation2()
Deproteger
Dim venac
Dim veneg
Dim code1
Dim code2
Dim nb1
Dim nb2
Dim nbfinal
Dim result As Boolean
Dim Plage1 As Range
Dim mouv1 As Range
Dim Plage2 As Range
Dim mouv2 As Range
Set Plage2 = Worksheets("Etat du Portefeuille").Range("A6:B150")
Sheets("Mouvements sur le ptf").Activate
On Error Resume Next
Application.DisplayAlerts = False
Set Plage1 = Application.InputBox("Sélectionnez la plage de données à insérer", "SELECTION DES DONNEES", , , , , , 8)
Application.DisplayAlerts = True
If Err <> 0 Then
Sheets("Etat du Portefeuille").Activate
Proteger
Err.Clear: Exit Sub
End If
Plage1.Select

'Pour chaque mouvement de la plage des mvts sélectionnés dans la feuille Mouvements
For Each mouv1 In Plage1
If mouv1.Value <> Vide Then
code1 = mouv1.Offset(0, 3)
venac = mouv1.Offset(0, 7)

For Each mouv2 In Plage2
n = mouv2.Value
code2 = mouv2.Offset(0, 1)
nb2 = mouv2.Offset(0, 3)
'Si les 2 codes ISIN sont égaux:
If code1 = code2 Then
' on regarde si c'est une vente
If mouv1.Offset(0, 5) = "Vente" Then
'si oui: le nb de parts devient négatif
venac = venac * (-1)
End If
'on affecte le nb de parts du mouvements au nb de parts du nv ptf
nbfinal = nb2 + venac

mouv2.Offset(0, 3) = nbfinal
Exit For
End If
result = True

Next mouv2
Else
End If
Next mouv1
Proteger
End Sub
 
@

@+Thierry

Guest
Salut Marie, le Forum

Comme le dit souvent Ti, un petit fichier Zippé permet à celui où celle qui sera susceptible de s'interresser à ton problème de ne pas se décourager à refabriquer un classeur pour avoir le même contexte... (ce qui m'arrive présentement ! ;-)

Pour commencer je définirais en VBA exactement on va travailler avec une macro comme ceci (très bien hein la "Application.InputBox" merci Ti)

Sub InputBoxRange()
Dim Col As Integer, Lig As Integer, C As Byte, L As Integer
Dim SelectRange As Range

Set SelectRange = Application.InputBox("Sélectionnez la plage de données à insérer", "SELECTION DES DONNEES", , , , , , 8)
Col = SelectRange.Columns.Count
Lig = SelectRange.Rows.Count
Col = SelectRange.Columns.Count
C = SelectRange.Column
L = SelectRange.Row

MsgBox "il y a " & Col & " Colonnes" & " et " & Lig & " Lignes dans la séléction" & _
vbCrLf & "qui commence en Ligne " & L & " et en Colonne " & C

End Sub

Pour la suite, pour ma part je ne ferais pas des For Each dans ce cas, mais plutôt des For X = 1 to Lig ...

Exemple :
For X = 0 to Lig - 1
If Cells(X + L, C) = "Toto" then Cells(X + L, C + 3) = "Zaza"

.... Etc etc je n'ai pas du tout capté ce que tu fais, c'est juste pour l'idée...

En suite il faut décaller C, c'est tout... Mais savoir où le faire çà dépend de ton appli....

Bon Courage
@+Thierry
 

Discussions similaires

Statistiques des forums

Discussions
312 504
Messages
2 089 077
Membres
104 022
dernier inscrit
lg06