Microsoft 365 SI cellule vide dans la colonne A

Moreno076

XLDnaute Impliqué
Bonsoir le forum

Je souhaiterais adapter cette formule.
Si dans la colonne A case vide alors on applique cette formule et on ajoute en plus quantité de la colonne I sinon on laisse son contenu.
SI possible avec une petite variante, si 'RLR'!A:A = date du jour alors écrire "RECEPTIONNEE"

Range("A2").Formula = "=IFERROR(INDEX('RLR'!A:A,MATCH(B2,'RLR'!C:C,0)),"""")"
Range("A2:A" & Derlg).FillDown

Merci
 
Dernière édition:

Moreno076

XLDnaute Impliqué
Bonsoir.
Non, mais ce qui est possible c'est :
VB:
Range("A2:A" & Derlg).SpecialCells(xlCellTypeBlanks).Formula _
   = "=IFERROR(INDEX('RLR'!A:A,MATCH(B2,'RLR'!C:C,0)),"""")"
Bonjour DanReb

J'ai fait comme ça dans ma macro

Derlg = Worksheets("Synthèse").Range("b" & Rows.Count).End(xlUp).Row

Range("A2:A" & Derlg).SpecialCells(xlCellTypeBlanks).Formula _
= "=IFERROR(INDEX('ReceptionReappro'!A:A,MATCH(B2,'ReceptionReappro'!C:C,0)),"""")"
Range("K2:K" & Derlg) = "=IFERROR(INDEX('X3'!I:I,MATCH(B2,'X3'!G:G,0)),"""")"
Range("L2:L" & Derlg) = "=IFERROR(INDEX('X3'!J:J,MATCH(B2,'X3'!G:G,0)),"""")"


Du coup ca ne fonctionne pas ca me met que les données de la feuille X3

Cdlt
 

Dranreb

XLDnaute Barbatruc
Les possibilités de la méthode SpecialCells étant limitées, s'il faut pouvoir toucher des cellules ayant une valeur spécifique, il faut utiliser des fonctions de service un peu plus élaborées. Par exemple :
VB:
Option Explicit
Sub Test()
   ColLignesOùRelat(CelDéb:=[A2], ColQuoi:="A", OPé:="=", Valeur:="").Formula _
      = "=IFERROR(INDEX('RLR'!A:A,MATCH(B2,'RLR'!C:C,0)),"""")"
   End Sub
Function ColLignesOùRelat(ByVal CelDéb As Range, ByVal ColQuoi, ByVal OPé As String, ByVal Valeur) As Range
Rem. ——— Cellules partant de CelDéb dans sa colonne où la colonne ColQuoi est en relation Opé avec Valeur.
   On Error Resume Next
   Set ColLignesOùRelat = Intersect(LignesOùRelat(CelDéb, ColQuoi, OPé, Valeur), CelDéb.EntireColumn)
   End Function
Function LignesOùRelat(ByVal LigneDéb As Range, ByVal ColQuoi, ByVal OPé As String, ByVal Valeur) As Range
Rem. ——— Lignes entières partant de LigneDéb où la colonne ColQuoi est en relation Opé avec une Valeur.
   If Not IsNumeric(ColQuoi) Then ColQuoi = LigneDéb.Worksheet.Columns(ColQuoi).Column
   If VarType(Valeur) = vbString Then Valeur = """" & Replace(Valeur, _
      """", """""") & """" Else Valeur = Trim$(Str$(Valeur))
   On Error Resume Next
   Set LignesOùRelat = LignesOùCondR1C1(LigneDéb, CondR1C1:="RC" & ColQuoi & OPé & Valeur)
   End Function
Function ColLignesOùCondR1C1(ByVal CelDéb As Range, ByVal CondR1C1 As String) As Range
Rem. ——— Cellules partant de CélDéb dans sa colonne dont les lignes vérifient une condition R1C1 CondR1C1.
   On Error Resume Next
   Set ColLignesOùCondR1C1 = Intersect(LignesOùCondR1C1(CelDéb, CondR1C1), CelDéb.EntireColumn)
   End Function
Function LignesOùCondR1C1(ByVal LigneDéb As Range, ByVal CondR1C1 As String) As Range
Rem. ——— Lignes entières partant de LigneDéb vérifiant une condition R1C1 CondR1C1.
   Dim Rng As Range
   Set Rng = PlageÀPartirDe(LigneDéb.EntireRow): If Rng Is Nothing Then Exit Function
   Set Rng = Rng.Columns(Rng.Columns.Count + 1)
   Application.ScreenUpdating = False
   On Error Resume Next
   Rng.FormulaR1C1 = "=1/(" & CondR1C1 & ")"
   Set LignesOùCondR1C1 = Rng.SpecialCells(xlCellTypeFormulas, 1).EntireRow
   Rng.Delete xlShiftToLeft
   End Function
