FONCTION SI

Résolu
Bonjour,

Jai une matrice de 1500 lignes et 27 colonnes:
Dans cette matrice j'ai des chiffres(un seul par ligne mais qui ne sont pas sur la meme colonne selon la ligne) et partout ailleurs j'ai des ""
ce que j'aimerai(avec une formule) c'est dés que j'arrive au chiffre pour une ligne donné recopier ce chiffre jusqu'à la dernière colonne
ex sur la première ligne j'ai des blancs de la colonne A à la colonne G
en H1 j'ai un 57 j'aimerai mettre 57 de H1 à la dernière colonne de la matrice

le chiffre ne se trouve pas toujours en colonne H, c'est aléatoire d'ou ma demande car j'ai besoin d'une formule
A1=SI(?????) et puis j'aimerai tirer la formule pour tout le reste de la matrice
Merci

18 réponses

Résumé de la discussion

Le problème porte sur une matrice Excel de 1500 lignes et 27 colonnes où chaque ligne contient un chiffre dans une colonne aléatoire et des blancs. L’objectif est ensuite de recopier ce chiffre jusqu’à la dernière colonne sans écraser les valeurs existantes, d’où la proposition d’une macro VBA. Plusieurs répondants décrivent des variantes utilisant FillRight et une fonction Match pour localiser la colonne initiale, puis étendre la valeur jusqu’au bout de la ligne. D’autres corrigent des détails d’implémentation et insistent sur l’optimisation afin que 1500 lignes s’exécutent rapidement, avec des tests pas à pas recommandés.

