Microsoft 365 somme de 1 sur feul2 données sur feuil1

gilles37

XLDnaute Occasionnel
Bonjour le forum

Je comprends pas .

En feuil1 j'ai un tableau dont un 1 apparait si conditon avec fourmule
J' additionne le nb de 1 sur feuil2 mais resultat 0
si je tape un 1 numerique sans formuledans feuil1, ca fonctionne 🤔

ma formule est: = sumif(feuil1!A3:A60;feuil2!B3;feuil1!F$3:F$60)

feuil1!A3:A60 correspond a la plage de recherche
feuil2! B3 correspond a la valeur recherché
feuil1!F$3:F$60 correspond a la somme des 1 trouvé

merci pour vos retour et bonne journée ensoleillée🥵
 

soan

XLDnaute Barbatruc
Inactif
Bonjour Gilles,

ton fichier en retour. :)

A) sur "Feuil1"

nouvelle formule en E3 : =SI(D3=VRAI;1;"")

j'ai juste enlevé les guillemets qui étaient autour du 1 ; JHA t'en avait bien parlé dans son post #2 :

Image.jpg

gilles37 à dit:
Merci a SOAN et JHA mais cela ne fonctionne pas :mad:
J'arrive tjs pas comprendre, j'ai le sentiment que c'est tout bête

oui, c'est tout bête : il suffisait de suivre le très bon conseil de JHA ! 😄

comment se fait-il que tu ne l'as pas fait ? 🧐




B) sur "Feuil2"

nouvelle formule en C3 :

=SOMME.SI(Feuil1!A$3:A$27;A3;Feuil1!E$3:E$27)

c'était inutile de mettre Feuil2!A3 car A3 est sur
la feuille en cours, qui est justement "Feuil2" !

attention : j'ai mis E$27 au lieu de E$14, car il y a A$27 ;
normalement les 2 plages sont de même longueur !

c'est peut-être plutôt avec A$14 et E$14 :

=SOMME.SI(Feuil1!A$3:A$14;A3;Feuil1!E$3:E$14)

soan
 

Pièces jointes

  • Classeur2.xlsx
    10.2 KB · Affichages: 4
Dernière édition:

gilles37

XLDnaute Occasionnel
Effectivement c'était tout bête. les fameux guillmets .Pourtant JHA me l'avait dit;)
Merci a vous. 👍 vous etes des chefs
Je pensais faire un userform feuil3 de recherche entre deux dates. debut TextBox1 et fin TextBox2
Le resultat afficherait toutes les dates debut et fin dans TextBox3 ainsi que nb total dans Label4 de la personne en label 3 Application.UserName)

Je bloque :mad:🤔
 

Pièces jointes

  • Classeur2 (1).xlsm
    21.5 KB · Affichages: 2

soan

XLDnaute Barbatruc
Inactif
Bonjour Gilles,

ton fichier en retour. :)

* sur "Feuil1" : c'est inchangé : il y a les mêmes données ; ne change pas de feuille, et lis la suite.

* fais Ctrl e ➯ ça ouvre ton formulaire, de la même façon que si tu avais cliqué sur "Bouton 2" de "Feuil3", mais c'est plus pratique car on voit les données de ton tableau ; tu peux faire Ctrl e depuis chacune des 3 feuilles : ça fera pareil ; note que le nom de l'utilisateur est bien affiché entre les 2 champs "date" ; en bas à droite, le cadre pour "nombre :" est vide.

* le formulaire est donc affiché à l'écran, et tu es sur le 1er champ de saisie : date début ; appuie sur la touche Échap ➯ ça ferme le formulaire ; ça permet de quitter facilement si tu changes d'avis et que tu ne veux plus faire de recherche ; ça serait idem si tu avais appuyé sur Échap en étant sur le 2ème champ de saisie date fin.

* fais de nouveau Ctrl e ➯ le formulaire s'affiche de nouveau ; pour date début : saisis "1/1" (comme y'a pas d'année, c'est l'année en cours, donc idem que si tu avais saisi 1/1/2022) ; appuie sur la touche TAB (tabulation) : ça va sur le champ date fin ; saisis "5/3" (donc idem que si tu avais saisi 5/3/2022).

* appuie sur la touche TAB : ça va sur le bouton Valider ; appuie sur Espace : idem qu'un clic sur ce bouton ; ça fait la recherche, les résultats sont affichés dans la fenêtre, et le nombre d'items trouvés est affiché en bas à droite ; pour une nouvelle recherche, il te suffit d'aller sur le champ date début et de saisir d'autres dates ; bien sûr, ça aurait été nettement mieux que ton tableau comporte plus de données, avec des dates différentes : on aurait pu mieux tester, en faisant plusieurs essais ; alors à toi de faire plus de tests.

* si tu es toujours sur le bouton Valider, appuie sur TAB ➯ ça va sur le bouton Fermer ; appuie sur Espace : ça ferme le formulaire ; fin de la démo, il te reste à lire le code VBA.​



code VBA de UserForm1 (42 lignes) :

VB:
Option Explicit

