[vba] ma macros supprime tout
Dernière réponse : dans Programmation
salut c'est encore moi et oui
c'est toujours a propos d'une macros sur excel.
voila le topo :
j'ai deux classeurs :
ref |label | appli 2eme tableau appli |...........
----------------------- ----------------
1 | | x x |..........
------------------------ ------------------
2 | |y z |..............
alor voila ce que j'ai essayer de faire: dans le tableau 1 je voudrai supprimer toute les appli qui sont différentes des appli du tableau 2. (donc dans cette ex il devrai rester dans le tableau 1 que l'aplli x )
alor voila une partie de mon code qui ne fonctionne pas top :
le probleme c'est que sa supprime tout mon premier tableau et en faisan du pas à pas j'ai compris le problème
->il y aura toujours un Cel3.Offset(k, 0) qui sera différent d'un Cel2.Offset(i, 2)
alors voila je vous demande si il y a pas un moyen d'esquiver se problème
c'est toujours a propos d'une macros sur excel.
voila le topo :
j'ai deux classeurs :
ref |label | appli 2eme tableau appli |...........
----------------------- ----------------
1 | | x x |..........
------------------------ ------------------
2 | |y z |..............
alor voila ce que j'ai essayer de faire: dans le tableau 1 je voudrai supprimer toute les appli qui sont différentes des appli du tableau 2. (donc dans cette ex il devrai rester dans le tableau 1 que l'aplli x )
alor voila une partie de mon code qui ne fonctionne pas top :
Workbooks(cl2).Activate ' tableau 1
Dim tbl2() As String
Dim i As Variant
Dim j As Variant 'Nbre éléments du tableau
Dim NbreLignes As Integer
Dim Cel2 As Range
Set Cel2 = Range("A1")
NbreLignes = Cel2.End(xlDown).Row
For i = NbreLignes To 1 Step -1
j = j + 1
'Redimension du tableau en conservant ses éléments
ReDim Preserve tbl2(j)
tbl2(j) = Cel2.Offset(i)
Workbooks(cl3).Activate 'tableau 2
Dim tbl3() As String
Dim k As Variant
Dim l As Variant
Dim NbreLignes2 As Integer
Dim Cel3 As Range
Set Cel3 = Range("A1")
NbreLignes2 = Cel3.End(xlDown).Row - 1
For k = NbreLignes2 To 1 Step -1
l = l + 1
ReDim Preserve tbl3(l)
tbl3(l) = Cel3.Offset(i)
If Not(Cel2.Offset(i, 2) = Cel3.Offset(k, 0)) Then
Workbooks(cl2).Activate
Rows(1).Offset(i).Delete
End If
Next k
Next i
le probleme c'est que sa supprime tout mon premier tableau et en faisan du pas à pas j'ai compris le problème
->il y aura toujours un Cel3.Offset(k, 0) qui sera différent d'un Cel2.Offset(i, 2)
alors voila je vous demande si il y a pas un moyen d'esquiver se problème
Autres pages sur : vba macros supprime
Lassé par la pub ? Créez un compte
Une solution et quelques commentaires.
Problème archi-classique de débutant
Avant la seconde boucle, initialise un booleén à Faux, appelons le Trouvé.
Dans cette boucle, mets-le à Vrai si tu trouve quelque chose.
Après cette boucle, effectue la suppression si et seulement si Trouvé est Faux.
Et voilà !
Maintenant quelques conseils de vieux singe (T'en fais ce que tu veux).
Déclare toutes tes variables avant les traitements. Les lignes Dim.. en plein milieu d'une boucle, c'est très moche.
Evite la méthode Activate. Elle consomme plein de ressources et fait s'activer Excel pour rien. Quelques exemples :
Pas bon :
Pas mal :
Dans d'autres cas, ne pas hésiter à faire :
(Dans ce cas, une seule fois, ce n'est pas utile)
Il existe aussi le mot-clef With pour rappeler de quoi on parle sans avoir à le préciser à chaque fois.
Déclare les entiers en entiers, pas en variant !
Sors des boucles tout ce qui n'est pas indispensable.
Avant de rentrer dans les boucles, tu connais la taille des tableaux. Ne pas faire 50 ReDim.
Sois cohérent dans le nom de tes variables.
(C'est fait exprès, le i ligne 28 ?)
Ne compte pas sur le langage pour initialiser tes variables !!
Constate qu'après ça, la partie utile du code est bien plus claire et facilement compréhensive.
(Je n'ai pas l'habitude de donner un corrigé complet. Ce n'est pas aider le programmeur. Mais je donne tellement de conseils que je préfère les étayer avec un exemple)
Problème archi-classique de débutant
Avant la seconde boucle, initialise un booleén à Faux, appelons le Trouvé.
Dans cette boucle, mets-le à Vrai si tu trouve quelque chose.
Après cette boucle, effectue la suppression si et seulement si Trouvé est Faux.
Et voilà !
Maintenant quelques conseils de vieux singe (T'en fais ce que tu veux).
Déclare toutes tes variables avant les traitements. Les lignes Dim.. en plein milieu d'une boucle, c'est très moche.
Evite la méthode Activate. Elle consomme plein de ressources et fait s'activer Excel pour rien. Quelques exemples :
Pas bon :
Workbooks(cl2).Activate
Set Cel2 = Range("A1")
Pas mal :
Set Cel2 = Workbooks(cl2).Range("A1")
Dans d'autres cas, ne pas hésiter à faire :
Set W2 = Workbooks(cl2)
Set Cel2 = W2.Range("A1")
(Dans ce cas, une seule fois, ce n'est pas utile)
Il existe aussi le mot-clef With pour rappeler de quoi on parle sans avoir à le préciser à chaque fois.
Déclare les entiers en entiers, pas en variant !
Sors des boucles tout ce qui n'est pas indispensable.
Avant de rentrer dans les boucles, tu connais la taille des tableaux. Ne pas faire 50 ReDim.
Sois cohérent dans le nom de tes variables.
(C'est fait exprès, le i ligne 28 ?)
Ne compte pas sur le langage pour initialiser tes variables !!
Dim tbl2() As String
Dim tbl3() As String
Dim i2 As Integer
Dim j2 As Integer
Dim i3 As Integer
Dim j3 As Integer
Dim NbreLignes2 As Integer
Dim NbreLignes3 As Integer
Dim Cel2 As Range
Dim Cel3 As Range
Dim Trouve As Boolean
Set Cel2 = Workbooks(cl2).Range("A1") ' Tableau 1
Set Cel3 = Workbooks(cl3).Range("A1") ' tableau 2
NbreLignes2 = Cel2.End(xlDown).Row
NbreLignes3 = Cel3.End(xlDown).Row - 1
'Redimension des tableaux
ReDim tbl2(NbreLignes2)
ReDim tbl3(NbreLignes4)
j2 = 0
For i2 = NbreLignes2 To 1 Step -1
j2 = j2 + 1
tbl2(j2) = Cel2.Offset(i2)
j3 = 0
Trouve = False
For i3 = NbreLignes3 To 1 Step -1
j3 = j3 + 1
tbl3(j3) = Cel3.Offset(i3)
If Cel2.Offset(i2, 2) = Cel3.Offset(i3, 0) Then Trouve = True
Next i3
if Not Trouve Then Workbooks(cl2).Rows(1).Offset(i2).Delete
Next i
Constate qu'après ça, la partie utile du code est bien plus claire et facilement compréhensive.
(Je n'ai pas l'habitude de donner un corrigé complet. Ce n'est pas aider le programmeur. Mais je donne tellement de conseils que je préfère les étayer avec un exemple)
Zeb franchement merci japprend vraiment plein de truc et en plus je comprend pratiquement tout tu veu pas venir remplacer mon prof d'informatique qui est trop nul ?
seul petit problème le programme veut pas de
ou aussi de
erreur d'execution 438: propriéré ou méthode non gérer par cet objet
c'est peut être à cause du début de mon code que voila : (il me sert pour nommer les nom de mes deux classeur ouvert )
seul petit problème le programme veut pas de
Set Cel2 = Workbooks(cl2).Range("A1") ' Tableau 1
ou aussi de
Workbooks(cl2).Rows(1).Offset(i2).Delete
erreur d'execution 438: propriéré ou méthode non gérer par cet objet
c'est peut être à cause du début de mon code que voila : (il me sert pour nommer les nom de mes deux classeur ouvert )
Dim cl2 As String
Dim cl3 As String
Dim cl As String
Dim x As Workbook
For Each x In Workbooks
If x.Name <> ("PERSO1.XLS") Then
If x.Name <> ("PERSO.XLS") Then
If cl3 <> cl2 Then
cl = x.Name
End If
If x.Name <> cl Then
cl2 = x.Name
End If
If x.Name = cl Then
cl3 = x.Name
End If
End If
End If
Next
Qu'est-ce que ListBoxApplication, Le nom d'une ListBox sur ta UserForm ?
Bon. Essaye ce truc. (Marche tout le temps)
Au moment du stop, l'application s'arrête et te donne la main. Dans la fenêtre espion, ajoute ton UserForm1.ListBoxApplication et explore-le. Tu y trouveras peut être ton bonheur.
Bon. Essaye ce truc. (Marche tout le temps)
Msgbox UserForm1.LsitBoxApplication ' Pour le mettre dans le contexte
Stop
Au moment du stop, l'application s'arrête et te donne la main. Dans la fenêtre espion, ajoute ton UserForm1.ListBoxApplication et explore-le. Tu y trouveras peut être ton bonheur.
c'est j'ai esquiver le problème (solution de faciliter je sais )
mais j'ai encore un petit problème qui m'agace un peu
voila je voudrai ouvrir un fichier Excel a la fin de ma macro
voila mon code
petit problème sa m'ouvre un autre fichier Excel et moi je vou drai que se sois dans le même que j'ai ouvert depuis le début(me suis je bien fait comprendre) .
Y a til solution?
mais j'ai encore un petit problème qui m'agace un peu
voila je voudrai ouvrir un fichier Excel a la fin de ma macro
voila mon code
Dim objXL As New Excel.Application
With objXL
.Application.Visible = False
.Workbooks.Open ("//BATAX352/GMAO/Statut.xls" )
End With
petit problème sa m'ouvre un autre fichier Excel et moi je vou drai que se sois dans le même que j'ai ouvert depuis le début(me suis je bien fait comprendre) .
Y a til solution?
M'enfin, tu comprends ce que tu codes ?
New Excel.Application, ça crée une nouvelle instance de l'application Excel.
(Le With n'est une autre façon d'écrire ça.)
New Excel.Application, ça crée une nouvelle instance de l'application Excel.
s'applique soit à l'instance en cours (si tu ne précises rien) ou à une instance en particulier si tu précises
Workbooks.Open
Instance.Workbooks.Open
(Le With n'est une autre façon d'écrire ça.)
2 solutions:
qui te permettra d'esquiver seulement la sauvegarde en faisant croire que tu as déjà sauvegardé
qui te permettra d'éviter la plupart des messages d'avertissement (à double tranchant).
Et alors t'as fait comment pour ta barre d'états? Pense à mettre la réponse en plus de la question, ca intéresse tout le monde.
application.saved=true
Windows("Liste des Applications.xls").Close
qui te permettra d'esquiver seulement la sauvegarde en faisant croire que tu as déjà sauvegardé
application.displayalerts=false
Windows("Liste des Applications.xls").Close
qui te permettra d'éviter la plupart des messages d'avertissement (à double tranchant).
Et alors t'as fait comment pour ta barre d'états? Pense à mettre la réponse en plus de la question, ca intéresse tout le monde.
souso_95 a dit :
2 solutions:
application.saved=true
Windows("Liste des Applications.xls").Close
qui te permettra d'esquiver seulement la sauvegarde en faisant croire que tu as déjà sauvegardé
application.displayalerts=false
Windows("Liste des Applications.xls").Close
qui te permettra d'éviter la plupart des messages d'avertissement (à double tranchant).
Et alors t'as fait comment pour ta barre d'états? Pense à mettre la réponse en plus de la question, ca intéresse tout le monde.
La premiere solution me met un message d'erreur(propriete ou methode non gérer par cette objet) mais la deuxième marche nikel .
Lassé par la pub ? Créez un compte
- Contenus similaires :
Tags :
- ForumMacros range vba
- ForumMacros vba excel
- ForumComment activer macros vba par programmation
- ForumVba variable utilisã e dans plusieurs macros
- articlesVba copier un fichier avec ses macros
- ForumPetit probleme macros vba excel
- ForumProgrammer sous excel macros et langage vba
- ForumVba excel appel plusieures macros
- ForumLancer des macros
- ForumActiver les macros
- Voir plus
eh oui, que du bonheur ce VBA