Function PlageÀPartirDe(ByVal CelDéb As Range) As Range
Rem. ——— Plage utilisée à partir de CelDéb.
   Dim NbrLig As Long, NBrCol As Long
   With CelDéb.Worksheet.UsedRange:
      NbrLig = .Row + .Rows.Count - CelDéb.Row
      NBrCol = .Column + .Columns.Count - CelDéb.Column
      If NbrLig <= 0 Or NBrCol <= 0 Then Exit Function
      End With
   Set PlageÀPartirDe = CelDéb.Resize(NbrLig, NBrCol)
   End Function
 

Moreno076

XLDnaute Impliqué
Les possibilités de la méthode SpecialCells étant limitées, s'il faut pouvoir toucher des cellules ayant une valeur spécifique, il faut utiliser des fonctions de service un peu plus élaborées. Par exemple :
VB:
Option Explicit
Sub Test()
   ColLignesOùRelat(CelDéb:=[A2], ColQuoi:="A", OPé:="=", Valeur:="").Formula _
      = "=IFERROR(INDEX('RLR'!A:A,MATCH(B2,'RLR'!C:C,0)),"""")"
   End Sub
Function ColLignesOùRelat(ByVal CelDéb As Range, ByVal ColQuoi, ByVal OPé As String, ByVal Valeur) As Range
Rem. ——— Cellules partant de CelDéb dans sa colonne où la colonne ColQuoi est en relation Opé avec Valeur.
   On Error Resume Next
   Set ColLignesOùRelat = Intersect(LignesOùRelat(CelDéb, ColQuoi, OPé, Valeur), CelDéb.EntireColumn)
   End Function
Function LignesOùRelat(ByVal LigneDéb As Range, ByVal ColQuoi, ByVal OPé As String, ByVal Valeur) As Range
Rem. ——— Lignes entières partant de LigneDéb où la colonne ColQuoi est en relation Opé avec une Valeur.
   If Not IsNumeric(ColQuoi) Then ColQuoi = LigneDéb.Worksheet.Columns(ColQuoi).Column
   If VarType(Valeur) = vbString Then Valeur = """" & Replace(Valeur, _
      """", """""") & """" Else Valeur = Trim$(Str$(Valeur))
   On Error Resume Next
   Set LignesOùRelat = LignesOùCondR1C1(LigneDéb, CondR1C1:="RC" & ColQuoi & OPé & Valeur)
   End Function
Function ColLignesOùCondR1C1(ByVal CelDéb As Range, ByVal CondR1C1 As String) As Range
Rem. ——— Cellules partant de CélDéb dans sa colonne dont les lignes vérifient une condition R1C1 CondR1C1.
   On Error Resume Next
   Set ColLignesOùCondR1C1 = Intersect(LignesOùCondR1C1(CelDéb, CondR1C1), CelDéb.EntireColumn)
   End Function
Function LignesOùCondR1C1(ByVal LigneDéb As Range, ByVal CondR1C1 As String) As Range
Rem. ——— Lignes entières partant de LigneDéb vérifiant une condition R1C1 CondR1C1.
   Dim Rng As Range
   Set Rng = PlageÀPartirDe(LigneDéb.EntireRow): If Rng Is Nothing Then Exit Function
   Set Rng = Rng.Columns(Rng.Columns.Count + 1)
   Application.ScreenUpdating = False
   On Error Resume Next
   Rng.FormulaR1C1 = "=1/(" & CondR1C1 & ")"
   Set LignesOùCondR1C1 = Rng.SpecialCells(xlCellTypeFormulas, 1).EntireRow
   Rng.Delete xlShiftToLeft
   End Function
Function PlageÀPartirDe(ByVal CelDéb As Range) As Range
Rem. ——— Plage utilisée à partir de CelDéb.
   Dim NbrLig As Long, NBrCol As Long
   With CelDéb.Worksheet.UsedRange:
      NbrLig = .Row + .Rows.Count - CelDéb.Row
      NBrCol = .Column + .Columns.Count - CelDéb.Column
      If NbrLig <= 0 Or NBrCol <= 0 Then Exit Function
      End With
   Set PlageÀPartirDe = CelDéb.Resize(NbrLig, NBrCol)
   End Function

C'est du grand art !
Ca fonctionne parfaitement un GRAND merci :)

Pour faire évoluer encore mon tableau du coup je souhaiterais que si dans la colonne A, la case est vide alors :

Si colonne H = date du jour et colonne K vide alors "A COMMANDER"
Si colonne H= date du jour et colonne K rempli alors "SAISI CE JOUR"
Si colonne H < date du jour et colonne K vide alors "A VERIFIER"
Si colonne G = "non géré' et colonne K vide alors "A COMMANDER"


Si la colonne A est la date du jour alors marqué "Réceptionner ce jour".

