Aide sur l'utilisation de fonctions / coordonnées de cellules en VBA
Bonjour à toutes et tous,
je débute totalement en VBA pour excel et je bricole assez bien... mais là je sèche sur un souci :
derniereligne = Range("A" & Rows.Count).End(xlUp).Row
For j = 2 To derniereligne
If Range("B" & j).Value <> "" Then
Range("A" & j).Value = ActiveSheet.Name
coord = D&:&CStr(j)
ActiveSheet.Cells(j, 4).FormulaLocal = "=ARRONDI.AU.MULTIPLE(coord;5)"
End If
Next jEn gros, après avoir rempli toutes les cellules de la colonne A (correspondant à une ligne de données non vide) avec le nom de l'onglet,
je voudrais remplir une colonne (la D) avec un arrondi au multiple de la case de la même ligne sur la colonne C.
En plus clair, que la cellule D:j ait pour valeur l'arrondi de la C:j.
J'ai cru qu'il me fallait passer par une chaine de caractères et j'ai donc créé la variable coord pour faire ça, mais ça ne marche pas...
Bref,
je suis un peu paumé,
si ça n'est pas clair,
dites moi
Merci d'avance,
Adrien
re,
pour un débutant, c'est plus facile d'utiliser l'enregistreur des macros et de modifier le résultat qu'on y voit. Pour cela, vous ajoutez une formule dans la colonne A, par exemple, j'ai mis une bonne formule dans la cellule A4. Je démarre l'enregistreur, je sélectionne la cellule A4, je fais "F2" et je fais "Enter" et j'arrête l'enregistreur. Le résultat dans l'enregistreur sera quelque chose comme ceci ...
sub Macro1()
' Macro1 Macro
'
'
Range("A4").Select
ActiveCell.FormulaR1C1 = "=IF(RC[1]<>"""",MROUND(RC[3],5),""-"")"
Range("A5").Select
End SubMaintenant je suppose que vous voulez la formule dans la colonne A et vous copiez/collez la partie après "ActiveCell.FormulaR1C1 =" après "Cells(j, "A").FormulaR1C1 =, donc ici c'est "=IF(RC[1]<>"""",MROUND(RC[3],5),""-"")"
vers
Sub MaMacro()
Dim DerniereLigne: DerniereLigne = Range("A" & Rows.Count).End(xlUp).Row
For j = 2 To DerniereLigne
If Range("B" & j).Value <> "" Then
Cells(j, "A").FormulaR1C1 = "=IF(RC[1]<>"""",MROUND(RC[3],5),""-"")"
End If
Next j
End SubSi cela ne fonctionne pas, téléchargez votre fichier avec des données anonymisées.
C'est étrange que vous voulez ajouter une formule pour certaines lignes et ne pas pour toutes.
Super. Merci Bart,
je pense que mon exposé n'était pas très clair mais en retravaillant un peu j'ai eu ce que je voulais :
derniereligne = Range("A" & Rows.Count).End(xlUp).Row
For j = 2 To derniereligne
If Range("B" & j).Value <> "" Then
Range("A" & j).Value = ActiveSheet.Name
Cells(j, "D").FormulaR1C1 = "=(MROUND(RC[-1],50))/10"
End If
Next jcette partie de ma macro
- remplit la colonne A des lignes où la colonne B n'est pas vide avec le nom de mon onglet
- remplit la colonne D de ces mêmes lignes avec un arrondi (un peu amélioré) de la colonne précédente (la C)
Ça fonctionne.
Alors Grand Merci !
Je n'utilise pas beaucoup l'enregistreur parce que j'ai fait pas mal de C++ il y a longtemps et j'ai plaisir à me travailler le crâne sur le code (jusqu'à ce que j'appelle au secours). Mais c'est vrai que je devrais y avoir recours plus souvent, ça aide sérieusement à démêler les choses.
Bonne journée,
Adrien
Bonjour le fil
@Adrien_63, si vous êtes débutant en VBA, ce que ne vous à pas dit BsAlv,
c'est que vous devez définir vos variables et indiquer sur quelle feuille vous travaillez
Perso, j'utilise toujours "FormulaLocal" plus facile à lire quand on travaille sur un Excel FR
Sub Test()
Dim Ws As Worksheet ' Variable objet
Dim DerniereLigne As Long
Dim J As Long
' Définir la feuille sur laquelle on travaille
Set Ws = ThisWorkbook.Sheets("Feuil1")
'
DerniereLigne = Ws.Range("A" & Rows.Count).End(xlUp).Row
For J = 2 To DerniereLigne
If Ws.Range("B" & J).Value <> "" Then
Ws.Range("A" & J).Value = ActiveSheet.Name
Ws.Range("D" & J).FormulaLocal = "=ARRONDI.AU.MULTIPLE(C" & J & ";5)"
End If
Next J
End SubBonne journée
Bonjour le fil,
Moi l'irais encore plus loin...
Set Ws = ThisWorkbook.Sheets("Feuil1")
Ça c'est le meilleur moyen de se prendre un coup de pied par le compilateur si le nom de la feuille n'est pas trouvé.
Il vaut toujours mieux utiliser une fonction qui renvoie soit la feuille soit Nothing. Vous avez tout loisir de faire un test avant la levée d'erreur
Exemple de fonction :
'@Description "Returns a Sheet or Worksheet object if found, or Nothing otherwise."
Public Function GetSheetByName(ByVal SheetName As String, _
Optional ByVal Workbook As Excel.Workbook _
) As Object
Dim localWorkbook As Workbook
Set localWorkbook = Workbook
If localWorkbook Is Nothing Then Set localWorkbook = ThisWorkbook
With localWorkbook
Dim Index As Long
Do
Index = Index + 1
If StrComp(.Sheets(Index).Name, SheetName, vbTextCompare) = 0 Then
Set GetSheetByName = .Sheets(Index)
End If
Loop While Index < .Sheets.Count And GetSheetByName Is Nothing
End With
End FunctionVoilà cela fait il ne reste plus qu'a tester si la variable est à Nothing ou pas :
Public Sub Test101()
Const sheetName As String = "Ma feuille"
Dim workingSheet As Excel.Worksheet
Set workingSheet = GetSheetByName(sheetName)
If Not workingSheet Is Nothing Then
'...
'...
Else
MsgBox Replace("Impossible de trouver la feuille {feuille}. Peut-être l'avez-vous supprimée ou renommée !", _
"{feuille}", _
sheetName) _
, vbOKOnly, "Gestion des feuilles."
End If
End SubMaintenant attention, il faut toujours savoir de qui, quoi l'on parle.
Si d'un coté l'on définie Ws, puis que l'on utilise ActiveSheet on risque de se retrouver avec des résultats inattendus. (ActiveSheet peut être n'importe quelle feuille) exemple :
If Ws.Range("B" & J).Value <> "" Then
Ws.Range("A" & J).Value = ActiveSheet.Name
Ws.Range("D" & J).FormulaLocal = "=ARRONDI.AU.MULTIPLE(C" & J & ";5)"
End If