Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[VBA] Division rapide de toute une colonne

9 réponses
Avatar
HD
Bonjour,

Je récupère toutes une série de données et dans une colonne je voudrais
effectuer une opération de division.

Il y'a bien sûr la possibilité de créer une boucle qui va parcourir les
cellules de la colonne pour en diviser la valeur MAIS je sais qu'avez
Excel il est bien plus rapide d'utiliser les fonctionnalités propres
d'Excel. Exemple, le copier/coller spécial avec division... Peut on
manipuler cette fonctionnalité mais sans pour autant passer par une
cellule comme ici avec B1 :

Range("B1").value = "1000"
Range("B1").Copy
Range("D5:D" & derniereligne).PasteSpecial Paste:=xlPasteAll,
Operation:=xlDivide

A moins qu'il y'ai une autre solution ?

Cordialement,

HD

9 réponses

Avatar
MichD
Bonjour,
Donne-nous des exemples sur le contenu des cellules de cette colonne et
la manière dont du voudrais scinder le contenu.
Quel critère veux-tu appliquer?
MichD
Avatar
MichD
Dans son message précédent, MichD a écrit :
Bonjour,
Donne-nous des exemples sur le contenu des cellules de cette colonne et la
manière dont du voudrais scinder le contenu.
Quel critère veux-tu appliquer?
MichD