Je ne sais pas si tu peux adapter ces conditions à ta super formule ?
J'ai mis ta macro en bouton TEST

Merci bien
 

Pièces jointes

  • GR3.xlsm
    330.5 KB · Affichages: 7

Dranreb

XLDnaute Barbatruc
Oui je suppose qu'on peut faire comme ça :
VB:
Sub Test()
   On Error Resume Next
   ColLignesOùCondR1C1(CelDéb:=[A2], CondR1C1:="AND(ISEMPTY(RC1),RC8=" & CDbl(Date) & ",ISEMPTY(RC11))").Value = "À COMMANDER"
   ColLignesOùCondR1C1(CelDéb:=[A2], CondR1C1:="AND(ISEMPTY(RC1),RC8=" & CDbl(Date) & ",NOT(ISEMPTY(RC11)))").Value = "SAISI CE JOUR"
   ColLignesOùCondR1C1(CelDéb:=[A2], CondR1C1:="AND(ISEMPTY(RC1),RC8<" & CDbl(Date) & ",ISEMPTY(RC11))").Value = "À VÉRIFIER"
   ColLignesOùCondR1C1(CelDéb:=[A2], CondR1C1:="AND(ISEMPTY(RC1),RC8<" & CDbl(Date) & ",ISEMPTY(RC11))").Value = "À VÉRIFIER"
   ColLignesOùCondR1C1(CelDéb:=[A2], CondR1C1:="AND(ISEMPTY(RC1),RC7=""non géré"",ISEMPTY(RC11))").Value = "À COMMANDER"
   ColLignesOùRelat(CelDéb:=[A2], ColQuoi:="A", OPé:="=", Valeur:="").Formula _
      = "=IFERROR(INDEX('ReceptionReappro'!A:A,MATCH(B2,'ReceptionReappro'!C:C,0)),"""")"
   End Sub
Vous remarquerez que j'ai mes à la fin celle qui met la formule parce que sans cela les autre n'auraient pas l'occasion d'opérer. En effet si la cellule est vide, elle est aussi égale à un texte vide, ce qui n'est pas la même chose.
Or dans vos doléances supplémentaires vous demandez à traiter les cellules vides, pas celles valant un texte vide.

Remarque: si c'était pour moi je repenserais tout ça différemment.
 
Dernière édition:

Moreno076

XLDnaute Impliqué
Oui je suppose qu'on peut faire comme ça :
VB:
Sub Test()
   On Error Resume Next
   ColLignesOùCondR1C1(CelDéb:=[A2], CondR1C1:="AND(ISEMPTY(RC1),RC8=" & CDbl(Date) & ",ISEMPTY(RC11))").Value = "À COMMANDER"
   ColLignesOùCondR1C1(CelDéb:=[A2], CondR1C1:="AND(ISEMPTY(RC1),RC8=" & CDbl(Date) & ",NOT(ISEMPTY(RC11)))").Value = "SAISI CE JOUR"
   ColLignesOùCondR1C1(CelDéb:=[A2], CondR1C1:="AND(ISEMPTY(RC1),RC8<" & CDbl(Date) & ",ISEMPTY(RC11))").Value = "À VÉRIFIER"
   ColLignesOùCondR1C1(CelDéb:=[A2], CondR1C1:="AND(ISEMPTY(RC1),RC8<" & CDbl(Date) & ",ISEMPTY(RC11))").Value = "À VÉRIFIER"
   ColLignesOùCondR1C1(CelDéb:=[A2], CondR1C1:="AND(ISEMPTY(RC1),RC7=""non géré"",ISEMPTY(RC11))").Value = "À COMMANDER"
   ColLignesOùRelat(CelDéb:=[A2], ColQuoi:="A", OPé:="=", Valeur:="").Formula _
      = "=IFERROR(INDEX('ReceptionReappro'!A:A,MATCH(B2,'ReceptionReappro'!C:C,0)),"""")"
   End Sub
Vous remarquerez que j'ai mes à la fin celle qui met la formule parce que sans cela les autre n'auraient pas l'occasion d'opérer. En effet si la cellule est vide, elle est aussi égale à un texte vide, ce qui n'est pas la même chose.
Or dans vos doléances supplémentaires vous demandez à traiter les cellules vides, pas celles valant un texte vide.

Remarque: si c'était pour moi je repenserais tout ça différemment.
Bonsoir Danreb,
Je viens seulement de m'y mettre et avec cette heure tardive

J'ai du faire n'importe quoi car ca ne marche pas.

Merci en tout cas
 

Pièces jointes

  • GR3Danreb.xlsm
    334.2 KB · Affichages: 5

Discussions similaires

Réponses
9
Affichages
133

Statistiques des forums

Discussions
312 194
Messages
2 086 071
Membres
103 110
dernier inscrit
Privé