[Résolu][Calc] Copier-coller les résultats de formules

Discussions et questions sur tout ce qui concerne la programmation tous langages et tous modules confondus.

Modérateur : Vilains modOOs

Règles du forum
:alerte: Balisage obligatoire dans cette section !
Aidez-nous à vous aider au mieux en balisant correctement votre question : reportez-vous sur les règles de cette section avant de poster !
bgault
Membre lOOyal
Membre lOOyal
Messages : 25
Inscription : 23 juin 2008 07:05
Localisation : Segré

[Résolu][Calc] Copier-coller les résultats de formules

Message par bgault »

Bonjour

Je travaille avec OpenOffice

j'ai créé des feuilles de calculs, numérotées 1, 2, . . . , sur lesquelles j'ai une formule de calcul à partir des données.
Je veux récupérer, à l'aide d'une macro tous les résultats de calculs, pas les formules sur une feuille bilan.
J'ai essayé le code suivant :

Code : Tout sélectionner

Sub colle_sur_bilan
Dim oDoc As Object 
Dim total As Integer 
Dim i As Integer 
Dim j As Integer 
Dim k As Integer
oDoc=ThisComponent 
total = oDoc.Sheets.Count
k=total-1

Dim Doc As Object
Dim Sheet As Object
Dim CellRangeAddress As New com.sun.star.table.CellRangeAddress
Dim CellAddress As New com.sun.star.table.CellAddress
 
Dim UneZone As Object
Dim CoordZone As Object
Dim LigneCourante As Integer, FeuilledeZone As Integer
Dim PremiereColonneZone As Integer, DerniereColonneZone As Integer
Dim PremiereLigneZone As Integer, DerniereLigneZone As Integer


Doc = StarDesktop.CurrentComponent
UneZone = Doc.CurrentSelection

CoordZone = UneZone.RangeAddress
FeuilledeZone = CoordZone.Sheet
PremiereColonneZone = CoordZone.StartColumn
DerniereColonneZone = CoordZone.EndColumn
PremiereLigneZone = CoordZone.StartRow
DerniereLigneZone = CoordZone.EndRow

For i=3 to k
Sheet = Doc.Sheets(i)
CellRangeAddress.Sheet = FeuilledeZone
CellRangeAddress.StartColumn = PremiereColonneZone
CellRangeAddress.StartRow = PremiereLigneZone
CellRangeAddress.EndColumn = DerniereColonneZone
CellRangeAddress.EndRow = DerniereLigneZone

j = i + 30
CellAddress.Sheet = 2
CellAddress.Column = j
CellAddress.Row = 1
 
Sheet.copyRange(CellAddress, CellRangeAddress)
next
end [/contents/446-fichier-sub sub] 
Le problème est que cette macro colle les formules s'il y en a et donc que les valeurs affichées dans la dernière cellule sont fausses.

Question 1 : Que faire pour que la commande Sheet.copyRange copie les valeurs à la place des formules, comme le fait la commande collage spécial ?

J'ai donc créé une macro qui, pour une feuille donnée, colle le résultat de la formule, dans une nouvelle cellule.
Cela me permet ainsi de récupérer la valeur avec la macro précédente :

Code : Tout sélectionner

sub copie_nombres
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"
args1(0).Value = "$G$33:$Z$33"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())

rem ----------------------------------------------------------------------
dim args3(0) as new com.sun.star.beans.PropertyValue
args3(0).Name = "ToPoint"
args3(0).Value = "$G$34"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args3())

rem ----------------------------------------------------------------------
dim args4(5) as new com.sun.star.beans.PropertyValue
args4(0).Name = "Flags"
args4(0).Value = "VT"
args4(1).Name = "FormulaCommand"
args4(1).Value = 0
args4(2).Name = "SkipEmptyCells"
args4(2).Value = false
args4(3).Name = "Transpose"
args4(3).Value = false
args4(4).Name = "AsLink"
args4(4).Value = false
args4(5).Name = "MoveMode"
args4(5).Value = 4

dispatcher.executeDispatch(document, ".uno:InsertContents", "", 0, args4())
end sub
Le problème c'est que je n'arrive pas à créer la macro qui me permet de faire cette manipulation automatiquement sur toutes les feuilles.
J'ai tenté la macro suivante :

