FONCTION SI

Résolu
cindy001 Messages postés 102 Date d'inscription   Statut Membre Dernière intervention   -  
cindy001 Messages postés 102 Date d'inscription   Statut Membre Dernière intervention   -
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


A voir également:

18 réponses

gbinforme Messages postés 14946 Date d'inscription   Statut Contributeur Dernière intervention   4 725
 
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
gbinforme Messages postés 14946 Date d'inscription   Statut Contributeur Dernière intervention   4 725
 
Tu peux mettre cette macro dans ton classeur PERSO et l'utiliser sur n'importe quel classeur actif.
0
Christof422 Messages postés 871 Date d'inscription   Statut Membre Dernière intervention   212
 
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
cindy001 Messages postés 102 Date d'inscription   Statut Membre Dernière intervention   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
Christof422 Messages postés 871 Date d'inscription   Statut Membre Dernière intervention   212
 
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cindy001 Messages postés 102 Date d'inscription   Statut Membre Dernière intervention   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
Christof422 Messages postés 871 Date d'inscription   Statut Membre Dernière intervention   212
 
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
cindy001 Messages postés 102 Date d'inscription   Statut Membre Dernière intervention   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
gbinforme Messages postés 14946 Date d'inscription   Statut Contributeur Dernière intervention   4 725
 
pour tes 1500 lignes tu ne devrais pas dépasser une seconde d'exécution.
0
cindy001 Messages postés 102 Date d'inscription   Statut Membre Dernière intervention   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
gbinforme Messages postés 14946 Date d'inscription   Statut Contributeur Dernière intervention   4 725
 
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
cindy001 Messages postés 102 Date d'inscription   Statut Membre Dernière intervention   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
ccm81 Messages postés 10909 Date d'inscription   Statut Membre Dernière intervention   2 433
 
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
cindy001 Messages postés 102 Date d'inscription   Statut Membre Dernière intervention   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
ccm81 Messages postés 10909 Date d'inscription   Statut Membre Dernière intervention   2 433
 
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
cindy001 Messages postés 102 Date d'inscription   Statut Membre Dernière intervention   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
ccm81 Messages postés 10909 Date d'inscription   Statut Membre Dernière intervention   2 433
 
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
cindy001 Messages postés 102 Date d'inscription   Statut Membre Dernière intervention   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
ccm81 Messages postés 10909 Date d'inscription   Statut Membre Dernière intervention   2 433
 
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
cindy001 Messages postés 102 Date d'inscription   Statut Membre Dernière intervention   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
cindy001 Messages postés 102 Date d'inscription   Statut Membre Dernière intervention   2
 
Merci c ce que je voulais
Merci à vous tous
0
ccm81 Messages postés 10909 Date d'inscription   Statut Membre Dernière intervention   2 433
 
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
Christof422 Messages postés 871 Date d'inscription   Statut Membre Dernière intervention   212
 
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
Raymond PENTIER Messages postés 58998 Date d'inscription   Statut Contributeur Dernière intervention   17 369
 
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
Raymond PENTIER Messages postés 58998 Date d'inscription   Statut Contributeur Dernière intervention   17 369
 
Celui qui a cru devoir émettre un vote négatif serait bien venu d'expliquer en quoi ma proposition n'est pas satisfaisante !
0
Christof422 Messages postés 871 Date d'inscription   Statut Membre Dernière intervention   212
 
C'est le même problème que moi. des qu'elle va entrer un chiffre, la formule sera effacé.
0
Raymond PENTIER Messages postés 58998 Date d'inscription   Statut Contributeur Dernière intervention   17 369
 
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
Tobar4 Messages postés 261 Date d'inscription   Statut Membre Dernière intervention   94
 
Mais si les nombres ont été saisis avant ?
0
Tobar4 Messages postés 261 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
Tobar4 Messages postés 261 Date d'inscription   Statut Membre Dernière intervention   94
 
Petite correction, ça serait plus simple en partant de ta dernière colonne...
0
Tobar4 Messages postés 261 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