[Résolu][Calc] Appliquer formule sur une colonne

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 !
f2m
NOOuvel adepte
NOOuvel adepte
Messages : 11
Inscription : 01 janv. 2012 17:23

[Résolu][Calc] Appliquer formule sur une colonne

Message par f2m »

Bonjour à tous,

Je débute actuellement en "macro" et j'aurai besoin d'un petit coup de pouce concernant un code de macro.

Je pense que cela ne doit pas être bien compliqué mais je ne trouve pas la solution :fou:

Le but étant par macro de demander à la fonction "supprespace" de faire son boulot sur une colonne définie.

J'arrive à le faire pour une cellule mais je n'y arrive pour une colonne :oops:

Je vous remercie par avance pour toute aide.

Mon OS est W10 et je travaille à la fois sous Libre office MIMO version 4.3.7.2.0 et Libre office 5.0.4.2
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Dernière modification par f2m le 15 mars 2016 17:03, modifié 3 fois.
Libre office MIMO version 4.3.7.2.0 et Libre office 5.0.4.2 sous Windows 10
Avatar de l’utilisateur
Noonours
PassiOOnné
PassiOOnné
Messages : 541
Inscription : 11 mai 2013 00:11
Localisation : Aix en Provence

Re: [Calc]appliquer formule sur une colonne

Message par Noonours »

Bonjour

La solution existe sans macro en validant matriciellement ta formule à l'aide des touches Ctrl+Maj+Entrée.

PS: Relis bien l'utilisation des icones pour ce forum: c'est LA :wink:
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 26.2.6.3 (recommandée) et OpenOffice 4.1.16 sous Windows 10
f2m
NOOuvel adepte
NOOuvel adepte
Messages : 11
Inscription : 01 janv. 2012 17:23

Re: [Calc] Appliquer formule sur une colonne

Message par f2m »

Salut, pour la validation, je connais.

Merci d'avoir répondu.

Cependant, je dois passer par une macro pour mon souci. En effet, cette macro débute un code qui, par la suite, possède quelques autres macros qui font d'autres modifications au texte dans les cellules de la colonne.

Le but est qu'avec un simple clic sur un bouton, il y ait une suppression des espaces indésirables...
Libre office MIMO version 4.3.7.2.0 et Libre office 5.0.4.2 sous Windows 10
Piaf
GourOOu
GourOOu
Messages : 5622
Inscription : 25 nov. 2011 18:07
Localisation : Guyane

Re: [Calc] Appliquer formule sur une colonne

Message par Piaf »

Bonsoir
Pas sur d'avoir tout compris (la suppression des espaces est appliquée sur la colonne où se trouve la Fonction ?), regarde si la macro fait ce que tu souhaites obtenir.

Code : Tout sélectionner

Sub SuppressionespaceFormule
Dim oDoc As Object , Feuille As Object 
Dim maZone As Object 
	oDoc = ThisComponent 
	Feuille = oDoc.getSheets.getByName("TEST") 
	maZone = Feuille.getCellRangeByName("D1:D10")
	maZone.ArrayFormula = "=TRIM(C1:C10)"
End sub
A+
Libre Office Version: 6.1.6 et Apache OpenOffice 4.1.6 Sur Xubuntu 18.04 AMD64
Avatar de l’utilisateur
Noonours
PassiOOnné
PassiOOnné
Messages : 541
Inscription : 11 mai 2013 00:11
Localisation : Aix en Provence

Re: [Calc] Appliquer formule sur une colonne

Message par Noonours »

Bonsoir

Une autre proposition de script (certainement moins élégant que celui de Piaf) qui modifie directement la colonne C:

Code : Tout sélectionner

Option Explicit

Sub suupressionespace

Dim MaZone As Object 
Dim oAcces As Object
Dim donnees As Variant, temp As Variant
Dim x As Long, y As Long

maZone = ThisComponent.Sheets.getByName("TEST").getCellRangeByName("C1:C10")

oAcces = CreateUnoService("com.sun.star.sheet.FunctionAccess")

    donnees = maZone.DataArray
    for y = LBound(donnees) to UBound(donnees)
      temp = donnees(y)
      for x = LBound(temp) to UBound(temp)
        temp(x) = oAcces.callFunction("TRIM", array(temp(x)))
      next
      donnees(y) = temp
    next
    maZone.DataArray = donnees
  
End Sub
A tester bien sur.

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 26.2.6.3 (recommandée) et OpenOffice 4.1.16 sous Windows 10
Piaf
GourOOu
GourOOu
Messages : 5622
Inscription : 25 nov. 2011 18:07
Localisation : Guyane

Re: [Calc] Appliquer formule sur une colonne

Message par Piaf »

Bonjour
Une autre solution pour modifier la zone, sans passer par DataArray

Code : Tout sélectionner

Sub SuppEsp
Dim maZone as Object, maCellule as Object
	maZone = ThisComponent.Sheets.getByName("TEST").getCellRangeByName("C1:C10")
	For i = 1 To 10
		maCellule = maZone.getCellRangeByName("C" & i)
		maCellule.String = SuppressionEspace(maCellule.String)
	Next i	
End Sub

Function SuppressionEspace(monTexte as String)
Dim oCalc As Object
	oCalc = CreateUnoService("com.sun.star.sheet.FunctionAccess")
	SuppressionEspace = oCalc.callFunction("TRIM", Array(monTexte)) 
End Function
Tu as l’embarras du choix :lol:
A+
Libre Office Version: 6.1.6 et Apache OpenOffice 4.1.6 Sur Xubuntu 18.04 AMD64
f2m
NOOuvel adepte
NOOuvel adepte
Messages : 11
Inscription : 01 janv. 2012 17:23

Re: [Calc] Appliquer formule sur une colonne