Code : Tout sélectionner

sub copie_nombres_tout
Dim oDoc As Object 
Dim i As Integer 
Dim j As Integer 
Dim k As Integer 
  
oDoc=ThisComponent 
  
k = oDoc.Sheets.Count
j=i-1
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

For i=3 to k
rem ----------------------------------------------------------------------
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "Nr"
args1(0).Value = 3

dispatcher.executeDispatch(document, ".uno:JumpToTable", "", 0, args1())

copie_nombres
next

end sub
mais j'ai une erreur et je ne comprends pas pourquoi ce qui marche sur la feuille courante sélectionnée ne peut pas se répéter en allant automatiquement sur les autres feuilles ?

Question 2 : qui peut me donner une solution car cela fait une bonne semaine que je cherche désspérément.

A tout hasard, je joint le projet sur lequel je travaille.

merci d'avance
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Dernière modification par micmac le 14 juin 2015 13:00, modifié 3 fois.
Raison : [Résolu] remplace [Resolu]+ la coche verte
openoffice 4.1.1 sous Windows 7
Avatar de l’utilisateur
micmac
RespOOnsable forum
RespOOnsable forum
Messages : 9252
Inscription : 28 août 2010 08:45

Re: [Calc] Copier-coller les résultats de formules

Message par micmac »

Bonjour,

Cette section a des règles très précises que vous devez obligatoirement suivre pour obtenir de l'aide. C'est indiqué dans le cadre rouge en haut de la page.

Il est demandé aux auteurs de faire précéder le titre de leur question d'une balise adéquate. Ce balisage est extrêmement important car il permet d'avoir une base de connaissance optimum en cas de recherche.
Avez-vous remarqué comment étaient postées les autres questions ?

Lisez ce fil pour savoir quelle balise utiliser : https://forum.openoffice.org/fr/forum/s ... html#27295

N'oubliez pas que le terme "Macro" ou "OpenOffice" ne doivent pas être employés car il sont implicites. Essayez de synthétiser au mieux ce que vous cherchez à faire.

Un titre accrocheur vous permettra d'une part d'être aidé plus rapidement et d'autre part, d'enrichir notre base de connaissances.

Nous l'avons fait pour vous cette fois-ci mais lors de votre prochaine question, nous vous remercions de le faire vous-même sous peine de voir votre sujet verrouillé.
Merci de votre collaboration.
Touche Ctrl de Windows = touche cmd⌘ sur Mac
Outils > Options sur Windows = OpenOffice > Préférences sur Mac
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25175
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Calc] Copier-coller les résultats de formules

Message par Dude »

Salut,

Question largement abordée et qui fait l'objet d'un Suprême de code.
bgault
Membre lOOyal
Membre lOOyal
Messages : 25
Inscription : 23 juin 2008 07:05
Localisation : Segré

Re: [Calc] Copier-coller les résultats de formules

Message par bgault »

Merci pour la correction de balise, je n'avais pas bien vu qu'il fallait en mettre une au départ.

Pour répondre à Dude :
La question précise que je pose n'est pas abordée dans Suprême de code car ce que je veux c'est copier des zones identiques prise sur une vingtaine de feuilles et les reporter sur une même feuille bilan.
Pour copier une fois je n'ai pas besoin de macro mais je veux copier 20 fois au moins en une seule commande,
c'est ce que fait le premier code que je propose avec Sheet.copyRange mais il copie une formule au lieu de la valeur.
Le second code copie bien la valeur pour une seule feuille mais ne fonctionne pas en répétition dans le troisième code.
openoffice 4.1.1 sous Windows 7
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25175
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Calc] Copier-coller les résultats de formules

Message par Dude »

Je viens d'ouvrir ton classeur et déjà on ne comprend rien.
A priori, c'est une conversion d'un XLS au départ.
C'est bourré de modules inutiles pour chaque feuille.
Un peu de ménage ne nuirait pas.

Le script colle_sur_bilan se sert d'une sélection.
Tu n'y défini donc aucune plage au départ.
Le 2e exemple du suprême de code montre comment faire.