Private Sub cmdOK_Click()
  If Date1 = "" Or Date2 = "" Then Exit Sub
  If Not IsDate(Date1) Or Not IsDate(Date2) Then Exit Sub
  Dim D1 As Date, D2 As Date, D3 As Date, D4 As Date
  Dim chn$, n%, dlg&, lig&
  D1 = DateValue(Date1): D2 = DateValue(Date2)
  With Worksheets("Feuil1")
    dlg = .Cells(Rows.Count, 1).End(3).Row: If dlg < 3 Then Exit Sub
    For lig = 3 To dlg
      With .Cells(lig, 1)
        If Not IsEmpty(.Offset(, 1)) And Not IsEmpty(.Offset(, 2)) Then
          If IsDate(.Offset(, 1)) And IsDate(.Offset(, 2)) Then
            D3 = .Offset(, 1): D4 = .Offset(, 2)
            If D3 >= D1 And D4 <= D2 Then
              chn = chn & D3 & "   " & D4 & "   " & .Value & vbLf
              n = n + 1
            End If
          End If
        End If
      End With
    Next lig
    lbResult = chn: lbNb = n
  End With
End Sub

Private Sub Date1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
  If KeyAscii = 27 Then Unload Me
End Sub

Private Sub Date2_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
  If KeyAscii = 27 Then Unload Me
End Sub

Private Sub cmdClose_Click()
  Unload Me
End Sub

Private Sub UserForm_Initialize()
  lbNom = Application.UserName
End Sub



code VBA de Module1 (3 lignes) :

VB:
Sub Essai()
  UserForm1.Show
End Sub

soan
 

Pièces jointes

  • Classeur2 (1).xlsm
    28.6 KB · Affichages: 4
Dernière édition:

gilles37

XLDnaute Occasionnel
Bonjour le forum, Soan

Merci pou la macro Soan. Tu es un chef;)👋
je cherche comment alimenter combobox1 de l userform avec les donnéees de la feuille4 du même fichier
l'objectif est de sélectionner un nom et date debut et fin puis valider. apparait tous les enregistrement de la personne.
Je sais faire quand c'est sur la meme feuille mais je bloque🤫
Merci a vous
 

Pièces jointes

  • Classeur2 (1) (2).xlsm
    29 KB · Affichages: 1

soan

XLDnaute Barbatruc
Inactif
Bonjour Gilles,

fais Ctrl e ➯ ça ouvre le formulaire ; j'ai mis les champs des 2 dates côte à côte car c'est plus logique pour la saisie des 2 dates ; je ne l'avais pas fait avant car le champ lbNom était juste pour afficher le UserName.

quand tu saisis uniquement les 2 dates, sans choisir de nom à droite, ça fait pareil qu'avant : ça montrera toutes les lignes dont les dates correspondent, quelque soit le nom.

bien sûr, si à droite tu choisis aussi un nom, ça montrera les lignes adéquates de cette personne, et pour laquelle les dates saisies correspondent.

sur le champ cbNom, tu peux aussi appuyer sur Echap pour quitter le UserForm ; c'est pratique au cas où tu changes d'avis et que tu ne veux plus faire de recherche.


* du 1/1 au 5/3, pour CRISTELLE : ça montre 2 lignes.

* mêmes dates, pour PAUL : ça montre 1 seule ligne
car la ligne 4 sans date fin est ignorée.

* mêmes dates, pour PIERRE, ou RENE, ou JEAN :
ça montre 1 seule ligne, car y'en a qu'une seule.

* mêmes dates, pour ERIC ou JEAN RENE : ça ne
montre rien car y'a aucune ligne avec ce nom.​



il ne te reste plus qu'à lire le nouveau code VBA ;
bonne lecture ! :)



code VBA de UserForm1 (50 lignes) :

VB:
Option Explicit

Private Sub cmdOK_Click()
  If Date1 = "" Or Date2 = "" Then Exit Sub
  If Not IsDate(Date1) Or Not IsDate(Date2) Then Exit Sub
  Dim D1 As Date, D2 As Date, D3 As Date, D4 As Date
  Dim chn$, n%, dlg&, lig&
  D1 = DateValue(Date1): D2 = DateValue(Date2)
  With Worksheets("Feuil1")
    dlg = .Cells(Rows.Count, 1).End(3).Row: If dlg < 3 Then Exit Sub
    For lig = 3 To dlg
      With .Cells(lig, 1)
        If Not IsEmpty(.Offset(, 1)) And Not IsEmpty(.Offset(, 2)) Then
          If IsDate(.Offset(, 1)) And IsDate(.Offset(, 2)) Then
            D3 = .Offset(, 1): D4 = .Offset(, 2)
            If D3 >= D1 And D4 <= D2 Then
              If cbNom = "" Or (cbNom <> "" And cbNom = .Value) Then
                chn = chn & D3 & "   " & D4 & "   " & .Value & vbLf
                n = n + 1
              End If
            End If
          End If
        End If
      End With
    Next lig
    lbResult = chn: lbNb = n
  End With
End Sub

Private Sub Date1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
  If KeyAscii = 27 Then Unload Me
End Sub

Private Sub Date2_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
  If KeyAscii = 27 Then Unload Me