Message par f2m »

Bonjour à tous

Pour commencer un GRAND GRAND GRAND merci pour votre aide.

Je viens de passer 6 heures sur ce projet et j'avais un bogue qui me faisait rager.

En effet, la formule trouvée hier soir ne marchait pas ou apportait des bogues à cause de notamment des titres dans les colonnes. Cette formule n'aimait pas non plus être dans une colonne non adjacente...

Enfin bref, je suis bien content de vos propositions. :D

Pour l'instant, j'ai testé la première qui semble super bien se comporter.

Je poste donc ce petit message rapidement et je retourne tester tout ça.

Promis, je poste l'ensemble du code qui, à mon avis, aura sûrement besoin d'un nettoyage étant donné que je ne fais que copier et adapter les formules que je trouve...

A bientôt et sincèrement merci à tous (je teste les autres codes aussi). ;)
Libre office MIMO version 4.3.7.2.0 et Libre office 5.0.4.2 sous Windows 10
f2m
NOOuvel adepte
NOOuvel adepte
Messages : 11
Inscription : 01 janv. 2012 17:23

Re: [Calc] Appliquer formule sur une colonne

Message par f2m »

Resalut tout le monde.
La modération vous a écrit: :alerte: 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.

Alors, je n'ai pas eu le temps de tester toutes les propositions, car j'ai eu des soucis avec la protection des cellules notamment :fou:

En effet, mon code ne fonctionnait pas et je ne comprenais pas d'où venait le problème...

Voici le code

Code : Tout sélectionner

Sub supressionespace
Dim oDoc as Object 
Dim MaFeuille as Object
Dim maCellule as Object
Dim curseur as Object
'Dim i As Long 
 
Dim maZone As Object 

rem enlève la protection de la feuille-------------------------------------------------------------------
rem MaFeuille = ThisComponent.Sheets.getByName("")



   oDoc = ThisComponent 
   MaFeuille = oDoc.getSheets.getByName("Communes") 
   MaFeuille.Unprotect ("motdepasse")
   maZone = MaFeuille.getCellRangeByName("O4:O6000")
   maZone.ArrayFormula = "=TRIM(C4:C1000)"


'fait la copie de B (supprespace) en C


dim PysFeuille as object
dim PysSource as object
dim PysDest as object

PysFeuille = thiscomponent.sheets.getByName("Communes")
PysSource = PysFeuille.getCellRangeByName("O4:O6000")
PysDest = PysFeuille.getCellRangeByName("D4:D6000")

PysDest.DataArray = PysSource.DataArray

 
 ' La fonction remplace les espaces par des tirets


 
 
  Dim Remplace As Object 
  Dim Ancien(3) As String , Nouveau(3) As String 
  Dim i As Long 
  
 
 ' La fonction remplace les espaces par des tirets

   
  Ancien() = Array(" ") 
  Nouveau() = Array("-") 
  
  MaFeuille = thisComponent.sheets.getByName("Communes")
  maZone = maFeuille.getCellRangeByName("D4:D6000")
  Remplace = maZone.createReplaceDescriptor 
  
  For i = 0 To 0 
    Remplace.SearchString = Ancien(i) 
    Remplace.ReplaceString = Nouveau(i) 
    MaZone.replaceAll(Remplace) 
  Next i 
 
 
 
 
  ' remplace l'ancien texte par le nouveau
 
  Ancien() = Array("ST-" , "STE-" , "-CEDEX" , "-D-" , "ç" , "è" , "ê" , "â" , "à" , "ô" , "ï" , "î" , "ë" , "les-" , "La-" , "Le-" , "é") 
  Nouveau() = Array("SAINT-" , "SAINTE-" , "", "-D'" , "c" , "e" , "e" , "a" , "a" , "o" , "i" , "i", "e" , "(Les)" , "(La)" , "(Le)" , "e") 
  
  maFeuille = thisComponent.sheets.getByName("Communes")
  maZone = maFeuille.getCellRangeByName("D4:D6000")
  Remplace = maZone.createReplaceDescriptor 
  
  For i = 0 To 16 
    Remplace.SearchString = Ancien(i) 
    Remplace.ReplaceString = Nouveau(i) 
    maZone.replaceAll(Remplace) 
  Next i 

  
  
  'le fonction met des majsucules partout

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 = "$D$4:$D$6000"

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

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

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

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

  End Sub






En gros voici les étapes.

La macro déverrouille le classeur
La fonction "supprespace" recueille ce que j'ai copié en C en enlevant les espaces indésirables
Le code donné par vos soins étire la fonction "supprespace" sur la colonne O
Le code copie les données uniquement (pas la formule) en O et la colle en D sans utiliser le presse papier (oui faut pas oublier qu'au tout début l'utilisateur effectue un copier/coller collage spécial)
Le code enlève les espaces entre les mots et mets des tirets à la place
Le code remplace certains caractères é à et met des e a
Le code met toute la colonne en majuscules.
Le code de la macro verrouille le classeur

Vient ensuite, dans le fichier, des formules de recherches (rechercheV) qui analyses la colonne D travaillée par la macro et qui donne un résultat en fonction de cela...

Pour info, voilà l'une des formules

=SI(ESTVIDE(D4);" ";SI(ESTNA(RECHERCHEV(D4;Commune;1;0));"NON TROUVÉE";RECHERCHEV(D4;Commune;1;0)))

Voilà, en tout cas un grand merci à tout le monde.

Message pour le modérateur : j'indiquerais "résolu" après quelques jours, si personne n'a de suggestion(s) pour améliorer le code et le rendre plus efficace (travail sur 6000 lignes quand même).
Libre office MIMO version 4.3.7.2.0 et Libre office 5.0.4.2 sous Windows 10