Formule SI VBA dans 2 feuilles

Bonjour à tous,

Je vous écris aujourd'hui car vous êtes mon dernier espoir. En effet, pour mon stage, je dois réaliser un VBA ou je paramètre des risques en fonction des niveaux. Pour faire simple, il y'a 7 risques, et 400-500 niveaux (dans le fichier exemple je m'arrête a 15), et chaque niveau n'est pas associable a chaque risque. Donc en gros, on a fichier "Index" (feuille 2 dans le fichier joint) qui énumère les compatibilités de ces derniers.

Donc ce que je dois mettre en place, ça serait mettre un "Non" dans la feuille 1 en fonction de chaque risque qui ne serait pas compatible, depuis la Feuille 2.

Le problème est que je ne peux le faire manuellement, car dans le fichier initial, il y'a près de 400-500 objets, et les risques (de 1 à 7) s'étalent sur 10 000 lignes, (et ca change souvent à cause des MAJ).

J'ai essayer pas mal de codes, mais je ne semble pas avoir le niveau requis vu que je n'y arrive pas

Un grand merci à ceux qui prendront le temps pour m'aider, on a tous débuter sur VBA un jour, et on a tous eu besoin d'aide un jour

Bonsoir,

un essai avec la fonction RechercheH :

Ainsi qu'une MFC afin de griser les "non".

@ bientôt

LouReeD

Merci pour ta réponse rapide !

Cependant, n'est il pas possible d'automatiser ça à travers VBA ? Le fichier sur lequel je travaille est déjà trop lourd, et mes supérieurs insistent sur le fait de vouloir passer par VBA....

Merci encore une fois de plus, je te suis super reconnaissant aha !

Bonjour

Bonjour à tous

Un essai à tester. Te convient-il ?

Bye !

Hello, le code fonctionne a merveille ! Cependant, je n'arrive pas a l'appliquer dans mon fichier de travail.... J'ai pourtant essayé de l'adapter..

Bonjour

je n'arrive pas a l'appliquer dans mon fichier de travail....

Alors joins ton fichier de travail...

Bye !

Hello a tous!

Voici a quoi ressemble le fichier de base (confidentialité je ne peux partager l'orignal )

L'idée serait de faire une boucle, en fonction des Oui/Non dans la feuille 2, et lorsqu'un Non apparaît, il faudrait griser la cellule du "titre X" dans la feuille 1. Pour le Oui, ça reste facultatif

8classeur2.xlsx (96.41 Ko)

Au passage, je précise que ce fichier existe en 15/20 versions, donc les Oui/Non et les risques changent constamment en fonction des lignes / colonnes / cellules !

Un grand merci à ceux qui m'auront aidé, pour vous ca peut paraître banal, mais croyez moi, ça m'enlève une pression aha

Hello a tous!

Voici a quoi ressemble le fichier de base (confidentialité je ne peux partager l'orignal )

L'idée serait de faire une boucle, en fonction des Oui/Non dans la feuille 2, et lorsqu'un Non apparaît, il faudrait griser la cellule du "titre X" dans la feuille 1. Pour le Oui, ça reste facultatif

8classeur2.xlsx (96.41 Ko)

Au passage, je précise que ce fichier existe en 15/20 versions, donc les Oui/Non et les risques changent constamment en fonction des lignes / colonnes / cellules !

Un grand merci à ceux qui m'auront aidé, pour vous ca peut paraître banal, mais croyez moi, ça m'enlève une pression aha

J'ai jeté un coup d'œil à classeur 2.xlsx et je n'y ai rien compris...

En gros ce qu'il faut faire depuis la feuille 2, ca serait de créer une boucle qui permet a la feuille 1 d'affichier les Oui/Non en fonction de l'index de la Feuille 2, en se basant sur les 7 risques..

Je sais pas si c'est clair, mais pour faire simple, dans la feuille 1, il est affiché sur les colonnes titres "Oui /Non (VBA)'', c'est ça qu'il faudrait automatiser (en se basant de ce qui est affiché dans la feuille 2)

Dans la feuille 1, ce qui est affiché en X c'est juste la structure du fichier du base que j'ai (pour le travail), ce n'est pas important pour nous

Je sais pas si ça paraît clair ?

Bonsoir,

je reste sur mon idée de mise en couleur avec une MFC, pour la boucle voici le code :

Sub LouReeD()
    Application.ScreenUpdating = False
    Dim Ligne As Long, DerLigne As Long, Col, Lig As Long
    Dim Plage As Range
    DerLigne = Sheets("Feuille1").Range("L" & Rows.Count).End(xlUp).Row
    Lig = Sheets("Feuille2").Range("A" & Rows.Count).End(xlUp).Row
    For Ligne = 5 To DerLigne
        Col = Right(Sheets("Feuille1").Cells(Ligne, 12), 1) * 1
        Set Plage = Sheets("Feuille2").Cells(2, Col + 1).Resize(Lig)
        Plage.Copy
        Sheets("Feuille1").Cells(Ligne, 21).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=True
    Next Ligne
End Sub

Tout est fait en fonction de la position des colonnes de votre fichier exemple. J'ai repris le principe du transpose de gmb que je salue.
En fait le transpose ne s'applique qu'à une seule colonne de la feuille2 en fonction de l'intitulé du risque de la ligne testée de la feuille1.
C'est cette partie qui n'a pas été bien expliquée au début du fil

Evidemment le code pourrait être optimisé ! Comme par exemple mettre en mémoire une bonne fois pour toutes les différentes colonnes de valeurs de risque afin de ne pas à avoir à "recréer" la plage correspondante ! Enfin si c'est possible...

@ bientôt

LouReeD

Un essai, mais le temps est le même !

Sub LouReeD()
    Application.ScreenUpdating = False
    Dim Ligne As Long, DerLigne As Long, Col, Lig As Long
    Dim Plage(1 To 7) As Range

    Lig = Sheets("Feuille2").Range("A" & Rows.Count).End(xlUp).Row
    For Ligne = 1 To 7
        Set Plage(Ligne) = Sheets("Feuille2").Cells(2, Ligne + 1).Resize(Lig)
    Next Ligne

    DerLigne = Sheets("Feuille1").Range("L" & Rows.Count).End(xlUp).Row
    For Ligne = 5 To DerLigne
        Col = Right(Sheets("Feuille1").Cells(Ligne, 12), 1) * 1
        Plage(Col).Copy
        Sheets("Feuille1").Cells(Ligne, 21).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=True
    Next Ligne
End Sub

@ bientôt

LouReeD

Bonjour

Bonjour à tous

Un autre essai

5classeur2-1-v1.xlsm (120.93 Ko)
Option Explicit

Dim tabloL, tabloR, tabloI
Dim iR&, jR&, it&, jt&, iI&, jI&, ln&, col&

Sub Risque()

    tabloL = Range("L4:L" & Range("L" & Rows.Count).End(xlUp).Row)
    tabloR = Range(Cells(4, 21), Cells(Range("U" & Rows.Count).End(xlUp).Row, Cells(4, Columns.Count).End(xlToLeft).Column))
    tabloI = Sheets("Feuille2").Range("A2").CurrentRegion

    For iR = 2 To UBound(tabloR, 1)
        For jR = 1 To UBound(tabloR, 2)
            'recherche de la ligne dans tabloI
            For jI = 2 To UBound(tabloI, 1)
                If tabloI(1, jI) = tabloL(iR, 1) Then
                    col = jI
                    Exit For
                End If
            Next jI
            'recherche de la colonne dans tabloI
            For iI = 2 To UBound(tabloI, 1)
                If tabloI(iI, 1) = tabloR(1, jR) Then
                    ln = iI
                    Exit For
                End If
            Next iI
            tabloR(iR, jR) = tabloI(ln, col)
        Next jR
    Next iR
    Range("U4").Resize(UBound(tabloR, 1), UBound(tabloR, 2)) = tabloR
End Sub

Bye !

Bonsoir,

avec un Timer je tombe sur 1.9 voir 2.0, alors que ce sont des tableaux VBA, non ?
mon code avec Timer indiqué 1.5 voir 1.6... Hors je travaille avec des Range et du transpose...

Qu'est ce qui fait que ce soit "plus lent" ? en sachant que tout est relatif

@ bientôt

LouReeD

Hello à tous,

Désolé de ma réponse tardive, le covid à fini par m'avoir ...

Enfin bon, nous ne sommes pas la pour les problèmes perso !

Du coup pour revenir à mon code, vos idées étaient très bonnes, mais je crois qu'une boucle avec un if est plus ou moins nécessaire...

Je m'explique, dans la feuille 1, il y'a des colonnes synthèses, qui proviennent d'une formule, allant chercher dans un autre document.

Pour nous c'est pas important (enfin pour le code), c'est juste que ces colonnes sont importantes pour ce fichier, elles répertorient des synthèses de ces titres.

C'est pour cela je pensais plutôt à des boucles, avec un IF, qui irait chercher le titre 1, et le risque dans la feuille 2, et après il fait le lien dans la feuille 1, en mettant Oui / Non !

Je vous mets une ébauche du code que je souhaiterait en théorie, il est d'un niveau ridicule comparé a vos prouesses aha, vu que je suis encore débutant en VBA aha! Mais si ça peut aider !

Sub test()

Dim I As Integer
Dim J As Integer
'Dim F1 As Long
'Dim F2 As Long
Dim Plage(200, 200) As Range
Dim Risque(200) As String
Dim Objets(200) As Variant

'F1 = Sheets("Feuille1").Range("L" & Rows.Count).End(xlUp).Row
'F2 = Sheets("Feuille2").Range("A" & Rows.Count).End(xlUp).Row
'Les F1 et F2 sont facultatifs, je sais pas si ca servira a quelque chose

For I = 1 To 200
For J = 1 To 200

Plage(J, I) = Sheets("Feuille2").Cells(2 + J, 1 + I) ' l'idée ici est de paramétrer la plage dans la feuille 2
Objets(J) = Sheets("Feuille2").Cells(2 + J, 1) ' c'est les '' titres'' dans la feuille 2
Risque(I) = Sheets("Feuille2").Cells(1, I + 1) 'risques en colonne A dans la feuille 2

If Plage(J, I) = "Oui" Then

Objets(I) = Sheets("Feuille1").Cells(2, I + 21)
Risque(J) = Sheets("Feuille1").Cells(2 + J, 12)
Plage(J, I) = Sheets("Feuille1").Cells(2 + J, 21 + I)
' par ailleurs je sais pas si je dois créer de nouveaux ''DIM" pour la feuille 1, ou si je peux reprendre dans cette logique ?

Next J
Next I
End If
End Sub

Par ailleurs, un grand merci à ceux qui participent ! Pour être honnête, ce code est grandement attendu par mon équipe, il faut croire que les entreprises aiment se reposer sur les stagiaires comme moi ! Votre aide m'est vraiment précieuse

2classeur2-test.xlsx (114.41 Ko)

Salut TomateParis,
Salut les as,

pas beaucoup mieux...
Comme je vois l'affaire au travers de tes deux fichiers-exemple, les types de valeurs n'ont pas de colonne fixe !
Il conviendrait donc, si tu veux un traitement facile, de fixer dans la feuille des risques un libellé de colonne particulier et unique :
- pour repérer la colonne "Risque" ;
- pour repérer la première colonne des "titres".
Le reste coulerait de source...
Je ne me suis pas occupé du "grisage" des cellules.

Ainsi, dans le fichier joint, tu dois double-cliquer sur la colonne contenant la liste des risques pour que la macro affiche des résultats.

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
'
Dim tRISK, tYN, tBDD
'
Cancel = True
'
iRow = Range(fctCol(Target.Column) & Rows.Count).End(xlUp).Row
tRISK = Range(fctCol(Target.Column) & 4).Resize(iRow - 3, 1).Value
tYN = Range("U4:GC" & iRow).Formula
tBDD = Worksheets("BDD").[A2].CurrentRegion.Value
'
For x = 2 To UBound(tRISK, 1)
    For y = 2 To UBound(tBDD, 2)
        If tBDD(1, y) = tRISK(x, 1) Then
            For Z = 1 To UBound(tYN, 2)
                If tYN(1, Z) <> "Synthese" Then
                    For k = 2 To UBound(tBDD, 1)
                        If tBDD(k, 1) = tYN(1, Z) Then _
                            tYN(x, Z) = tBDD(k, y): _
                            Exit For
                    Next
                End If
            Next
            Exit For
        End If
    Next
Next
'
Range("U4:GC" & iRow).Formula = tYN
'
End Sub
5tomateparis.xlsm (125.23 Ko)


A+

Salut Curulis,

Merci pour ta réponse, ainsi qu'au autres une fois de plus !

Pour ton code, je n'arrive pas à l'intégrer dans un autre fichier, y'a t-il un paramétrè pour activer ce dernier ? Au passage j'ai essayé de le reprendre avec le même fichier juste en insérant le code par moi même, mais ça ne marche pas ... ?

Difficile de répondre sans avoir le fichier : trop de flou...

Comme dit précédemment, pour "automatiser" sans se tracasser de la position des colonnes de valeurs (RISK, Titres) :
- il faut un en-tête de colonne "Risque" ;
- un en-tête de première colonne "Titres" ;
- la première ligne des valeurs est-elle toujours la 5e ? Si non, ces en-têtes permettraient de localiser les blocs de valeurs.

Bref, sans réponses à ces quelques incertitudes...


A+

Re!

Voici le fichier comme je te disais,

Par ailleurs, je me posais la question, a titre informatif. Ne serait-il pas possible de reprendre le code que j'ai émis un petit peu plus haut ? Enfin quelque chose de cette logique je veux dire.. Etant donné que ce code devrait me servir d'outil de travail dans le futur. Et l'idée que tu as proposé Curalis semble être vraiment bien, beaucoup trop bien pour mon niveau ..

Du coup y'a certaines lignes que je ne comprend pas dans ton code, vu que je suis loin d'avoir un tel niveau !

2tomateparis-v2.xlsm (126.35 Ko)

Ou j'ai une autre idée, ne serait-il pas possible d'ajouter quelques commentaires afin d'expliquer ton code ? Par la suite si j'ai les explications je pourrais sans doute m'en imprégner pour l'utiliser dans le futur !

A+ & merci encore ! ;)

Rechercher des sujets similaires à "formule vba feuilles"