Bobot (l’IA à votre service)
  1. Contributeur
    bonjour

    A1=SI(?????) et puis j'aimerai tirer la formule pour tout le reste de la matrice

    Tu ne peux pas mettre de formule ainsi car tu vas écraser tes valeurs en "tirant".

    Une macro qui ne devrait pas prendre beaucoup de temps d'exécution :

    Sub remplir_fin()
    Dim lig As Long, pos As Integer
    Application.ScreenUpdating = False
    On Error Resume Next
    For lig = 1 To ActiveSheet.UsedRange.Rows.Count
        pos = Application.WorksheetFunction.Match(0, Cells(lig, 1).Resize(1, 27), -1)
        Cells(lig, pos).Resize(1, 28 - pos).FillRight
    Next lig
    End Sub
    
    1
    1. Contributeur
      Tu peux mettre cette macro dans ton classeur PERSO et l'utiliser sur n'importe quel classeur actif.
      0
  2. Avec une maccro comme ca :

    Dim i, j As Integer
    
    For j = 1 To 1500
    For i = 1 To 27
    
    If Cells(j, i) <> "" Then
    Cells(j, 27) = Cells(j, i)
    Exit For
    End If
    
    
    Next i
    Next j


    ca marcherai pas?
    0
    1. Merci pour ta réponse

      là ca ne recopi le chiffre QUE à la dernière colonne sur la ligne en question

      J'aimerai que ca recopi le chiffre jusqu'à la dernière colonne

      Merci encore
      0
      1. Autant pour moi j'avais mal compris.

        Dim i, j, k As Integer 
        
        For j = 1 To 1500 
        For i = 1 To 27 
        
        If Cells(j, i) <> "" Then 
        For k = i To 27 
        Cells(j, k) = Cells(j, i) 
        Next k 
        End If 
        
        
        Next i 
        Next j 


        C'est bon la?
        Le premier pas vers la solution est la recherche. Notre ami Google connaît sûrement la solution...
        0
        1. Merci encore pour ta réponse
          je l'ai lancé y'a plus de 10 minutes elle est toujours pas terminé la macro??
          Avec une formule ca irait beaucoup plus vite t'aurais pas d'idée c pas que 10 minutes c beaucoup mais ca je dois le réapliquer à plusieurs fichiers excel

          Merci encore
          0
          1. Ben y'a qu'en meme 1500 ligne a traiter^^.

            Enfin moi je l'vais tester avec seulement 10 ligne donc c'etait aller vite^^

            Après avec une formule je ne sais pas comment faire dsl.

            Tu a besoin de faire ce traitement souvent?
            0
            1. En fait ca s'est jamais terminer(la première macro) ca m'a planté le pc j'ai du tout arreter et fermer Excel
              j'ai perdu tout ce que j'avais fait

              jle referai demain et j'essairai avec la deuxième macro avec l'

              Application.WorksheetFunction

              Merci encore
              0
              1. Contributeur
                pour tes 1500 lignes tu ne devrais pas dépasser une seconde d'exécution.
                0
            2. Cette macro a l'air de fonctionner mais en fait j'ai des info dans les colonnes 1 à 6 et sur la ligne 1 (maintenant)
              donc j'ai changer ca et ca ne donne rien la macro s'execute rapidement mais à la fin rien pas de changement (maintenant ma matrice de chiffre commence en G2(ligne 2 colonne 7))

              Sub remplir_fin()
              Dim lig As Long, pos As Integer
              Application.ScreenUpdating = False
              On Error Resume Next
              For lig = 2 To ActiveSheet.UsedRange.Rows.Count
              pos = Application.WorksheetFunction.Match(1, Cells(lig, 7).Resize(2, 42), -1)
              Cells(lig, pos).Resize(2, 43 - pos).FillRight
              Next lig
              End Sub

              Merci

              PS: Merci à toi aussi Raymond mais (C'est le même problème que moi. des qu'elle va entrer un chiffre, la formule sera effacé.) la remarque de cristof est exact

              Merci encore
              0
              1. Contributeur
                bonjour cindy,

                Si tu pouvais nous mettre un exemple de classeur, sans données identifiables et privées, mais avec la structure de tes données sur http://www.cijoint.fr/ puis nous mettre le lien généré ici ce serait plus facile.
                0
            3. Voila le fichier:

              La matrice ou j'ai mes nombres est la matrice F2:AQ570

              en première ligne et en colonne A, B, C, D et E j'avais des informations confidentielles que j'ai supprimés

              ex sur la ligne2:
              le nombre est en colonne AI j'ai 74 je veux donc avoir un 74 en AI2, AJ2.... jusqu'à AQ2

              ......

              autre exemple: sur la ligne 135 j'ai le nombre en colonne G: c'est 43

              J'aimerai avoir un 43 en G135, H135, I135.....et jusqu'à AQ135

              Merci à tous
              0
              1. bonjour à tous

                > gbinforme
                super ta procédure
                si tu pouvais expliquer un peu les deux lignes de la boucle, ça serait le top
                j'ai tâtonné un peu pour la paramétrer, mais je n'ai pas tout compris ....

                >cindy
                il suffit de la paramétrer un peu pour l'adapter à tes matrices

                Option Explicit
                
                Private Sub CommandButton1_Click()
                Const lide = 3
                Const code = 4
                Const cofi = 27
                  Call remplir_fin(lide, code, cofi)
                End Sub
                
                Sub remplir_fin(lideb, codeb, cofin)
                Dim lig As Long, pos As Integer
                Application.ScreenUpdating = False
                On Error Resume Next
                For lig = lideb To ActiveSheet.UsedRange.Rows.Count
                    pos = Application.WorksheetFunction.Match(0, Cells(lig, codeb).Resize(1, cofin - codeb + 1), -1)
                    Cells(lig, codeb + pos - 1).Resize(1, cofin - pos + 1).FillRight
                Next lig
                Application.ScreenUpdating = True
                End Sub
                


                bonne suite
                0
                1. http://www.cijoint.fr/cjlink.php?file=cj201106/cijieGScbj.xls

                  J'ai lancée ta macro ccm81 elle est très rapide et elle marche bien si ce n'est qu'elle s'arrete en colonne AL et pas AQ
                  j'ai essayé de la paramétrer avec

                  Const cofi = 38 et pas 27(alors que AL c meme pas la colonne 27 c ce que tu as mis dans le code)
                  car la colonne AQ c la colonne 38

                  mais ca me met les chiffres un peu n'importe ou

                  c en core plus faux

                  Merci à tous
                  0
                  1. re

                    RQ1. il y avait effectivement un pb, mais j'ai bien dit que je n'avais pas tout compris .....
                    RQ2. la colonne AQ est la colonne 43 et non 38 (chez moi)
                    RQ3. comment utilises tu la macro, dans mon exemple je l'ai déclenchée par un bouton et c'est le clic sur ce bouton qui appelle remplit_fin et lui envoie les valeurs des constantes lide, cofi, code.
                    RQ4. Si tu ne veux pas de bouton, il te faut mettre les constantes (qui s'appelleront alors lideb, cofin et cofin) dans remplit_fin qui n'a plus alors besoin de parametres
                    RQ5. tu peu tester dans la feuille "feuil2 (3)" de mon classeur
                    RQ6. Pour tester une procedure il est souhaitable de mettre un point d'arret et de la tester en pas a pas histoire de voir, et de comprendre ce qui se passe
                    bonne suite

                    https://www.cjoint.com/?0FrpqOCdNB3
                    0
                    1. C bien ce que j'avais compris paramétrer le code: je veux travailler sur la matrice G2:AQ570

                      Const lide = 2 car je commence le travail en ligne2
                      la colonne G est la colonne 7(donc je mets Const code = 7)
                      la colonne AQ est la colonne 43(donc je mets Const cofi = 43)
                      Mais ca s'arrete quand meme en colonne AL(qui est la colonne 38)??
                      dsl pour le fichier https://www.cjoint.com/?0FrpqOCdNB3
                      je n'arrive pas à le lire
                      Voila le code modifier que j'aimerai lancer effectivement sans bouton
                      Merci

                      Sub remplir_fin(lideb, codeb, cofin)
                      Const lide = 2
                      Const code = 7
                      Const cofi = 43
                      Dim lig As Long, pos As Integer
                      Application.ScreenUpdating = False
                      On Error Resume Next
                      For lig = lideb To ActiveSheet.UsedRange.Rows.Count
                      pos = Application.WorksheetFunction.Match(0, Cells(lig, codeb).Resize(1, cofin - codeb + 1), -1)
                      Cells(lig, codeb + pos - 1).Resize(1, cofin - pos + 1).FillRight
                      Next lig
                      Application.ScreenUpdating = True

                      End Sub
                      0
                  2. re

                    as tu lu les remarques de mon dernier post ? ainsi que le code de la macro

                    ceci devrait ne pas être loin du compte, et tu peux remercier gbinforme qui est à l'origine de la macro et en profiter pour lui ajouter un point.

                    Sub remplir_fin() 
                    Const lideb = 2 
                    Const codeb = 7 
                    Const cofin = 43 
                    Dim lig As Long, pos As Integer 
                    Application.ScreenUpdating = False 
                    On Error Resume Next 
                    For lig = lideb To ActiveSheet.UsedRange.Rows.Count 
                        pos = Application.WorksheetFunction.Match(0, Cells(lig, codeb).Resize(1, cofin - codeb + 1), -1) 
                        Cells(lig, codeb + pos - 1).Resize(1, cofin - codeb + 2 - pos).FillRight 
                    Next lig 
                    Application.ScreenUpdating = True 
                    End Sub

                    bonne suite
                    0
                    1. dernière petite chose
                      le cas ou j'ai le chiffre que à la dernière colonne(en AQ
                      ex sur la ligne 13 j'ai 40 en AQ13:
                      pour ces cas là la macro me met des vides partout sur ces lignes

                      Merci à tous et à toi en particulier gbinforme
                      0
                  3. re

                    un petit réglage sur la valeur de pos devrait aller

                        If pos < cofin - codeb + 1 Then 
                          Cells(lig, codeb + pos - 1).Resize(1, cofin - codeb + 2 - pos).FillRight 
                        End If
                    0
                    1. J'ai mis ca comme ca ca ne change rien, le If je ne vois pas exactement ou je dois le mettre, dans la boucle??

                      Sub remplir_fin()

                      Const lideb = 2
                      Const codeb = 7
                      Const cofin = 43

                      Dim lig As Long, pos As Integer

                      Application.ScreenUpdating = False

                      On Error Resume Next

                      If pos < cofin - codeb + 1 Then
                      Cells(lig, codeb + pos - 1).Resize(1, cofin - codeb + 2 - pos).FillRight
                      End If

                      For lig = lideb To ActiveSheet.UsedRange.Rows.Count
                      pos = Application.WorksheetFunction.Match(0, Cells(lig, codeb).Resize(1, cofin - codeb + 1), -1)
                      Cells(lig, codeb + pos - 1).Resize(1, cofin - codeb + 2 - pos).FillRight
                      Next lig

                      Application.ScreenUpdating = True

                      End Sub
                      0
                    2. Merci c ce que je voulais
                      Merci à vous tous
                      0
                  4. re

                    il suffit de conditionner l'exécution de la lligne
                    Cells(lig, codeb + pos - 1).Resize(1, cofin - codeb + 2 - pos).FillRight
                    donc comme ça

                    Application.ScreenUpdating = False 
                    On Error Resume Next 
                    For lig = lideb To ActiveSheet.UsedRange.Rows.Count 
                        pos = Application.WorksheetFunction.Match(0, Cells(lig, codeb).Resize(1, cofin - codeb + 1), -1) 
                        If pos < cofin - codeb + 1 Then 
                          Cells(lig, codeb + pos - 1).Resize(1, cofin - codeb + 2 - pos).FillRight 
                        End If
                    Next lig 
                    Application.ScreenUpdating = True
                    0
                    1. Sinon tu peux mettre cette formule dans la cellule B2:

                      =SI(B1<>"";B1;"")


                      Et l'étendre sur toute tes lignes.

                      A non je dis une betise parce que après tes nombre remplaceront la formule...
                      -1
                      1. Contributeur
                        Dans cette matrice j'ai des chiffres ... et partout ailleurs j'ai des "" :
                        tu veux dire des nombres ?
                        et comment tu mets les "" ? copier/coller, ou suite à un téléchargement ?

                        sur la première ligne j'ai des blancs de la colonne A à la colonne G ; en H1 j'ai un 57 j'aimerai mettre 57 de H1 à la dernière colonne de la matrice
                        Ce n'est pas si évident : Il est impossible d'avoir en I1 à la fois un "" et une formule !
                        Donc en B1 tu écris la formule =A1 que tu recopies jusqu'à la dernière colonne. Et tu recopies la ligne 1 vers le bas autant que tu veux. Tu auras partout l'affichage "" ou le nombre précédent, mais les cellules ne seront pas vides, dans la mesure où elles contiendront toutes une formule.
                        Est-ce plus clair pour toi ?

                        Salut !
                        -1
                        1. Contributeur
                          Celui qui a cru devoir émettre un vote négatif serait bien venu d'expliquer en quoi ma proposition n'est pas satisfaisante !
                          0
                        2. C'est le même problème que moi. des qu'elle va entrer un chiffre, la formule sera effacé.
                          0
                        3. Contributeur
                          Mais non, Christof422, ce n'est pas un problème, au contraire c'est exactement ce qu'on veut :
                          Tant qu'un nombre n'est pas saisi, la cellule n'affiche rien (mais contient la formule).
                          Dès qu'un nombre est saisi, les cellules suivantes affichent de même nombre (en appliquant la formule).
                          La seule restriction est qu'il ne faut pas changer d'avis et venir ajouter un nombre AVANT celui qui a déjà été saisi, et qui a effectivement remplacé la formule qui y était ...
                          0
                        4. Mais si les nombres ont été saisis avant ?
                          0
                      2. Bonjour,

                        Il existe une solution sans VB, mais elle est un peu plus longue.(opération à répéter 27 fois)
                        Tu applique des tris sur tes colonnes, et tu sélectionnes dans ta première colonne "cellules non vides"
                        Tu sélectionnes ensuite toute ta colonne, puis tu la tires jusqu'à ta dernière colonne (tes valeurs seront donc recopiés dans toutes les colonnes). Tu peux ensuite enlever le filtre, et faire la même chose sur ta colonne 2, 3, 4, ...

                        Pour moi la solution la plus simple reste de passer par VB.

                        Je suis d'accord avec christof, tu ne pourra pas appliquer de formules sur tes cases car en tirant ta formule, tu perdras les valeurs qui sont dans tes cases.

                        T.
                        -1
                        1. Petite correction, ça serait plus simple en partant de ta dernière colonne...
                          0
                        2. Le -1 est un peu rude, ma solution est parfaitement valable.
                          Si les valeurs sont saisis après la création du tableau alors il est possible d'utiliser des formules, mais si il y a déjà des valeurs dans le tableau alors je confirme, il est IMPOSSIBLE de mettre des formules sans faire disparaître les valeurs déjà présente.
                          0