Modérateur: Vilains modOOs
Bidouille a écrit: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 les autres questions postées ?
Lisez ce fil pour savoir quelle balise utiliser : sutra27295.html#27295
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.
Du code bien encadré est plus facile à lire
Pickup02 a écrit:j'essaie de modifier le macro ci dessous pour enregistrer en ods une feuille mais pas en pdf.
Dude a écrit:Le code que tu donnes vient de l'enregistreur de macro.
Il te suffit de l'utiliser et de faire l'opération de copie de feuille que je t'ai conseillée dans ton autre fil.
Pickup02 a écrit:J'ai utilisé l'enregistreur de macro, sauf que ça ne fonctionne pas
Pickup02 a écrit:étant donné que mes cellules contiennent des formules, lors de la copie, calc copie les formules mais pas les valeurs
Pickup02 a écrit:[Calc] Copie d'une feuille sans formule
Pickup02 a écrit:Encore une information qui aurait dû être précisée dès le départ.
Ton titre ne reflète donc pas le problème que tu exposes : [Calc] Copie d'une feuille sans formule
.libre choix de compréhension .Pickup02 a écrit:Cette feuille contient des cellules qui vont recherché des données sur une autres feuilles.
Pickup02 a écrit:[Calc] Copie d'une feuille sans formule
Moi je comprends qu'il n'y pas de formules dans la feuille en question.... libre choix de compréhension .
Pickup02 a écrit:moi je veux bien envoyer même mon fichier : mais 2600 Ko.
REM ***** BASIC *****
'
' Code fourni par le forum francophone OOo/LO
' http://user.services.openoffice.org/fr/forum/viewtopic.php?f=8&t=35225
'
'
' Ce code est placé sous licence GNU GPL
'
' Testé avec OOo 3.2.1, AOO 3.4.1, LO 3.4.3 et LO 3.5.5.3
'
Option Explicit
Sub Main
Dim oCible As Object, oSheet As Object, oCursor As Object
Dim oRange As Object, oRangeCpy As Object
Dim sURL As String, aUrl() As String
' on Créé la Cible
sURL = "private:factory/scalc"
oCible = StarDesktop.loadComponentFromURL(sURL,"_blank",0,Array())
' On récupère la Feuille31
oSheet = thisComponent.Sheets.getByName("Feuille31")
' On récupère la plage utilisée
oCursor = oSheet.createCursor() : oCursor.gotoStartOfUsedArea(False)
oCursor.gotoEndOfUsedArea(True) : oRange = oCursor.getRangeAddress()
' Et son contenu
oRangeCpy = oSheet.getCellRangeByPosition(_
oRange.StartColumn, oRange.StartRow,_
oRange.EndColumn, oRange.EndRow).getDataArray
' qu'on copie en Feuille1 du document créé
oCible.Sheets(0).getCellRangeByPosition(_
oRange.StartColumn, oRange.StartRow,_
oRange.EndColumn, oRange.EndRow).setDataArray(oRangeCpy)
' On récupère le nom du document original (avec le path)
aUrl = split(thisComponent.URL,".ods")
' on modifie le nom et on rajoute l'extension
sUrl = aUrl(0) & "_Copie.ods"
' on sauvegarde la copie et on la ferme
oCible.storeAsURL(sUrl, Array())
oCible.close(True)
End Sub
Ajout : L'existence de la Feuille31 n'est pas testée non plus : cela fait donc éventuellement trois tests à rajouter ![]() |
Ajout : 2 Mais il n'y a pas qu'à ce niveau que je m'éloigne des règles de l'Art : les puristes (gOOorOOos entre autres) diront qu'il faut passer par des variables intermédiaires, ce qui est loin d'être faux. Mais je suis toujours gêné par la déclaration et l'utilisation de variables qui ne vont servir qu'une fois ou deux... Je préfère, et de loin, réutiliser ou ne rien déclarer en m'appuyant sur les possibilités de l'API. Pas nécessairement pérenne : on est d'accord ![]() ![]() |
mais si mon fichier peu vous donner plus d'éléments !
Pickup02 a écrit:heuuun je n'ai plus le fichier sous les yeux mais je doute entre la feuille 31 et 30 ...
je pense que c'est la feuille 30 en fait, celle ou il y à le bouton enregistrer sous pdf....
' On récupère la Feuille31
oSheet = thisComponent.Sheets.getByName("Feuille31")
' On récupère la Feuille30
oSheet = thisComponent.Sheets.getByName("Feuille30")
c'est Dude qui va être énervé .....
ThisComponent.Sheets.getByName("30")
oFeuille.getCellRangeByName("E2")
' On récupère le nom du document original (avec le path)
aUrl = split(thisComponent.URL,".ods")
' on modifie le nom et on rajoute l'extension
sUrl = aUrl(0) & "_Copie.ods"
' Nom de sauvegarde si le nom contient le chemin et l'extension
sUrl = convertToURL(ThisComponent.Sheets.getByName("30").oFeuille.getCellRangeByName("E2").String
' Nom de sauvegarde si le nom contient le chemin sans l'extension
sUrl = convertToURL(ThisComponent.Sheets.getByName("30").oFeuille.getCellRangeByName("E2").String & ".ods")
Rem Copie feuille 30 vers feuille 37
Dim oDoc As Object, dispatcher As Object
Dim args(5) As New com.sun.star.beans.PropertyValue
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
oDoc = ThisComponent
oCadre = oDoc.CurrentController.Frame
oFeuille1 = oDoc.Sheets.getByName("30")
oFeuille2 = oDoc.Sheets.getByName("37")
oCopie = oFeuille1.getCellRangeByName("A1:M50")
oColle = oFeuille2.getCellRangeByName("A1:M50")
oDoc.CurrentController.Select(oCopie)
dispatcher.executeDispatch(oCadre, ".uno:Copy", "", 0, Array())
args(0).Name = "Flags"
args(0).Value = "SVDNT"
args(1).Name = "FormulaCommand"
args(1).Value = 0
args(2).Name = "SkipEmptyCells"
args(2).Value = false
args(3).Name = "Transpose"
args(3).Value = false
args(4).Name = "AsLink"
args(4).Value = false
args(5).Name = "MoveMode"
args(5).Value = 4
oDoc.CurrentController.Select(oColle)
dispatcher.executeDispatch(oCadre, ".uno:InsertContents", "", 0, args())
rem recopie feuille 37 vers un nouveau classeur
dim document as object
rem get access to the document
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"
args1(0).Value = "$A$5:$F$5"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())
dim args2(0) as new com.sun.star.beans.PropertyValue
args2(0).Name = "Flags"
args2(0).Value = "A"
dispatcher.executeDispatch(document, ".uno:Delete", "", 0, args2())
dim args3(2) as new com.sun.star.beans.PropertyValue
args3(0).Name = "DocName"
args3(0).Value = ""
args3(1).Name = "Index"
args3(1).Value = 32767
args3(2).Name = "Copy"
args3(2).Value = true
dispatcher.executeDispatch(document, ".uno:Move", "", 0, args3())
REM ***** BASIC *****
'
' Code fourni par le forum francophone OOo/LO
' http://user.services.openoffice.org/fr/forum/viewtopic.php?f=8&t=35225
'
'
' Ce code est placé sous licence GNU GPL
'
' Testé avec OOo 3.2.1, AOO 3.4.1, LO 3.4.3 et LO 3.5.5.3
'
Option Explicit
Sub Main
Dim oCible As Object, oSheet As Object, oCursor As Object
Dim oRange As Object, oRangeCpy As Object
Dim sURL As String, aUrl() As String
' on Créé la Cible
sURL = "private:factory/scalc"
oCible = StarDesktop.loadComponentFromURL(sURL,"_blank",0,Array())
' On récupère la Feuille30
oSheet = thisComponent.Sheets.getByName("30")
' On récupère la plage utilisée
oCursor = oSheet.createCursor() : oCursor.gotoStartOfUsedArea(False)
oCursor.gotoEndOfUsedArea(True) : oRange = oCursor.getRangeAddress()
' Et son contenu
oRangeCpy = oSheet.getCellRangeByPosition(_
oRange.StartColumn, oRange.StartRow,_
oRange.EndColumn, oRange.EndRow).getDataArray
' qu'on copie en Feuille1 du document créé
oCible.Sheets(0).getCellRangeByPosition(_
oRange.StartColumn, oRange.StartRow,_
oRange.EndColumn, oRange.EndRow).setDataArray(oRangeCpy)
'
' On récupère le path du du document original
aUrl = split(thisComponent.URL,"/")
' on modifie le nom et on rajoute l'extension
aUrl(UBound(aUrl)) = oSheet.getCellRangeByName("E2").String & ".ods"
sUrl = convertToURL(join(aUrl,"/"))
'
' on sauvegarde la copie et on la ferme
oCible.storeAsURL(sUrl, Array())
oCible.close(True)
End Sub
Rem Copie feuille 30 vers feuille 37
Dim oDoc As Object, dispatcher As Object
Dim oCadre as Object
Dim args(5) As New com.sun.star.beans.PropertyValue
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
oDoc = ThisComponent
oCadre = oDoc.CurrentController.Frame
oFeuille1 = oDoc.Sheets.getByName("30")
oFeuille2 = oDoc.Sheets.getByName("37")
oCopie = oFeuille1.getCellRangeByName("A1:M50")
oColle = oFeuille2.getCellRangeByName("A1:M50")
oDoc.CurrentController.Select(oCopie)
dispatcher.executeDispatch(oCadre, ".uno:Copy", "", 0, Array())
args(0).Name = "Flags"
args(0).Value = "SVDNT"
args(1).Name = "FormulaCommand"
args(1).Value = 0
args(2).Name = "SkipEmptyCells"
args(2).Value = false
args(3).Name = "Transpose"
args(3).Value = false
args(4).Name = "AsLink"
args(4).Value = false
args(5).Name = "MoveMode"
args(5).Value = 4
oDoc.CurrentController.Select(oColle)
dispatcher.executeDispatch(oCadre, ".uno:InsertContents", "", 0, args())
rem recopie feuille 37 vers un nouveau classeur
dim document as object
rem get access to the document
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"
args1(0).Value = "$A$5:$F$5"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())
dim args2(0) as new com.sun.star.beans.PropertyValue
args2(0).Name = "Flags"
args2(0).Value = "A"
dispatcher.executeDispatch(document, ".uno:Delete", "", 0, args2())
dim args3(2) as new com.sun.star.beans.PropertyValue
args3(0).Name = "DocName"
args3(0).Value = ""
args3(1).Name = "Index"
args3(1).Value = 32767
args3(2).Name = "Copy"
args3(2).Value = true
dispatcher.executeDispatch(document, ".uno:Move", "", 0, args3())
autosave
End Sub
sub autosave
Dim oCible As Object, oSheet As Object, oCursor As Object
Dim oRange As Object, oRangeCpy As Object
Dim sURL As String, aUrl() As String
oSheet = thisComponent.Sheets.getByName("37")
oCible = oSheet
aUrl = split(thisComponent.URL,"/")
' on modifie le nom et on rajoute l'extension
aUrl(UBound(aUrl)) = oSheet.getCellRangeByName("E2").String & ".ods"
sURL = convertToURL(join(aUrl,"/"))
'
' on sauvegarde la copie et on la ferme
oCible.storeAsURL(sURL, Array(0))
fermepage
End Sub
Pickup02 a écrit:Problème, en réponse sur cette ligne : oCible.storeAsURL(sURL, Array(0)) , Propriété ou methode non trouvé storeAsURL
oSheet = thisComponent.Sheets.getByName("37")
oCible = oSheet
Au début de la discussion, Dude a écrit:Pourquoi ne joins-tu pas un fichier accompagné du code ?
REM ***** BASIC *****
'
' Code fourni par le forum francophone OOo/LO
' http://user.services.openoffice.org/fr/forum/viewtopic.php?f=8&t=35225
'
'
' Ce code est placé sous licence GNU GPL
'
' Testé avec OOo 3.2.1, AOO 3.4.1, LO 3.4.3 et LO 3.5.5.3
'
Option Explicit
Sub MainV2
Dim oCible As Object, oSheet As Object, oCursor As Object
Dim oRange As Object, oRangeCpy As Object
Dim sUrlSrc As String, sUrlCbl As String, sUrlModel As String, aUrl() As String, sPath As String
'
' On récupère la Feuille30
oSheet = thisComponent.Sheets.getByName("30")
'
' On récupère l'url du document original
sUrlSrc = thisComponent.URL
' On en extrait le Path
aUrl = split(sUrlSrc,"/")
aUrl(UBound(aUrl)) = ""
sPath = convertToURL(join(aUrl,"/"))
'
' L'array n'ayant été modifié que sur son dernier élément
' on s'en ressert pour créer le nom de la copie
'
' On triture pour créer le nom de la copie
aUrl(UBound(aUrl)) = oSheet.getCellRangeByName("E2").String & ".ods"
sUrlCbl = convertToURL(join(aUrl,"/"))
'
' Et on bénéficie d'un tour gratuit pour le nom de modèle
aUrl(UBound(aUrl)) = "API V1-30.ots"
sUrlModel = convertToURL(join(aUrl,"/"))
'
' on Créé la Cible à partir du modèle
oCible = StarDesktop.LoadComponentFromURL(sUrlModel,"_default",0,Array()
'
' On récupère la plage utilisée dans l'original Feuille "30"
oCursor = oSheet.createCursor() : oCursor.gotoStartOfUsedArea(False)
oCursor.gotoEndOfUsedArea(True) : oRange = oCursor.getRangeAddress()
' Et son contenu
oRangeCpy = oSheet.getCellRangeByPosition(_
oRange.StartColumn, oRange.StartRow,_
oRange.EndColumn, oRange.EndRow).getDataArray
' qu'on copie en Feuille1 du document créé
oCible.Sheets(0).getCellRangeByPosition(_
oRange.StartColumn, oRange.StartRow,_
oRange.EndColumn, oRange.EndRow).setDataArray(oRangeCpy)
'
' on sauvegarde la copie et on la ferme
oCible.storeAsURL(sUrlCbl, Array())
oCible.close(True)
End Sub
Ajout : En relisant, j'ai retrouvé un sPath qui ne sert plus à rien (j'ai donc mis en commentaire) : vestiged'une approche dont l'essentiel se faisait dans un sub nommé A_La_Hache, le choix du nom est révélateur... Mais pour résumer : c'est compact, ça marche mais c'est vraiment sauvage et limite car un peu tiré par les cheveux... La solution ci-dessus fonctionnant normalement quelle que soit la branche... (bémol : je n'ai pas tester sur la 3.6) autant miser sur une certaine stabilité. |
Le modérateur a écrit:Évitez de citer l'ensemble du message précédent, cela rend la lecture très difficile.
Dude a écrit:Pickup02 a écrit:Problème, en réponse sur cette ligne : oCible.storeAsURL(sURL, Array(0)) , Propriété ou methode non trouvé storeAsURL
Reprenons ton code :
- Code : Tout sélectionner AgrandirRéduire
oSheet = thisComponent.Sheets.getByName("37")
oCible = oSheet
oCible est un objet cellule et non le classeur. D'ailleurs le nom oSheet porte à confusion.
Donc, il est normal que tu ne puisses l'enregistrer.
Tu dois agir sur l'objet oDoc.
Je dis ça au pif, car là encore :Au début de la discussion, Dude a écrit:Pourquoi ne joins-tu pas un fichier accompagné du code ?
Tu devrais utiliser XRay pour voir les propriétés et méthodes des objets que tu utilises. C'est un outil indispensable pour comprendre ce que l'on fait.
il bloque lors de la recherche de la cellule E2 au début de la macro....
aUrl(UBound(aUrl)) = oSheet.getCellRangeByName("E2").String & ".ods"
Le modérateur a écrit:Merci de ne pas poster plusieurs messages à la suite !
Si vous devez ajouter un complément d'information, le bouton "Editer" à la droite du message permet d'y remédier.
En attendant une prochaine réponse, vous pouvez participer également en répondant à d'autres questions sur notre forum.
oCible = StarDesktop.LoadComponentFromURL(sUrlModel,"_default",0,Array()
Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 2 invité(s)