Macro excel récalcitrante

Résolu/Fermé
clarisse - 26 avril 2012 à 15:48
f894009 Messages postés 17215 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 26 décembre 2024 - 27 avril 2012 à 15:25
Bonjour,

Je cherche à automatiser une fonction qui fonctionne et à la rendre plus élégante.

J'ai un classeur excel avec un certain nombre de feuilles, toutes nommées selon l'activité qu'elles traitent. Dans une dernière feuille, qui me servira de résumé, je souhaite établir un tableau, à 6 colonnes (une colonne par activité), et dans chaque colonne, je désire avoir une liste de textes. A l'heure actuelle, une fonction =si('activitéA'!L9>2498;'activitéA'!D9;" ") me donne une colonne dans laquelle j'ai le texte de la casse D9 de mon activité A uniquement si ma valeur dépasse le seuil que j'ai fixé à 2498. Sinon, je n'ai rien d'affiché à l'écran, ce qui me donne un grand nombre de cellules ne contenant qu'un espace entre deux cellules contenant du texte. j'aimerai éliminer ces cellules "vierges"

J'ai pensé réaliser une macro, mais je n'ai jamais rencontré vba avant aujorud'hui... Notre confrontation a été houleuse ;-) !

Voila donc ce que j'ai, grâce à des questions posées sur ce forum, réussi à bidouiller, mais quelqu'un pourrait-il me corriger car ça bug svp? Un grand merci d'avance!

Sub riskmajbri()
'
' Si la valeur de la colonne L est supérieur à un seuil, affiche le texte de la colonne D correspondant
' dans une autre feuille, sinon, teste la valeur suivante. le résultat est un tableau de textes sans interligne.
'


Dim Lig As Long
Dim Col As String
Dim NbrLig As Long
Dim NumLig As Long

Sheets("Plan d'action").Activate

' feuille de destination

Col = "i" ' colonne données non vides à tester'
i = 12
NumLig = 7 ' 1° N° de la 1er ligne de données .... ? '
With Sheets("PR1422-Briqueter") ' feuille source'
NbrLig = .Cells(65536, Col).End(xlUp).Row
For Lig = 8 To NbrLig 'n° de la 1ere ligne de données'

While "PR1422-Briqueter"R[2]C[i]<2498,NumLig = NumLig + 1
"=If('PR1422-Briqueter'!R[2]C[4]>2498,'PR1422-Briqueter'!R[2]C[-4], NumLig = NumLig + 1)"
NumLig = NumLig + 1
Sheets("Plan d'action").Cells(NumLig, 1).Insert Shift:=xlDown
'ici pour insérer ou .Paste pour coller'
End If
End While
Next
End With
A voir également:

2 réponses

f894009 Messages postés 17215 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 26 décembre 2024 1 711
26 avril 2012 à 18:51
Bonjour,

Si j'ai bien compris ce que vous vouliez, cela devrait convenir.
A adapter pour boucler sur toutes les activites.

Sub riskmajbri()
' Si la valeur de la colonne L est supérieur à un seuil,
' affiche le texte de la colonne D correspondant
' dans une autre feuille, sinon, teste la valeur suivante.
' le résultat est un tableau de textes sans interligne.
'
Dim Lig As Long
Dim Col As String
Dim NbrLig As Long
Dim NumLig As Long

Const Val_test = 2498

'feuille de destination
Worksheets("Plan d'action").Activate

Col = "L" ' colonne données non vides à tester'
With Sheets("PR1422-Briqueter") ' feuille source'
NumLig = 7 ' 1° N° de la 1er ligne de données .... ? '
NbrLig = .Cells(65536, Col).End(xlUp).Row

For Lig = 8 To NbrLig 'n° de la 1ere ligne de données'
'Test cellule < a constante valeur
If .Cells(Lig, Col) < Val_test Then
'copie valeur
Sheets("Plan d'action").Cells(NumLig, 4) = .Cells(Lig, Col)
'Incremente ligne
NumLig = NumLig + 1
End If
Next Lig
End With
End Sub

