Redaction d'une formule Excel en VBA
bonjour à tous,
Je dois écrire la formule NB.vide(plage) en vba j'ai trouver
ActiveCell.FormulaR1C1 = "=COUNTBLANK(plage)"
mais mon problème est de définir la plage.
En effet mon nombre de colonne varie lorsque ma macro doit écrire ma formule.
j'avais eu l'idée d'écrire ceci
ActiveCell.FormulaR1C1 = "=COUNTBLANK(cells(2,ColDeb):cells(2,i))"
coldeb et i sont les comptes qui me permetent de définir la première colonne et la dernière colonne.
Du coup ma formule renvoie rien puisque coldeb et i sont inconnues dans la feuille de calcule, jusque là rien d'anormal, Mais comment écrire en dure dans une formule avec des variables ?
Je joins un exemple (module 2) la formule dois s'écrire sur l'onglet Calendrier ligne par ligne entre la ligne 2 et la ligne 367
Je reste à votre disposition pour toutes questions complémentaires
Merci d'avance pour vos idées,
Bonsoir,
quand vous écrivez :
ActiveCell.FormulaR1C1 ="=COUNTBLANK(cells(2,ColDeb):cells(2,i))"
la partie surlignée est du VBA qui demande d'écrire la "variable" dans la cellule, ici la variable est le texte d'une formule.
Hors ColDeb, Cells et i sont des variables VBA, il faut donc revenir sous VBA pour s'en servir , pour cela il faut sortir de la variable avec : " &
et y retourner si nécessaire avec : & ", ce qui donne :
ActiveCell.FormulaR1C1 = "=COUNTBLANK(" & cells(2,ColDeb) & ":" & cells(2,i) & ")"
Ca c'est vite fait, car ça ne marchera pas, mais le principe est celui-ci.
Pas le temps d'en dire plus... Désolé, le devoir m'appelle....
@ bientôt
LouReeD
Bonsoir loureed
Ok merci je garde le principe en tête je test ça quand même dans la soirée, mais du coup qu'elle est la bonne solution ?
Bonjour LouReed,
Bon effectivement ca ne marche pas, comme tu l'avais prédit, j'ai testé d'autres solutions en gardant le même principe mais je n'arrive pas à écrire cette formule en imbriquant mes variables vba.
Si vous avez d'autre idées je suis preneur,
Merci,
bonsoir à tous,
j'ai trouver un début de réponses
With WsCal ' mon onglet
ColDeb = 4 'Colonne correspondant au premier agent
ColFin = .Cells(1, Columns.Count).End(xlToLeft).Column 'Colonne correspondant au dernier agent ici 17
LigDeb = 2 'Première ligne
i = ColFin + 2
.Cells(LigDeb, i).Formula = "=COUNTBLANK(R[" & LigDeb & "]C[" & ColDeb & "] :R[" & LigDeb & "]C[" & ColFin & "])" La formule prend bien en compte les variables par contre j'ai un problème pour définir mon origine au lieu de compter dans mon tableau il compte à partir de la cellule selectionner pour écrire la formule. c'est à dire ici j'attend que le compte se fasse entre D2 et Q2 et voici la formule inscrite par vb
=NB.VIDE(W4:AJ4)il faudrait que je resoustrais mes variables ? ou y a t il une autre solution ??
Bonsoir,
"C'est en forgeant qu'on devient forgeron,
C'est en sciant que Léonard De Vinci"...
Et pour vous cela avance vite !
En effet, il vous faut une cellule de référence et à partir de son adresse avec les valeur de R et C vous "décalez" la plage.
En fait la formule vous l'inscrivez dans quelle cellule ?
Vous prenez cette cellule en référence et vous regardez de combien de colonne et de ligne il faut pour se retrouver sur la première cellule de la plage et à l'identique pour aller sur la dernière cellule de la plage.
Ou alors il faut définir la plage en "dynamique" directement sous la feuille Excel en lui donnant un nom, et utiliser ce nom dans la formule VBA.
Mais je vous avoue ne pas avoir bien compris votre fichier, il faudrait le remettre en téléchargement mais avec des cellule en couleurs pour "montrer" les plages, savoir où la formule va être copiée, et s'il y a plusieurs plage etc...
@ bientôt
LouReeD
Bonsoir LouReed,
Franchement les coups de marteau je devrais me les mettre sur la tête pour que ça rentre plus
C est mon 3me essaie en fichier excel et je galères méchamment depuis le mois d octobre.
A la base le fichier est un générateur pour une gestion rapide du planning du personnel.
J avoue que tous est très hétérogènes dans ma mise en place du code qui un agglomerat de code trouvé sur le net ou pris en charge par les membres du forum,sans oublier ma touche personnelle...
Bref je passe pas mal de temps à homogénéiser tout ça pour le rendre un peu plus cohérent.
Je test en gardant ma cellule de référence. Je générerait un nouveau fichier si je bloque encore. Mais je crois que t'es explications vont me permette de finaliser cette étape
Un grand merci pour les pistes et les explications.
Peut être à plus
Merci LouReed, j'ai finalement réussi j'ai garder le même principe pour une somme un peu plus bas dans mon tableau
le code donne donc
Dim ColDeb As Integer, ColFin As Integer
Dim LigDeb As Long, LigFin As Long
Dim i, j, k As String
With WsCal
ColDeb = 4 'Colonne correspondant au premier agent
ColFin = .Cells(1, Columns.Count).End(xlToLeft).Column 'Colonne correspondant au dernier agent
LigDeb = 2 'Première ligne
LigFin = 367
i = ColFin + 2
j = i - ColDeb
.Cells(LigDeb, i).Formula = "=COUNTBLANK(RC[-" & j & "] :RC[-2])"
.Cells(LigDeb, i).AutoFill Destination:=.Range(.Cells(LigDeb, i), .Cells(LigFin, i)), Type:=xlFillDefault
If .Cells(367, 1) = " " Then
.Cells(LigFin, i) = ""
End If
ColDeb = 4 'Colonne correspondant au premier agent
ColFin = .Cells(1, Columns.Count).End(xlToLeft).Column 'Colonne correspondant au dernier agent
LigDeb = 370 'Première ligne
LigFin = 377 'Dernière ligne
i = ColFin + 2
j = i - ColDeb
.Cells(LigDeb, i).Formula = "=SUM(RC[-" & j & "] :RC[-2])"
.Cells(LigDeb, i).AutoFill _
Destination:=.Range(.Cells(LigDeb, i), .Cells(LigFin, i)), Type:=xlFillDefault
End With
End SubIl y a surement moyen de rendre ça plus lisible, mais ça correspond exactement à mon besoin, Je vinci ,Je valide
Bonsoir,
vous me voyez ravis que mes orientations vous ont conduites vers une solution !
Il est vrai que ce n'est peut-être pas la meilleur, mais bon vous avez le mérite de l'avoir trouvé seul.
Si je comprenais mieux votre feuille, alors peut-être aurais je pu vous aider mieux ...
@ bientôt
LouReeD