A voir également:
- [VBA] définition plage de données
- Fuite données maif - Guide
- Supprimer les données de navigation - Guide
- Trier des données excel - Guide
- Image de manchots sur une image de plage ✓ - Forum Graphisme
- Barre de données excel pourcentage 100 ✓ - Forum Excel
15 réponses
Re,
et tu veux à tout prix une fonction, personnalisée ?
Sinon tu écris le nom de ton classeur entre [ ] en A1, et en A2 :
=SOMME.SI(INDIRECT(A1&"Feuil1!$A:$A");"=2";INDIRECT(A1&"Feuil1!$B:$B"))
et tu veux à tout prix une fonction, personnalisée ?
Sinon tu écris le nom de ton classeur entre [ ] en A1, et en A2 :
=SOMME.SI(INDIRECT(A1&"Feuil1!$A:$A");"=2";INDIRECT(A1&"Feuil1!$B:$B"))
Chem & Fich n'est pas une variable de type classeur. Il faut mettre Set Wb = Workbooks(Chem & Fich ) au lieu de Set Wb = Chem & Fich
D'autre part la propriété Columns(Col1 & " : " & Col1) n'existe pas , la bonne propriété est Columns( " Col1"); il faut la remplacer par la propriété Range . Ceci devrait être mieux :
Set Pla1 = Wb.Worksheets(Ong).Range(Col1 & " : " & Col1)
Set Pla2 = Wb.Worksheets(Ong).Range(Col2 & " : " & Col2)
D'autre part la propriété Columns(Col1 & " : " & Col1) n'existe pas , la bonne propriété est Columns( " Col1"); il faut la remplacer par la propriété Range . Ceci devrait être mieux :
Set Pla1 = Wb.Worksheets(Ong).Range(Col1 & " : " & Col1)
Set Pla2 = Wb.Worksheets(Ong).Range(Col2 & " : " & Col2)
Il y a des espaces en trop
Set Pla1 = Wb.Worksheets(Ong).Range(Col1 & ":" & Col1)
Set Pla2 = Wb.Worksheets(Ong).Range(Col2 & ":" & Col2)
Set Pla1 = Wb.Worksheets(Ong).Range(Col1 & ":" & Col1)
Set Pla2 = Wb.Worksheets(Ong).Range(Col2 & ":" & Col2)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionFunction MaSommeSi(Col1 As String, Code As String, Col2 As String) As Integer Dim Pla1, Pla2 As Range Dim Chem, Fich, Ong As String Dim Wb As Workbook On Error GoTo erreur_fonction Chem = Range("Chemin").Cells & "\" Fich = Range("fichier").Cells Ong = Range("onglet").Cells ' recherche du fichier si chargé en mémoire For Each Wb In Workbooks If Wb.Name = Fich Then Exit For Next Wb ' ----------------------------------------- ' si fichier non chargé en mémoire, on procède à son ouverture ------ If Wb Is Nothing Then Set wb_save = ActiveWorkbook 'sauvegarde du classeur activé Workbooks.Open (Chem & Fich) Set Wb = ActiveWorkbook wb_save.Activate 'réactivation du classeur sauvegardé End If ' ------------------------------------------------------------------------------- Set Pla1 = Wb.Worksheets(Ong).Columns(Col1 & ":" & Col1) Set Pla2 = Wb.Worksheets(Ong).Columns(Col2 & ":" & Col2) MaSommeSi = Application.WorksheetFunction.SumIf(Pla1, Code, Pla2) Exit Function erreur_fonction: MsgBox Err.Description End Function
si par exemple col1 = colonne A, col2 = colonne B, code = 1, il faut entrer =MaSommeSi("A";1;"B") par ailleurs, il faut charger le fichier en mémoire car l'ouverture du fichier ne se fait pas en mode fonction. Donc modifier le code ainsi Function MaSommeSi(Col1 As String, Code As String, Col2 As String) As Integer Dim Pla1, Pla2 As Range Dim Chem, Fich, Ong As String Dim Wb As Workbook On Error GoTo erreur_fonction Chem = Range("Chemin").Cells & "\" Fich = Range("fichier").Cells Ong = Range("onglet").Cells ' recherche du fichier si chargé en mémoire For Each Wb In Workbooks If Wb.Name = Fich Then Exit For Next Wb If Wb Is Nothing Then MsgBox "erreur : classeur " & Fich & " non chargé" Exit Function End If Set Pla1 = Wb.Worksheets(Ong).Columns(Col1) Set Pla2 = Wb.Worksheets(Ong).Columns(Col2) MaSommeSi = Application.WorksheetFunction.SumIf(Pla1, Code, Pla2) Exit Function erreur_fonction: MsgBox Err.Description End Function
ca fonctionne!!!! :)
Je ne mettais pas les guillemets dans la formule...
=MaSommeSi(A;1;B)
au lieu de =MaSommeSi("A";1;"B")
Merci beaucoup pour la réactivité dans les réponses.
Je ne mettais pas les guillemets dans la formule...
=MaSommeSi(A;1;B)
au lieu de =MaSommeSi("A";1;"B")
Merci beaucoup pour la réactivité dans les réponses.
par contre...
si je change des valeurs, la somme ne se met pas à jour automatiquement comme une autre formule excel de base.
Est ce normal?
si je change des valeurs, la somme ne se met pas à jour automatiquement comme une autre formule excel de base.
Est ce normal?
pour tenir compte de l'apport d'Eriic, le code doit donc être modifié ainsi : Function MaSommeSi(Col1 As String, Code As String, Col2 As String) As Integer Application.Volatile Dim Pla1, Pla2 As Range Dim Fich, Ong Dim Wb As Workbook Dim nom As Name On Error GoTo erreur_fonction For Each nom In ActiveWorkbook.Names If nom.Name = "fichier" Then Fich = Range("fichier").Cells If nom.Name = "onglet" Then Ong = Range("onglet").Cells Next nom If IsEmpty(Fich) Then Fich = ActiveWorkbook.Name If IsEmpty(Ong) Then Ong = ActiveSheet.Name ' recherche du fichier si chargé en mémoire For Each Wb In Workbooks If Wb.Name = Fich Then Exit For Next Wb If Wb Is Nothing Then MsgBox "erreur : classeur " & Fich & " non chargé" Exit Function End If Set Pla1 = Wb.Worksheets(Ong).Columns(Col1) Set Pla2 = Wb.Worksheets(Ong).Columns(Col2) MaSommeSi = Application.WorksheetFunction.SumIf(Pla1, Code, Pla2) Exit Function erreur_fonction: MsgBox Err.Description End Function
Re,
Ou bien passer col1 et col2 en plage1 as range et plage2 as range.
Ca présente en plus l'avantage de pouvoir désigner les colonnes à la souris.
eric
Ou bien passer col1 et col2 en plage1 as range et plage2 as range.
Ca présente en plus l'avantage de pouvoir désigner les colonnes à la souris.
eric