Bon courage (VBA n'a jamais mordu de personne, a ma connaissance, mais.....)
1
Hourrahhhh

Mille merci, après quelques modifications (je n'ai peut être pas été tout à fait claire dans mes explications, et sans le fichier ce doit être difficile de coder, ça fonctionne!!! Miraculeux! Ce matin, j'ai appris que mon seuil avait changé, mais c'est ce qui est super avec une macro, s'il y a un changement, la modification est vite réalisée, et le tableau mouline tout seul! J'ai réussi à faire de cette macro un travail sur toutes mes colonnes, donc une seule macro pour mes 6 activités!!! J'en ferai encore d'autres macros si je me découvre des affinités particulières avec VBA, mais s'il ne m'a pas encore mordu, j'ai eu droit à une belle migraine! Mais la satisfaction d'avoir réussi, c'est que du bonheur, un immense merci pour ce déblocage!!!

Toujours est-il que le code devient :


Sub riskmaj()
' Si la valeur de la colonne L est supérieur à un seuil,
' affiche le texte de la colonne D correspondant
' dans une autre feuille, sinon, teste la valeur suivante.
' le résultat est un tableau de textes sans interligne.
'
Dim Lig As Long
Dim Col As String
Dim NbrLig As Long
Dim NumLig As Long

Const Val_test = 999

'feuille de destination
Worksheets("Plan d'action").Activate

Col = "L" ' colonne données non vides à tester'

With Sheets("PR1410-Pr de Management") ' feuille source'
NumLig = 8 ' 1° N° de la 1er ligne de données '
NbrLig = .Cells(65536, Col).End(xlUp).Row

For Lig = 8 To NbrLig 'n° de la 1ere ligne de données jusqu'à la dernière ligne non vide'
'Test cellule > à constante valeur
If .Cells(Lig, Col) > Val_test Then
'copie valeur
Sheets("Plan d'action").Cells(NumLig, 2) = .Cells(Lig, 4)
'Incremente ligne
NumLig = NumLig + 1
End If
Next Lig
End With

With Sheets("PR1421-Réceptionner et envoyer") ' feuille source'
NumLig = 8 ' 1° N° de la 1er ligne de données '
NbrLig = .Cells(65536, Col).End(xlUp).Row

For Lig = 8 To NbrLig 'n° de la 1ere ligne de données jusqu'à la dernière ligne non vide'
'Test cellule > à constante valeur
If .Cells(Lig, Col) > Val_test Then
'copie valeur
Sheets("Plan d'action").Cells(NumLig, 3) = .Cells(Lig, 4)
'Incremente ligne
NumLig = NumLig + 1
End If
Next Lig
End With

With Sheets("PR1422-Briqueter") ' feuille source'
NumLig = 8 ' 1° N° de la 1er ligne de données '
NbrLig = .Cells(65536, Col).End(xlUp).Row

For Lig = 8 To NbrLig 'n° de la 1ere ligne de données jusqu'à la dernière ligne non vide'
'Test cellule > à constante valeur
If .Cells(Lig, Col) > Val_test Then
'copie valeur
Sheets("Plan d'action").Cells(NumLig, 4) = .Cells(Lig, 4)
'Incremente ligne
NumLig = NumLig + 1
End If
Next Lig
End With

With Sheets("PR1423-Fondre & Couler") ' feuille source'
NumLig = 8 ' 1° N° de la 1er ligne de données '
NbrLig = .Cells(65536, Col).End(xlUp).Row

For Lig = 8 To NbrLig 'n° de la 1ere ligne de données jusqu'à la dernière ligne non vide'
'Test cellule > à constante valeur
If .Cells(Lig, Col) > Val_test Then
'copie valeur
Sheets("Plan d'action").Cells(NumLig, 5) = .Cells(Lig, 4)
'Incremente ligne
NumLig = NumLig + 1
End If
Next Lig
End With

With Sheets("PR1433-Analyser") ' feuille source'
NumLig = 8 ' 1° N° de la 1er ligne de données '
NbrLig = .Cells(65536, Col).End(xlUp).Row

For Lig = 8 To NbrLig 'n° de la 1ere ligne de données jusqu'à la dernière ligne non vide'
'Test cellule > à constante valeur
If .Cells(Lig, Col) > Val_test Then
'copie valeur
Sheets("Plan d'action").Cells(NumLig, 6) = .Cells(Lig, 4)
'Incremente ligne
NumLig = NumLig + 1
End If
Next Lig
End With

With Sheets("PR1432-Maintenir") ' feuille source'
NumLig = 8 ' 1° N° de la 1er ligne de données '
NbrLig = .Cells(65536, Col).End(xlUp).Row

For Lig = 8 To NbrLig 'n° de la 1ere ligne de données jusqu'à la dernière ligne non vide'
'Test cellule > à constante valeur
If .Cells(Lig, Col) > Val_test Then
'copie valeur
Sheets("Plan d'action").Cells(NumLig, 7) = .Cells(Lig, 4)
'Incremente ligne
NumLig = NumLig + 1
End If
Next Lig
End With

End Sub
0
f894009 Messages postés 17215 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 26 décembre 2024 1 711
Modifié par f894009 le 27/04/2012 à 12:57
Bonjour,

macro pour tous les onglets a tester

Sub riskmaj()
' Si la valeur de la colonne L est supérieur à un seuil,
' affiche le texte de la colonne D correspondant
' dans une autre feuille, sinon, teste la valeur suivante.
' le résultat est un tableau de textes sans interligne.
'
Dim Lig As Long
Dim Col As String
Dim NbrLig As Long
Dim NumLig As Long
Dim Nom_Onglet(10)

Const Nb_Onglet = 6

Nom_Onglet(0) = "PR1410-Pr de Management"
Nom_Onglet(1) = "PR1421-Réceptionner et envoyer"
Nom_Onglet(2) = "PR1422-Briqueter"
Nom_Onglet(3) = "PR1423-Fondre & Couler"
Nom_Onglet(4) = "PR1433-Analyser"
Nom_Onglet(5) = "PR1432-Maintenir"

Nom_Onglet(6) = ""
Nom_Onglet(7) = ""
Nom_Onglet(8) = ""


Const Val_test = 999

'feuille de destination
Worksheets("Plan d'action").Activate

Col = "L" ' colonne données non vides à tester'

For Pointeur = 0 To Nb_Onglet
With Sheets(Nom_Onglet(Pointeur)) ' feuille source'
NumLig = 8 ' 1° N° de la 1er ligne de données '
NbrLig = .Cells(65536, Col).End(xlUp).Row

For Lig = 8 To NbrLig 'n° de la 1ere ligne de données jusqu'à la dernière ligne non vide'
'Test cellule > à constante valeur
If .Cells(Lig, Col) > Val_test Then
'copie valeur
Sheets("Plan d'action").Cells(NumLig, 2 + Pointeur) = .Cells(Lig, 4)
'Incremente ligne
NumLig = NumLig + 1
End If
Next Lig
End With

Next x

End Sub

Bon courage
0
f894009 tu es un programmateur hors pair!

Juste deux valeurs qui n'allaient pas, mais sinon ça fonctionne avec :

(Je me suis même permise de m'amuser à supprimer les doublons en plus, comme quoi tu avais raison, VBA n'est peut-être pas si hargneux après tout :-) )

Sub riskmajglobal()
' Si la valeur de la colonne L est supérieur à un seuil,
' affiche le texte de la colonne D correspondant
' dans une autre feuille, sinon, teste la valeur suivante.
' le résultat est un tableau de textes sans interligne.
'
Dim Lig As Long
Dim Col As String
Dim NbrLig As Long
Dim NumLig As Long
Dim Nom_Onglet(10)

Const Nb_Onglet = 5

Nom_Onglet(0) = "PR1410-Pr de Management"
Nom_Onglet(1) = "PR1421-Réceptionner et envoyer"
Nom_Onglet(2) = "PR1422-Briqueter"
Nom_Onglet(3) = "PR1423-Fondre & Couler"
Nom_Onglet(4) = "PR1433-Analyser"
Nom_Onglet(5) = "PR1432-Maintenir"

Nom_Onglet(6) = ""
Nom_Onglet(7) = ""
Nom_Onglet(8) = ""


Const Val_test = 999

'feuille de destination
Worksheets("Plan d'action").Activate

Col = "L" ' colonne données non vides à tester'

For Pointeur = 0 To Nb_Onglet
With Sheets(Nom_Onglet(Pointeur)) ' feuille source'
NumLig = 2 ' 1° N° de la 1er ligne de données '
NbrLig = .Cells(65536, Col).End(xlUp).Row

For Lig = 8 To NbrLig 'n° de la 1ere ligne de données jusqu'à la dernière ligne non vide'
'Test cellule > à constante valeur
If .Cells(Lig, Col) > Val_test Then
'copie valeur
Sheets("Plan d'action").Cells(NumLig, 2 + Pointeur) = .Cells(Lig, 4)
'Incremente ligne
NumLig = NumLig + 1
End If
Next Lig
End With

Next

Columns("B:B").Select
ActiveSheet.Range("$B$1:$B$186").RemoveDuplicates Columns:=1, Header:=xlNo
ActiveSheet.Range("$C$1:$C$186").RemoveDuplicates Columns:=1, Header:=xlNo
ActiveSheet.Range("$D$1:$D$186").RemoveDuplicates Columns:=1, Header:=xlNo
ActiveSheet.Range("$E$1:$E$186").RemoveDuplicates Columns:=1, Header:=xlNo
ActiveSheet.Range("$F$1:$F$186").RemoveDuplicates Columns:=1, Header:=xlNo
ActiveSheet.Range("$G$1:$G$186").RemoveDuplicates Columns:=1, Header:=xlNo

End Sub
0
f894009 Messages postés 17215 Date d'inscription dimanche 25 novembre 2007 Statut Membre Dernière intervention 26 décembre 2024 1 711
27 avril 2012 à 15:25
Re,

Juste deux valeurs qui n'allaient pas, mais sinon ça fonctionne avec :

Je suis parti de ce que vous avez ecrit precedement. Je ne vous en voudrai pas pour ca, vous m'avez l'air telement enthousiaste a l'idee de vous torturez grace a VBA.

Bonne suite
0