[Résolu] [Calc] Exporter contenu d'une colonne dans fichier

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 !
Avatar de l’utilisateur
LA_440
Fraîchement OOthentifié
Messages : 7
Inscription : 30 juin 2021 20:42

[Résolu] [Calc] Exporter contenu d'une colonne dans fichier

Message par LA_440 »

Bonjour,

Dans le tableau ci-joint, j'aimerais que lorsque l'utilisateur clique sur le bouton "Export", une macro exporte les cellules non vides de la colonne A dans un fichier intitulé "Fruits.txt".
La colonne A comporte ici 22 lignes, mais le but est que la macro fonctionne avec une colonne A ayant un nombre de lignes variable (qu'on ne connaît pas à l'avance).

Je sais à peu près le faire avec Excel, mais je ne sais pas du tout le faire avec Calc. :(
(le fichier sera destiné à des utilisateurs ne disposant que de LibreOffice Calc)

J'en appelle donc à vos compétences.

Merci d'avance pour votre aide.
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Dernière modification par LA_440 le 03 juil. 2021 21:01, modifié 1 fois.
LibreOffice 7.1 sous Windows 10
Avatar de l’utilisateur
rollmops
PassiOOnné
PassiOOnné
Messages : 669
Inscription : 20 déc. 2017 14:45

Re: [Calc] Exporter le contenu d'une colonne dans un fichier

Message par rollmops »

Bonjour LA_440
LA_440 a écrit :La colonne A comporte ici 22 lignes, mais le but est que la macro fonctionne avec une colonne A ayant un nombre de lignes variable (qu'on ne connaît pas à l'avance).
Justement comment sait-on qu'on a atteint la fin de la colonne ?
J'imagine que tu ne parcours pas l'intégrralité avec plus d'un million de lignes :fou:
Je sais à peu près le faire avec Excel, mais je ne sais pas du tout le faire avec Calc.
As-tu déjà regardé les équivalences pour chaque ligne de ta macro Excel ?
Fais une recherche dans ce forum, il y a sûrement des exemples.
OpenOffice 4.1.15 - Windows 10
Avatar de l’utilisateur
Noonours
PassiOOnné
PassiOOnné
Messages : 501
Inscription : 11 mai 2013 00:11
Localisation : Aix en Provence

Re: [Calc] Exporter le contenu d'une colonne dans un fichier

Message par Noonours »

Bonjour,
Une proposition dans le fichier-joint, faite à la "va-vite":
Fruits.ods
A tester :wink:
 Ajout : Je mets ci-dessous le code utilisé sur ce fichier, il a probablement plus élégant ou efficace :oops: 

Code : Tout sélectionner

Sub BtnExport

'Déclaration du tableau des résultats
Dim aResult() As Variant

'Feuille 1, colonne A (index = 0)
oDoc = ThisComponent
oFeuil = oDoc.Sheets(0)
oColA = oFeuil.Columns(0)

'on récupère sous forme de tableau les cellules ayant un contenu (ici chaine ou valeur num ou date ou commentaire ou formule)
With com.sun.star.sheet.CellFlags
oCellsNonVides = oColA.queryContentCells(.STRING + .VALUE + .DATETIME + .ANNOTATION + .FORMULA)
End With

'on redimensionne le tableau des résultats à la dimension voulue
ReDim Preserve aResult(UBound(oCellsNonVides.Data))

'on crée une énumération des éléments du tableau
LesFruits = oCellsNonVides.createEnumeration

'on récupère tous les éléments pour les mémoriser dans le tableau des résultats 
While LesFruits.hasMoreElements()
  LeFruit = LesFruits.nextElement()
  for i = 0 to UBound(LeFruit.DataArray)
  	aResult(t) = LeFruit.DataArray(i)
  	t=t+1
  next i
Wend
	
'on crée un doc Writer vierge et un curseur d'écriture
NewDocWriter = StarDesktop.loadComponentFromURL("private:factory/swriter", "_blank", 0, Array())
NewDocWriter.Title = "Fruits"
Cursor = NewDocWriter.Text.createTextCursor()

'on crée un tableau pour y inclure les résultats
Table = NewDocWriter.createInstance("com.sun.star.text.TextTable")
Table.initialize(UBound(aResult)+1, 1)
NewDocWriter.Text.insertTextContent(Cursor, Table, False)

Rows = Table.Rows
 
For y = 1 To Rows.Count()
      CellName = "A" & y
      Cell = Table.getCellByName(CellName)
      Cell.String = aResult(y-1)(0)
Next


End Sub
Cordialement,
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Noonours procrastinateur perfectionniste: "Je fais rien, mais demain je l'ferai mieux"

Pour obtenir la réponse la plus précise possible, VEUILLEZ JOINDRE UN FICHIER

LibO 7.6.5.2 Stable et OpenOffice 4.1.15 sous Windows 10
Avatar de l’utilisateur
LA_440
Fraîchement OOthentifié
Messages : 7
Inscription : 30 juin 2021 20:42

Re: [Calc] Exporter le contenu d'une colonne dans un fichier

Message par LA_440 »

Bonjour/Bonsoir,

Merci à vous, rollmops et Noonours, pour vos réponses !

Je respecte la chronologie et je réponds d'abord à rollmops. :-)

Ma colonne n'atteindra jamais le million de lignes. Le million, le million ! ;-) Au maximum, 1000 lignes. Et elles contiendront en réalité tout autre chose que des noms de fruits. On sera sur des notes beaucoup moins sucrées !
Comment sait-on qu'on a atteint la fin de la colonne ? Eh bien en disant à Excel : "Cherche la dernière cellule non vide !" Enfin, je le lui dis plutôt en ces termes : "Cells(Rows.Count, 1).End(xlUp).Row". Et quand il trouve, je le félicite : "Ouuuh mais c’est un bon chien-chien ça !"

Je vais suivre ton conseil pour les équivalences Excel / LibreOffice. Je ne sais pas encore trop où chercher car je n'ai qu'un jour d'ancienneté sur le forum. :-)

Noonours, un très grand merci à toi ! Ta proposition, tu dis l'avoir faite à la "va-vite", mais tu y as quand même consacré un certain temps ou un temps certain, et c'est vraiment sympa !

Je viens de tester, ça fonctionne nickel ! On appuie sur le bouton, et hop, tout apparaît comme par magie !

Le tableau qui se crée tout seul dans le fichier doc, c'est joli ! Mais pour mon usage, il me faut du moche ! Un fichier en texte brut m'est nécessaire, parce qu'il sera ensuite importé depuis un autre logiciel qui n'accepte que le format txt. De quelle façon faudrait-il modifier le code pour que ce fichier txt se crée et se remplisse de manière automatisée et transparente, sans même s'ouvrir ? Avec Excel, ça se fait en enchaînant les commandes Open, Print et Close. Mais avec Calc, euh... j'ai tout à apprendre. Rappelons que je suis né il y a seulement 1 jour. :-)

