Déclarer colonne en VBA
Bonjour
Je crée une macro pour faire un calcul simple sur une colonne. Jusque là, pas de problème. En revanche, en fonction du fichier excel, cette colonne est différente. Je voudrais donc pouvoir déclarer une colonne au lancement de la macro, et je sèche.
Merci par avance pour votre aide
Bonjour,
Quelque chose comme:
sub test()
col = inputbox("Saisir le numéro de colonne.")
end sub
après tu peux utiliser ce numéro partout dans ta macro
Sinon si le nom de la colonne est toujours le même...
sub test()
col = range("1:1").find("mavaleur",lookat:=xlwhole).column
end sub
Merci AUSECOUR pour la rapidité de la réponse. Le problème est que je ne sais pas où mettre cette commande. Donc voici la macro d'origine. Dans ce cas, le calcul se fait toujours sur la colonne D, alors que je veux choisir cette colonne...
Merci encore
ActiveWindow.LargeScroll ToRight:=1
ActiveWindow.ScrollColumn = 23
ActiveWindow.SmallScroll ToRight:=90
Range("ERO1").Select
ActiveCell.FormulaR1C1 = "100"
Range("ERO1").Select
Selection.Copy
Columns("D:D").Select
Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlDivide, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
Selection.NumberFormat = "0.0%"
Range("D1").Select
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlToRight)).Select
Range("ERO1").Select
Selection.ClearContents
End Sub
Re,
je viens de voir ton bout de programme, et voilà ce que j'en garde
col = InputBox("Saisir la colonne en texte.")
With Range(col & 1).EntireColumn
.Value = "100"
.NumberFormat = "0.0%"
End With
Comme tu l'avais fait avec l'enregistreur de macro, il était largement optimisable, d'ailleurs je ne comprends pas bien pourquoi tu dois mettre 100 dans absolument chaque cellule de la colonne D
Je crains que cela ne soit pas suffisant (à moins que je me trompe). En fait, je veux transformer des valeurs absolues d'une colonne en % (40 = 40%). Si j'applique un simple pourcentage, j'aurai 4000% donc, j'utilise le collage-special-opération. En ERO1, je mets mon coeff multiplicateur, soit 100 (pourquoi ERO1 ? pour qu'il soit dans une cellule dont je suis certain qu'elle sera vide). Je copie ce 100, et le colle-spécial-division sur la colonne de mon choix. Et c'est colonne que je veux choisir. Dans ta solution, il me semble que j'aurais 100 systématiquement.
Re,
Ah ok je n'avais pas compris que tu faisais ce type de collage spécial
Si tu veux convertir tes données colonne D, je peux te proposer une solution qui fera le travail
Par contre, tu dois vraiment faire ça en masse? j'ai l'impression qu'il ne s'agit pas d'une tâche nécessitant de passer par une automatisation...
Désolé du double post, je te propose cette solution qui convertit tous les nombres de la plage sélectionnée en pourcentage:
Sub conversion()
Dim plage As Range
Set plage = Application.InputBox("sélectionner la plage de cellules à traiter", Type:=8)
tableau = plage
For i = LBound(tableau, 1) To UBound(tableau, 1)
For j = LBound(tableau, 2) To UBound(tableau, 2)
If IsNumeric(tableau(i, j)) Then
tableau(i, j) = tableau(i, j) / 100
End If
Next j
Next i
plage = tableau
plage.NumberFormat = "0.0%"
End Sub
Parfait ! La dernière macro fonction. Me reste plus qu'à comprendre.
Merci beaucoup en tout cas
Bonne journée
Re,
super!
si jamais tu as besoin d'explications, n'hésite pas à repasser par ce sujet, je continue à le suivre
Rebonjour
Comme j'ai plutôt l'habitude d'utiliser les macros en tant qu'enregistreur de tâches, je reconnais que ta solution, si elle fonctionne parfaitement, me laisse aussi perdu qu'une poule devant une fourchette. Comme j'aime être un peu moins bête au coucher qu'au lever, une petite explication serait top...
Merci encore
Pierre
Re,
ça marche, c'est parti pour quelques explications alors:
Set plage = Application.InputBox("sélectionner la plage de cellules à traiter", Type:=8)
tu as plusieurs types de variables en langage de programmation, le texte, les nombres (qui eux même ont plusieurs types de variables), et les objets, pour initialiser un objet ou lui affecter une "valeur", on utilise le mot clé "Set", ensuite j'utilise une fonction qui existe dans l'application Excel, qui s'appelle InputBox ( Application.InputBox). Une Inputbox permet d'échanger avec l'utilisateur par le biais d'une fenêtre de saisie, j'ai ici paramétré le texte affiché par la fenêtre de saisie, et ajouté le type de valeur retourné, ici 8 correspond à une plage de cellules (objet Range). J'ai précisé Type:= pour ne pas avoir à préciser d'autres paramètres qui se trouvaient entre le texte affiché par la fenêtre de saisie, et le type de valeur retournée par la fenêtre. Tu verras souvent cette façon de faire avec l'enregistreur de macro notamment
tableau = plage
ici je crée un tableau sur VBA (le langage de programmation des macros), je le crées d'une façon assez simple qui est : "mon tableau contient les valeurs de la plage de cellules qui se nomme plage", utiliser un tableau VBA pour parcourir les valeurs des cellules, plutôt que de passer directement par les cellules, permet de faire cette tâche plus rapidement.
For i = LBound(tableau, 1) To UBound(tableau, 1)
For j = LBound(tableau, 2) To UBound(tableau, 2)
Next j
Next i
Ici je fais deux boucles (qui font les actions entre for et next, puis reviennent à For un certain nombre de fois), une qui permet de parcourir toutes les lignes du tableau, et une autre qui permet de parcourir toutes les colonnes, j'utilise LBound et UBound pour savoir par quel numéro de ligne et de colonne commence et termine mon tableau, c'est très pratique pour travailler avec un tableau qui ne fait jamais la même taille comme ici.
If IsNumeric(tableau(i, j)) Then
End If
J'utilise une condition If Then End If pour vérifier avec une fonction IsNumeric, si la valeur dans le tableau est un nombre (pour ne pas traiter du texte), si c'est le cas, on passe à ce qui est entre Then et End If, c'est à dire:
tableau(i, j) = tableau(i, j) / 100
Ici on change la valeur du tableau, ligne i, colonne j, par sa valeur divisée par 100.
plage = tableau
tout à l'heure on a fait tableai = plage, maintenant c'est le tableau qui vient sur la plage et exporte donc ses valeurs sur les cellules.
plage.NumberFormat = "0.0%"
et pour finir, on passe les cellules au format 0.0%
Voilà