Oublie ma première réponse... je n'ai pas lu la question correctement.
Voici une macro qui fait le travail. Il te faudra adapter le nom de la
feuille et l'adresse des cellules selon ton application.
Pour réussir à faire ce que tu désire, tu dois utiliser la commande
"Sendkeys". Cela signifie que tu dois appeler la macro à partir de la
feuille de calcul et non pas exécuter la macro à partir de la fenêtre
de l'éditeur de code. La séquence des caractères de la commande
Sendkeys et SendKeys "%egvm" & "~" . Cela c'est pour la version Excel
2010, c'est probablement la même pour Office 2007 à 2016 pour les
versions françaises. Si tu utilises un autre la langue, il faut
adapter!
'--------------------------------------
Sub Test()
'Tu adaptes le nom de l'onglet de la feuille
'où sont tes données
With Worksheets("Feuil1")
.Select
'Tu places 2 dans une cellule de ton choix
'Cette cellule contient le diviseur de ton opération
With .Range("H1")
.Value = 2
.Copy
End With
'Remplace J par la lettre de la colonne de ton application
With .Range("A1:A" & .Range("A65536").End(xlUp).Row)
'Le format final de date que tu veux avoir...
.PasteSpecial Paste:=xlPasteAll, Operation:=xlDivide
'Tu appliques le format de ton choix si nécesaire
.NumberFormat = "# ### ##0.00"
.Select
End With
'Séquence des commandes que tu ferais
'si tu utilisais les lettres du menu pour
'effectuer le collage special
SendKeys "%egvm" & "~"
' SendKeys "%lvgvm" & "~"
'Alt + L + V + G+V+M
DoEvents
'Efface le contenu de H1
.Range("H1") = ""
.Range("A1").Select
End With
Application.CutCopyMode = False
End Sub
'--------------------------------------
MichD
Avatar
isabelle
bonjour HD,
j'ai essayé avec la méthode clipboard.PutInClipboard
mais sans succès, vu que suite à cette manip, le contenu du clipboard est une
source de type texte unicode
alors je ne vois que la solution d'utiliser une cellule d'une feuille masquée
par exemple
isabelle
Le 2016-09-15 à 09:12, HD a écrit :
Bonjour,
Je récupère toutes une série de données et dans une colonne je voudrais
effectuer une opération de division.
Il y'a bien sûr la possibilité de créer une boucle qui va parcourir les cellules
de la colonne pour en diviser la valeur MAIS je sais qu'avez Excel il est bien
plus rapide d'utiliser les fonctionnalités propres d'Excel. Exemple, le
copier/coller spécial avec division... Peut on manipuler cette fonctionnalité
mais sans pour autant passer par une cellule comme ici avec B1 :
Range("B1").value = "1000"
Range("B1").Copy
Range("D5:D" & derniereligne).PasteSpecial Paste:=xlPasteAll, Operation:=xlDivide
A moins qu'il y'ai une autre solution ?
Cordialement,
HD
Avatar
isabelle
voici l'exemple,
Sub AddSheets_div()
'au préalable executé une seule fois cette macro "AddSheets_div"
Sheets.Add After:=Sheets(Sheets.Count)
ActiveSheet.Name = "div"
Sheets("div").Visible = xlVeryHidden
End Sub
Sub test1()
Dim derniereligne As Long
derniereligne = ActiveSheet.Cells(Rows.Count, 4).End(xlUp).Row
With Sheets("div")
.Range("A1").Value = 1000
.Range("A1").Copy
End With
ActiveSheet.Range("D5:D" & derniereligne).PasteSpecial Paste:=xlPasteAll,
Operation:=xlDivide
End Sub
isabelle
Avatar
isabelle
le code est plus clair comme ceci,
Sub test1()
Dim derniereligne As Long
derniereligne = ActiveSheet.Cells(Rows.Count, 4).End(xlUp).Row
With Sheets("div").Range("A1")
.Value = 1000
.Copy
End With
ActiveSheet.Range("D5:D" & derniereligne).PasteSpecial Paste:=xlPasteAll,
Operation:=xlDivide
End Sub
et il serait mieux de remplacer ActiveSheet par Sheets("la feuille concernée")
isabelle
Avatar
Jacquouille
Salut Isabelle et Denis,
Ne pourrait-on remplacer la cellule par une variable?
Au lieu de mettre 10 en C1, puis copier C1 pour multiplier toute la
colonneA. Ne pourrait-on mettre Var, puis multiplier toute la colA par
Var ?
Jacques, inquiet
" Le vin est au repas ce que le parfum est à la femme."
.
"isabelle" a écrit dans le message de groupe de discussion :
nrfan2$s06$
le code est plus clair comme ceci,
Sub test1()
Dim derniereligne As Long
derniereligne = ActiveSheet.Cells(Rows.Count, 4).End(xlUp).Row
With Sheets("div").Range("A1")
.Value = 1000
.Copy
End With
ActiveSheet.Range("D5:D" & derniereligne).PasteSpecial Paste:=xlPasteAll,
Operation:=xlDivide
End Sub
et il serait mieux de remplacer ActiveSheet par Sheets("la feuille
concernée")
isabelle
---
L'absence de virus dans ce courrier électronique a été vérifiée par le logiciel antivirus Avast.
https://www.avast.com/antivirus
Avatar
HD
Ne pourrait-on remplacer la cellule par une variable?
Au lieu de mettre 10 en C1, puis copier C1 pour multiplier toute la
colonneA. Ne pourrait-on mettre Var, puis multiplier toute la colA
par Var ?

ça serait l'idéal mais Isabelle a fait le test de passer une valeur dans
le presse-papier pour simuler le copier...
Du coup, j'utilise ces lignes de code :
lMax = ActiveSheet.Columns(6).Find(What:="*", _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious).Row
Sheets("Param").Range("N1").Copy
Range(Cells(2, 6), Cells(lMax, 6)).Select
Selection.PasteSpecial Paste:=xlValue, Operation:=xlDivide,
SkipBlanks:úlse, Transpose:úlse
Application.CutCopyMode = False
J'ai ma valeur de division en cellule N1 de la feuille "Param". La
colonne N est cachée. Et je colle le tout avec l'opération division sur
la plage de cellule F2 à F(jusqu'à la dernière ligne).
Merci à tous de vous être penché sur mon problème.
Cordialement,
DAH
Avatar
isabelle
Ne pourrait-on remplacer la cellule par une variable?

ça serait l'idéal mais Isabelle a fait le test de passer une valeur dans le
presse-papier pour simuler le copier...

oui c'est dommage,
voici le test,
après avoir exécuté la macro "CopyToClipboard"
retourner sur la feuille de calcul sélectionner une plage de cellules et essayer
de faire un collage spécial division
Private Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function EmptyClipboard Lib "user32" () As Long
Private Declare Function CloseClipboard Lib "user32" () As Long
'Clear Entire Clipboard Contents
Sub ClearClipboard()
OpenClipboard (0&)
EmptyClipboard
CloseClipboard
End Sub
Sub CopyToClipboard()
'References to Microsoft Forms 2.0 Object Library
'La méthode PutInClipboard remplace le contenu du Presse-papiers par celui au
format texte de DataObject.
Dim clipboard As MSForms.DataObject
Dim dv As Integer
ClearClipboard
dv = 2
Set clipboard = New MSForms.DataObject
clipboard.SetText dv
clipboard.PutInClipboard
End Sub
isabelle
Avatar
isabelle
ps/ n'oubliez pas d'ajouter la référence à Microsoft Forms 2.0 Object Library
isabelle
Le 2016-09-16 à 10:23, isabelle a écrit :
Ne pourrait-on remplacer la cellule par une variable?


ça serait l'idéal mais Isabelle a fait le test de passer une valeur dans le
presse-papier pour simuler le copier...

oui c'est dommage,
voici le test,
après avoir exécuté la macro "CopyToClipboard"
retourner sur la feuille de calcul sélectionner une plage de cellules et essayer
de faire un collage spécial division
Private Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function EmptyClipboard Lib "user32" () As Long
Private Declare Function CloseClipboard Lib "user32" () As Long
'Clear Entire Clipboard Contents
Sub ClearClipboard()
OpenClipboard (0&)
EmptyClipboard
CloseClipboard
End Sub
Sub CopyToClipboard()
'References to Microsoft Forms 2.0 Object Library
'La méthode PutInClipboard remplace le contenu du Presse-papiers par celui au
format texte de DataObject.
Dim clipboard As MSForms.DataObject
Dim dv As Integer
ClearClipboard
dv = 2
Set clipboard = New MSForms.DataObject
clipboard.SetText dv
clipboard.PutInClipboard
End Sub
isabelle