J'ai beaucoup apprécié aussi ton approche pédagogique. Le code bien "aéré" et commenté, c'est top !
Kev74
Membre hOOnoraire
Membre hOOnoraire
Messages : 139
Inscription : 24 avr. 2021 19:09

Re: [Calc] Exporter le contenu d'une colonne dans un fichier

Message par Kev74 »

Bonsoir,

je pense que c'est cela que vous cherchiez, la base du code est la même que Nounours vous a envoyé, j'ai juste ajouté une partie pour la zone ".txt"

Code : Tout sélectionner

Sub BtnExport

'Déclaration du tableau des résultats
Dim aResult() As Variant

'Feuille 1 (index = 0)
oDoc = ThisComponent
oFeuil = oDoc.Sheets(0)

'on récupère sous forme de tableau les cellules ayant un contenu (ici chaine ou valeur num ou date ou commentaire ou formule)
With com.sun.star.sheet.CellFlags
oCellsNonVides = oFeuil.queryContentCells(.STRING + .VALUE + .DATETIME + .ANNOTATION + .FORMULA)
End With

'on redimensionne le tableau des résultats à la dimension voulue
ReDim Preserve aResult(UBound(oCellsNonVides.Data))



'on crée une énumération des éléments du tableau
LesFruits = oCellsNonVides.createEnumeration

'on récupère tous les éléments pour les mémoriser dans le tableau des résultats 
	
While LesFruits.hasMoreElements()
  LeFruit = LesFruits.nextElement()
  for i = 0 to UBound(LeFruit.DataArray)
  	aResult(t) = LeFruit.DataArray(i)
  	t=t+1
  next i
Wend


'récupère le dossier où le fichier Fruits est enregistré 
 sURLFolder= replace(ThisComponent.url,ThisComponent.title,"")
'enregistre le fichier texte dans le même dossier où le fichier Fruits est enregistré (modifier "nom" dans la ligne de
'code du bas) par ce que vous voulez

   sFileName = sURLFolder & "nom" & ".txt"
   
'Ouvre ce fichier texte pour ensuite coller les informations
   n = FreeFile()
   Open sFileName For Output As #n
   