Le script copie_nombre se sert de la plage G33:Z33
Si je regarde le contenu de ces cellules, il affiche #DIV/0.
Commence par fournir un exemple utilisable.
bgault
Membre lOOyal
Membre lOOyal
Messages : 25
Inscription : 23 juin 2008 07:05
Localisation : Segré

Re: [Calc] Copier-coller les résultats de formules

Message par bgault »

Merci de t'intéresser à moi

Je t'explique

Je viens d'ouvrir ton classeur et déjà on ne comprend rien.
A priori, c'est une conversion d'un XLS au départ.
Effectivement je travaillais sous excel et les macros fonctionnent correctement sous excel

C'est bourré de modules inutiles pour chaque feuille.
Un peu de ménage ne nuirait pas.
J'avais un peu commencé le ménage mais j'ai constaté qu'il y avait beaucoup de choses à faire et que cela ne me gênait pas.

Le script colle_sur_bilan se sert d'une sélection.
Tu n'y défini donc aucune plage au départ.
C'est voulu, cette macro doit me permettre de choisir en sélectionnant la colonne voulue sur la feuille "C0" :
Je veux le bilan du TP1 : je sélectionne sur "C0" la plage G11:G33 et le lance le script colle_sur_bilan qui va recopier les cellules de la plage G11:G33 de toutes les feuilles numérotées sur la feuille bilan.
Si j'avais voulu le bilan du TP2, j'aurai sélectionné sur "C0" la plage K11:K33.
C'est pour cela que la plage de départ n'est pas définie car on ne sait pas à l'avance quelle est cette plage.
L'idéal serait que ces colonnes soient recopiées en ligne (donc transposées), je sais le faire avec excel, pas avec openOffice.



Le 2e exemple du suprême de code montre comment faire.

Le script copie_nombre se sert de la plage G33:Z33
Si je regarde le contenu de ces cellules, il affiche #DIV/0.
Commence par fournir un exemple utilisable.

Effectivement, j'ai fourni un document vierge de tout nombre.
Je te met donc un document avec des TP remplis de valeurs
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
openoffice 4.1.1 sous Windows 7
bgault
Membre lOOyal
Membre lOOyal
Messages : 25
Inscription : 23 juin 2008 07:05
Localisation : Segré

Re: [Calc] Copier-coller les résultats de formules

Message par bgault »

J'ai résolu le problème en reportant simplement les valeurs unes par une avec
feuille2.getCellByPosition(k,num_feuille).Value = feuille1.getCellByPosition(numColonneZone,j).Value

Je peux ainsi choisir les feuilles comme je veux et recopier où je veux.
Je me permet même de transposer les valeurs qui sont en colonnes, en lignes.

Voilà le code complet de la macro :

Code : Tout sélectionner

Sub Bil
'Transcrit des colonnes en lignes
  dim classeur as object
  dim feuilles as object
  dim feuille as object
  dim cellule as object
  dim i as integer
  dim j as integer
  dim k as integer
  dim num_feuille as integer
  
  classeur = thisComponent  ' le classeur
  total = classeur.Sheets.Count - 3
  feuilles = classeur.Sheets ' la collection des feuilles
  feuille2 = feuilles.getByName("bilan") 'La feuille finale

Dim Doc As Object  
Dim Zone As Object
Dim CoordZone As Object
Doc = StarDesktop.CurrentComponent
Zone = Doc.CurrentSelection
CoordZone = Zone.RangeAddress
numColonneZone = CoordZone.StartColumn 
  
  for num_feuille = 1 to total
 feuille1 = feuilles.getByName(num_feuille)  'la feuille initiale
  for i = 0 to 22
  If i = 6 then
  i=7        
  Endif
  If i = 13 then
  i=14        
  Endif
  If i = 19 then
  i=20
  Endif
  j=i+10
  k=i+2
  feuille2.getCellByPosition(k,num_feuille).Value = feuille1.getCellByPosition(numColonneZone,j).Value
  
  next i
  next num_feuille
End Sub
et le document propre qui va avec :
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
openoffice 4.1.1 sous Windows 7