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. 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. 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
    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

      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
    4. 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. 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
      2. 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. 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. 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
          2. 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
          3. 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
          4. 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
              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. 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. 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. 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 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. 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