'Ecris les données dans une seule colonne
   For i = 0 To UBound(aResult)
   Print #n, aResult(i)(0)

   Next
'Ferme le fichier texte
   Close #n





End Sub
Dites moi si ce n'est pas clair

Bonne soirée
LibreOffice 7.0.5.2 sous Windows 10
Avatar de l’utilisateur
LA_440
Fraîchement OOthentifié
Messages : 7
Inscription : 30 juin 2021 20:42

Re: [Calc] Exporter le contenu d'une colonne dans un fichier

Message par LA_440 »

Bonsoir Kev74,

Merci beaucoup ! C'est tout à fait ce que je cherchais !

Encore merci à tous, vous êtes épatants !
Avatar de l’utilisateur
micmac
RespOOnsable forum
RespOOnsable forum
Messages : 9252
Inscription : 28 août 2010 08:45

Re: [Calc] Exporter le contenu d'une colonne dans un fichier

Message par micmac »

Bonjour,

Problème résolu ?

Il est d'usage
  1. d'ajouter manuellement au début du titre de votre premier message la balise [Résolu] (avec un R majuscule et sans oublier le e accentué, le tout entre crochets [ ])
  2. et de cocher l'icône Image
Image
Adaptez la longueur du titre à 60 caractères maximum, balises comprises.

Cordialement
Touche Ctrl de Windows = touche cmd⌘ sur Mac
Outils > Options sur Windows = OpenOffice > Préférences sur Mac
Avatar de l’utilisateur
rollmops
PassiOOnné
PassiOOnné
Messages : 669
Inscription : 20 déc. 2017 14:45

Re: [Calc] Exporter le contenu d'une colonne dans un fichier

Message par rollmops »

Re,
Kev74 a écrit :With com.sun.star.sheet.CellFlags
oCellsNonVides = oFeuil.queryContentCells(.STRING + .VALUE + .DATETIME + .ANNOTATION + .FORMULA)
End With
Sauf que ça récupère toutes les cellules non vides sur toute une feuille et non d'une colonne.
LA_440 a écrit :Cells(Rows.Count, 1).End(xlUp).Row
Avec ça, tu récupères la dernière ligne d'une plage contigue. S'il y a plusieurs lignes vides, tu n'auras pas tout.
OpenOffice 4.1.15 - Windows 10
Avatar de l’utilisateur
Noonours
PassiOOnné
PassiOOnné
Messages : 501
Inscription : 11 mai 2013 00:11
Localisation : Aix en Provence

Re: [Calc] Exporter le contenu d'une colonne dans un fichier

Message par Noonours »

Bonjour
@Rollmops: j’ai remplacé a posteriori l’objet oFeuil par l’objet oColA qui ne concerne que la colonne A .
J’ai dû oublier de modifier ça sur le fichier joint.
Pas d’ordi sous la main actuellement, je réponds de mon téléphone, mais je modifierai ce soir.
Cordialement
Noonours procrastinateur perfectionniste: "Je fais rien, mais demain je l'ferai mieux"

Pour obtenir la réponse la plus précise possible, VEUILLEZ JOINDRE UN FICHIER

LibO 7.6.5.2 Stable et OpenOffice 4.1.15 sous Windows 10
Avatar de l’utilisateur
LA_440
Fraîchement OOthentifié
Messages : 7
Inscription : 30 juin 2021 20:42

Re: [Calc] Exporter le contenu d'une colonne dans un fichier

Message par LA_440 »

Bonsoir,
rollmops a écrit : Sauf que ça récupère toutes les cellules non vides sur toute une feuille et non d'une colonne.
Finement observé ! Ça se voyait difficilement dans un tableau ne comportant qu'une seule colonne. :bravo:
rollmops a écrit : Avec ça, tu récupères la dernière ligne d'une plage contigue. S'il y a plusieurs lignes vides, tu n'auras pas tout.
Ben en fait, ça me récupère tout, y compris le vide entre les lignes non vides ! :-) Ce vide, je m'en débarrasse par : If tabl(i, 1) <> "" Then...
Avatar de l’utilisateur
rollmops
PassiOOnné
PassiOOnné
Messages : 669
Inscription : 20 déc. 2017 14:45

Re: [Calc] Exporter le contenu d'une colonne dans un fichier

Message par rollmops »

LA_440 a écrit :Ben en fait, ça me récupère tout
Ce qui fait que tu parcours alors
rollmops a écrit : l'intégrralité avec plus d'un million de lignes
Pas très optimisé dans ce cas :roll:
OpenOffice 4.1.15 - Windows 10