End Sub

Private Sub cbNom_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
  If KeyAscii = 27 Then Unload Me
End Sub

Private Sub cmdClose_Click()
  Unload Me
End Sub

Private Sub UserForm_Initialize()
  Dim n&
  n = Feuil4.Cells(Rows.Count, 1).End(3).Row: If n = 1 Then Exit Sub
  cbNom.RowSource = "Feuil4!A2:A" & n
End Sub

soan
 

Pièces jointes

  • Classeur2 (1) (2).xlsm
    32.1 KB · Affichages: 3

soan

XLDnaute Barbatruc
Inactif
Bonjour Gilles,

est-il possible d'échanger 1 vs 1 ?
Je comprends pas tout du code.

pour tes questions en MP, je préfère te répondre ici car ça n'a rien de confidentiel, l'aide en privé est interdite par la Charte du site XLD, et mes réponses seront utiles pour d'autres lecteurs qui n'auraient pas bien compris eux non plus. :)



Pourquoi D3 & D4 ? 🤔

* D1 et D2 sont les 2 dates début et fin saisies dans le formulaire UserForm1
* D3 et D4 sont les 2 dates début et fin de la feuille de calcul (colonnes B et C)



  • comprends pas ☹️
Private Sub Date1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If KeyAscii = 27 Then Unload Me
End Sub

à l'ouverture de UserForm1, le 1er champ qui est sélectionné est Date1 ; le code ci-dessus permet de sortir aussitôt du formulaire si tu appuies sur la touche Echap quand tu es sur le champ Date1 ; ainsi, si tu as fait Ctrl e par erreur, ou si tu te ravises et que tu n'as plus envie de faire une recherche, tu peux quitter le formulaire plus facilement et plus simplement avec un appui sur Echap plutôt que de cliquer avec la souris soit en bas sur le bouton « fermer », soit en haut à droite sur la croix de fermeture du UserForm ; 27 est le code Ascii de la touche Echap ; Unload Me : décharge le formulaire de la mémoire RAM ➯ ça ferme le formulaire en libérant de l'espace mémoire ➯ ça quitte le formulaire ; voici un complément de réponse, même si tu n'as rien demandé pour la sub Date2_KeyPress() :​

VB:
Private Sub Date2_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
  If KeyAscii = 27 Then Unload Me
End Sub

ici, c'est la même chose pour le champ Date2 ; car même si Date2 n'est pas le 1er champ qui a le focus à l'ouverture de UserForm1, ça te permet de quitter le formulaire si tu te ravises alors que tu es passé au champ Date2 (par un clic sur ce champ ou par un appui sur la touche TAB).​



  • si je souhaite changer de feuil pour récupérer les noms, on est d'accord que je dois modifier Feuil4 &
    cbNom.RowSource = "Feuil4!A2:A" & n par la nouvelle feuil et colonne.

exact, c'est bien la propriété .RowSource qui est concernée. 🙂



VB:
Private Sub UserForm_Initialize()
  Dim n&
  n = Feuil4.Cells(Rows.Count, 1).End(3).Row: If n = 1 Then Exit Sub
  cbNom.RowSource = "Feuil4!A2:A" & n
End Sub

gilles37 à dit:
Pb, en le faisant, et en vérifiant par débogage pas à pas cbNom.RowSource = "Feuil4!A2:A" & n indique feuil1

* pour cbNom.RowSource = "Feuil4!A2:A" & n : la feuille utilisée est celle qui a pour Nom "Feuil4" ; c'est le .Name de la feuille.

* pour n = Feuil4.Cells(Rows.Count, 1).End(3).Row : la feuille utilisée est celle qui a pour CodeName "Feuil4" ; c'est donc le nom de code de la feuille.

fais Alt F11 ➯ fenêtre "Microsoft Visual Basic pour Applications" ; côté gauche, en haut, il y a l'Explorateur de projets : "Projet - VBAProject" ; juste au dessus de ThisWorkbook, il y a les feuilles du classeur ; exemple : Feuil1 (Feuil1) ; le 1er Feuil1 est le nom de code de la feuille (si l'utilisateur change le nom de la feuille : le nom de l'onglet sera différent ; et si le programmeur vba utilise le nom de code de la feuille, ça sera toujours cette même feuille, même si elle a été renommée par l'utilisateur) ; le 2ème Feuil1 (entre parenthèses) est le nom de la feuille.

tu as peut-être Feuil4 (Feuil1) ? donc Feuil4 est le .CodeName de la feuille, et Feuil1 est le .Name de la feuille ; sans ton classeur, pas évident de voir ce qui cloche ! d'un autre côté, si ça fait uniquement une petite bizarrerie en mode débogage mais qu'à l'exécution du code VBA c'est quand même Feuil4 qui est utilisé, quelque soit son .Name alors c'est OK ! 😃 par contre, si ça écrit sur Feuil1 au lieu de Feuil4, c'est plus embêtant ! 😁 😄 🤣

soan
 

Discussions similaires

Statistiques des forums

Discussions
312 165
Messages
2 085 883
Membres
103 014
dernier inscrit
moimoi31