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 -
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
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:
- FONCTION SI
- Fonction si et - Guide
- Fonction miroir - Guide
- Fonction moyenne excel - Guide
- Fonction remplacer sur word - Guide
- Fonction somme excel - Guide
18 réponses
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 :
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
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.
Avec une maccro comme ca :
ca marcherai pas?
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?
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
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
Autant pour moi j'avais mal compris.
C'est bon la?
Le premier pas vers la solution est la recherche. Notre ami Google connaît sûrement la solution...
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...
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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
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
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?
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?
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
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
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
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
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.
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.
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
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
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
bonne suite
> 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
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
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
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
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
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
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
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.
bonne suite
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
re
un petit réglage sur la valeur de pos devrait aller
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
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
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
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
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
Sinon tu peux mettre cette formule dans la cellule B2:
Et l'étendre sur toute tes lignes.
A non je dis une betise parce que après tes nombre remplaceront la formule...
=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...
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 !
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 !
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 ...
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 ...
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.
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.
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.
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.