FONCTION SI

Résolu
cindy001 Messages postés 108 Statut Membre -  
cindy001 Messages postés 108 Statut Membre -
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

  1. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744
     
    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. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744
       
      Tu peux mettre cette macro dans ton classeur PERSO et l'utiliser sur n'importe quel classeur actif.
      0
  2. Christof422 Messages postés 990 Statut Membre 213
     
    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
  3. cindy001 Messages postés 108 Statut Membre 2
     
    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
  4. Christof422 Messages postés 990 Statut Membre 213
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. cindy001 Messages postés 108 Statut Membre 2
     
    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
  7. Christof422 Messages postés 990 Statut Membre 213
     
    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
  8. cindy001 Messages postés 108 Statut Membre 2
     
    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. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744
       
      pour tes 1500 lignes tu ne devrais pas dépasser une seconde d'exécution.
      0
  9. cindy001 Messages postés 108 Statut Membre 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. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744
       
      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
  10. cindy001 Messages postés 108 Statut Membre 2
     
    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
  11. ccm81 Messages postés 11033 Statut Membre 2 434
     
    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
  12. cindy001 Messages postés 108 Statut Membre 2
     
    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
  13. ccm81 Messages postés 11033 Statut Membre 2 434
     
    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. cindy001 Messages postés 108 Statut Membre 2
       
      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
  14. ccm81 Messages postés 11033 Statut Membre 2 434
     
    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. cindy001 Messages postés 108 Statut Membre 2
       
      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
  15. ccm81 Messages postés 11033 Statut Membre 2 434
     
    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. cindy001 Messages postés 108 Statut Membre 2
       
      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. cindy001 Messages postés 108 Statut Membre 2
       
      Merci c ce que je voulais
      Merci à vous tous
      0
  16. ccm81 Messages postés 11033 Statut Membre 2 434
     
    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
  17. Christof422 Messages postés 990 Statut Membre 213
     
    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
  18. Raymond PENTIER Messages postés 58211 Date d'inscription   Statut Contributeur Dernière intervention   17 480
     
    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. Raymond PENTIER Messages postés 58211 Date d'inscription   Statut Contributeur Dernière intervention   17 480
       
      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. Christof422 Messages postés 990 Statut Membre 213
       
      C'est le même problème que moi. des qu'elle va entrer un chiffre, la formule sera effacé.
      0
    3. Raymond PENTIER Messages postés 58211 Date d'inscription   Statut Contributeur Dernière intervention   17 480
       
      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. Tobar4 Messages postés 284 Date d'inscription   Statut Membre Dernière intervention   94
       
      Mais si les nombres ont été saisis avant ?
      0
  19. Tobar4 Messages postés 284 Date d'inscription   Statut Membre Dernière intervention   94
     
    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. Tobar4 Messages postés 284 Date d'inscription   Statut Membre Dernière intervention   94
       
      Petite correction, ça serait plus simple en partant de ta dernière colonne...
      0
    2. Tobar4 Messages postés 284 Date d'inscription   Statut Membre Dernière intervention   94
       
      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