Page 1 sur 1
[Résolu][Calc]Obliger type de caractère
Publié : 20 oct. 2017 14:04
par Daniel60
Bonjour,
J'ai un tableau dont les cellules se remplisse à l'aide d'une macro
Y a-t-il un moyen pour forcer l'écriture des cellules du tableau: ex: le nom en majuscule et le prénom, uniquement la première lettre en majuscule
Voici ma boite de dialogue (enfin une partie) :
Nom-Prénom.jpg
Et voici la propriété du TextField
TextField.jpg
Dois-je passer par une ligne particulière de programmation?
Existe-t’il une formule pour le tableur?
Re: [Calc]Obliger type de caractère
Publié : 20 oct. 2017 14:06
par micmac
Bonjour,
Avant de poster une nouvelle question, il nous serait agréable que vous donniez suite au fil précédemment initié :
Champs liste
notamment en précisant la solution retenue et en ajoutant le
balisage [Résolu] 
si c'est le cas.
C'est une question de courtoisie pour les gens qui vous ont répondu et consacré bénévolement de leur temps. Notre forum est plus lisible avec ce balisage comme vous avez pu vous en rendre compte en le parcourant.
Merci de votre collaboration
Re: [Calc]Obliger type de caractère
Publié : 20 oct. 2017 15:57
par Daniel60
Voila micmac, j'ai clos le précédent message comme demandé
Re: [Calc]Obliger type de caractère
Publié : 20 oct. 2017 16:08
par Piaf
Bonjour
Tu pourrais jeter un œil sur le suprême de
Loopingss [Calc] Exécuter des fonctions par programmation notamment pour les fonctions
MAJUSCULE et
NOMPROPRE.
Un exemple
ici entre autres.
A+
Re: [Calc]Obliger type de caractère
Publié : 20 oct. 2017 16:11
par Dude
Pas besoin de macro, il suffit d'utiliser le type de contrôle "
champ masque" :
https://wiki.openoffice.org/wiki/FR/Doc ... formulaire
Re: [Calc]Obliger type de caractère
Publié : 20 oct. 2017 16:31
par Daniel60
Merci piaf
J'ai ajouter cette fonction dans ma macro
Code : Tout sélectionner
'Mise en majuscule des cellules
Function MiseEnMajuscule(oTexte As String) As String
oCalc = CreateUnoService("com.sun.star.sheet.FunctionAccess")
MiseEnMajuscule = oCalc.callFunction("PROPER", array(oTexte))
End Function
Sachant que les nom en majuscule se trouvent dans la colonne D (D6 à D200)
Rien ne se passe. Les noms restent inchangés
Re: [Calc]Obliger type de caractère
Publié : 20 oct. 2017 16:46
par Daniel60
Merci Dude
J'ai donc sectionné ma cellule, puis Format Cellule et ai défini le champs comme indiqué
Voici un imprime écran
Format Cellule.jpg
Mais rien ne se passe le nom reste en minuscule
La modération vous 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.
Re: [Calc]Obliger type de caractère
Publié : 20 oct. 2017 17:13
par Piaf
Re
Un petit exemple au plus simple.
Code : Tout sélectionner
Sub Main
Dim oDlg As Object, oDoc as Object, maFeuille as Object
oDoc = thisComponent
maFeuille = oDoc.Sheets.getByName("Feuille1")
DialogLibraries.LoadLibrary("Standard")
oDlg = CreateUnoDialog(DialogLibraries.Standard.Dialog1)
If oDlg.Execute = com.sun.star.ui.dialogs.ExecutableDialogResults.OK Then
oDlg.getControl("txtNom").Text = UCase(oDlg.getControl("txtNom").Text)
maFeuille.getCellRangeByName("A2").String = oDlg.getControl("txtNom").Text
oDlg.getControl("txtPrenom").Text = NomPropre(oDlg.getControl("txtPrenom").Text)
maFeuille.getCellRangeByName("B2").String = oDlg.getControl("txtPrenom").Text
End If
oDlg.dispose()
End Sub
Function NomPropre(oTexte As String) As String
oCalc = CreateUnoService("com.sun.star.sheet.FunctionAccess")
NomPropre = oCalc.callFunction("PROPER", array(oTexte))
End Function
Pour tester, tu déclenches la macro main, tu tapes le nom et le prénom en minuscule dans le dialogue et tu appuis sur le bouton OK.
A+
Re: [Calc]Obliger type de caractère
Publié : 20 oct. 2017 17:30
par Daniel60
Merci piaf, mais trot compliqué à insérer dans ma macro
Ta macro est utile pour deux noms, pas pour l'ensemble d'un tableau
J'ai plusieurs cellules à mettre en majuscule et d'autre avec la première lettre en majuscule
Je pensai automatiser tout cela avec ma boite de dialogue,
Finalement il serait plus simple de formater directement les cellules dans le tableau pour arriver à mon souhait
J'épluche les différents sujets a la recherche de ma demande
Re: [Calc]Obliger type de caractère
Publié : 20 oct. 2017 17:43
par Piaf
Re
Daniel60 a écrit :mais trot compliqué à insérer dans ma macro
Pas vu ta macro donc !!!
Ni le dialogue ni quoi que ce soit d'ailleurs à part des copies d'écran
Tant que l'on ne saura pas ce que tu veux obtenir et avec quel moyen il sera difficile de t'apporter des réponses satisfaisantes.
Daniel60 a écrit :Ta macro est utile pour deux noms, pas pour l'ensemble d'un tableau
Piaf a écrit :Un petit exemple au plus simple.
A+
Re: [Calc]Obliger type de caractère
Publié : 20 oct. 2017 18:57
par joel275
Bonjour,
en attendant ton fichier exemple, une macro mettant une majuscule à la première lettre de la cellule D6:
Code : Tout sélectionner
Sub Main
MiseEnMajuscule("D6")
End Sub
Function MiseEnMajuscule(NomDeCellule as String) As String
Dim MonDoc as Object, oCalc as Object, oTexte as String
MonDoc = ThisComponent
oTexte = MonDoc.Sheets(0).getCellRangeByName(NomDeCellule).String
oCalc = CreateUnoService("com.sun.star.sheet.FunctionAccess")
MonDoc.Sheets(0).getCellRangeByName(NomDeCellule).String = oCalc.callFunction("PROPER", array(oTexte))
End Function
A plus.
Re: [Calc]Obliger type de caractère
Publié : 21 oct. 2017 06:03
par Daniel60
Bonjour Joel75
Voici donc ma macro avec l'insertion de la tienne.
Code : Tout sélectionner
REM ***** BASIC *****
Option Explicit
Const dateFormat = "dd/mm/yy"
Const findAll = "+"
Const findEmpty = "-"
Const firstColumn = 1 'première colonne (B)
Const lastColumn = 16 'dernière colonne (Q)
Const firstRow = 5 'première ligne (6)
Const maxRow = 9999 'dernière ligne (10000)!
Const ddf = 9 'date (J)
Const dde = 5 'date (F)
Const dateControl="com.sun.star.awt.UnoControlDateField"
Const listControl="com.sun.star.awt.UnoControlListBox"
Dim theSheet As Object
Dim theDialog As Object
Dim isDisplay As Boolean
Dim theControls(0 To lastColumn) As Object
Dim theDates() As Object
Dim theLists() As Object
Dim searchColumn%
Dim searchString$
Dim searchRange As Object
Dim searchDescriptor As Object
Dim searchResult As Object
Dim foundRow As Integer
Sub NewFileOnClick(event)
Dim s As String
s=Mid(event.source.model.name,3) 'Voir Module Notes
theSheet=ThisComponent.sheets.GetByName(s)
theDialog=GetSearchDialog
InitDialog
theControls(0).visible=false
theDialog.Execute
End Sub
Sub InitDialog
Dim control As Object, column As String
For Each control In theDialog.controls
column=control.model.name
If Val(column)>0 Or Left(column,1)="0" Then theControls(Val(column))=control
Next control
theDates=Array(theControls(ddf))
Dim a() As String
a=Split(theControls(0).text,"*")
theControls(0).text=a(0)+findAll+a(1)+findEmpty+a(2)
End Sub
Sub ReadFile(row%)
Dim control As Object, column As Integer, cell As Object
For column=firstColumn To lastColumn
cell=theSheet.GetCellByPosition(column,row)
control=theControls(column)
'on distingue les contrôles éditables et les listes de choix
If control.SupportsService(listControl) Then
control.SelectItem cell.string,true
ElseIf control.SupportsService(dateControl) Then
ReadDate cell,control
Else
control.text=cell.string
End If
Next column
End Sub
Sub EmptyDialog
Dim control As Object
Dim column As Integer
For column=firstColumn To lastColumn
With theControls(column)
If .SupportsService(listControl) Then
.SelectItem " ",true
Else
.text=""
End If
End With
Next column
End Sub
Function FoundAt(row)
Dim cell As Object
cell=theSheet.GetCellByPosition(searchColumn,row)
Select Case searchString
Case findAll
FoundAt=true
Case findEmpty
FoundAt=(cell.String="")
Case Else
FoundAt=Instr(cell.String,searchString)
End Select
End Function
Sub WriteToCurrentRow
WriteToRowNumber foundRow
End Sub
Sub WriteToNewRow
Dim row
row=GetNewRow
theSheet.GetCellByPosition(0,row).value=GetNewFileNumber
WriteToRowNumber row
End Sub
Sub WriteToRowNumber(n As Integer)
Dim control As Object, column As Integer, cell As Object, theDate As Long
For column=firstColumn To lastColumn
cell=theSheet.GetCellByPosition(column,n)
control=theControls(column)
'on distingue les types de contrôle
With control
If .SupportsService(listControl) Then
cell.string=.SelectedItem
ElseIf .SupportsService(dateControl) Then
WriteDate control,cell
Else
cell.string=.text
End If
End With
Next column
theDialog.EndExecute
End Sub
'-----------------------------------------------------------------------
Sub Main
MiseEnMajuscule("D6")
End Sub
Function MiseEnMajuscule(NomDeCellule as String) As String
Dim MonDoc as Object, oCalc as Object, oTexte as String
MonDoc = ThisComponent
oTexte = MonDoc.Sheets(0).getCellRangeByName(NomDeCellule).String
oCalc = CreateUnoService("com.sun.star.sheet.FunctionAccess")
MonDoc.Sheets(0).getCellRangeByName(NomDeCellule).String = oCalc.callFunction("PROPER", array(oTexte))
End Function
'-------------------------------------------------------------------------------------------------------------------
Sub ReadDate(cell As Object, control As Object)
control.text=cell.string
End Sub
Sub WriteDate(control As Object, cell As Object)
dim s As String
s=control.text
If s="" Then
cell.string=""
Else
cell.value=CDate(Join(Split(s,"/"),"."))
End If
End Sub
Sub DateControlToCell(control As String, cell As Object)
Dim strDate
strDate=control'.text
If strDate="" Then
cell.string=""
Else
strdate=Join(Split(strDate,"/"),".")
cell.value=CDate(strDate)
End If
End Sub
Sub CallSearchDisplay
SetSearchDisplay(True)
End Sub
Function GetNewRow As Integer
GetNewRow=theSheet.GetCellByPosition(0,3).value+firstRow
End Function
Function GetNewFileNumber As Integer
GetNewFileNumber=theSheet.GetCellByPosition(0,4).value+1
End Function
Function GetSearchDialog
DialogLibraries.loadLibrary("Standard")
GetSearchDialog = CreateUnoDialog(DialogLibraries.Standard.FileEditionDialog01)
End Function
Sub DeselectSpace(event As Object)
With event.source
If .selectedItem=" " Then .SelectItem " ",false
End With
End Sub
Re: [Calc]Obliger type de caractère
Publié : 21 oct. 2017 06:33
par joel275
Bonjour,
joel275 a écrit :en attendant ton fichier exemple
une série de macros, c'est bien, mais sans document exemple pour pouvoir tester (en particulier, on ne sait rien de ta boîte de dialogue qui parait centrale), sans savoir ce qui fonctionne et ce que tu n'arrives pas à faire, il est bien difficile de t'aider davantage (
Piaf a même pris le temps de fabriquer un
exemple complet sur lequel tu ne t'es apparemment pas penché sérieusement).
Dans l'attente d'une réponse efficace....
Re: [Calc]Obliger type de caractère
Publié : 21 oct. 2017 09:52
par Daniel60
Voila le tableau après épuration Confidentialité Professionnelle oblige
Tableau.ods
Re: [Calc]Obliger type de caractère
Publié : 21 oct. 2017 10:57
par Piaf
Bonjour
Daniel60 a écrit :Voici donc ma macro
Ce serait quand même plus courtois de citer l'auteur.
Code : Tout sélectionner
For column=firstColumn To lastColumn
cell=theSheet.GetCellByPosition(column,n)
control=theControls(column)
'on distingue les types de contrôle
With control
If .SupportsService(listControl) Then
cell.string=.SelectedItem
ElseIf .SupportsService(dateControl) Then
WriteDate control,cell
Else
.Text = NomPropre(.text)
cell.string = .text
End If
End With
Next column
theDialog.EndExecute
End Sub
'-----------------------------------------------------------------------
Function NomPropre(oTexte As String) As String
Dim oCalc
oCalc = CreateUnoService("com.sun.star.sheet.FunctionAccess")
NomPropre = oCalc.callFunction("PROPER", array(oTexte))
End Function
Pour utiliser la fonction nompropre sur tous les contrôles de texte.
Si la fonction ne dois être utilisée que pour certaines colonnes, tu dois les définir dans le Else.
A+
Re: [Calc]Obliger type de caractère
Publié : 21 oct. 2017 12:18
par Daniel60
Merci Piaf, j'ai didouillé mon document en copiant des macro sur mes anciens documents, je ne puis donc vous dire qui en est le créateur, peut-être pourriez-vous me renseigner?
J'ai donc copier votre macro mais rien ne se passe les nom restent en minuscule
Tableau.ods
Re: [Calc]Obliger type de caractère
Publié : 21 oct. 2017 12:56
par Piaf
Re
Daniel60 a écrit :J'ai donc copier votre macro mais rien ne se passe les nom restent en minuscule
Pas vu la modification dans ton fichier.
Daniel60 a écrit :qui en est le créateur, peut-être pourriez-vous me renseigner?
A mon avis il s'agit d'
alhazred.
A+
Re: [Calc]Obliger type de caractère
Publié : 21 oct. 2017 13:17
par Daniel60
Merci piaf
voici la macro que je viens d'ajouter
Code : Tout sélectionner
[code]'-----------------------------------------------------------------------
'ECRIRE LE NOM DANS LA COLONNE D en MAJUSCULES
Function NomPropre(oTexte As String) As String
Dim oCalc
oCalc = CreateUnoService("com.sun.star.sheet.FunctionAccess")
NomPropre = oCalc.callFunction("PROPER", array(oTexte))
End Function
'-------------------------------------------------------------------------------------------------------------------
[/code]
Et voici mon tableau
Tableau02.ods
Peut-être y a(t(il un formatage particulier des cellule à faire?
Pour le créateur OUI en effet il me semble que ce soit alhazred
Re: [Calc]Obliger type de caractère
Publié : 21 oct. 2017 13:55
par ThierryT
La fonction Calc PROPER ne permet de mettre que la première lettre des mots de la chaîne de caractères en majuscule.
Voir l'aide Wiki :
PROPER
returns text with words in lowercase after a capitalised first letter.
Syntax:
PROPER(text)
returns text with the first letter of each word capitalised, and other letters in lower case. More specifically, the first letter and any letter that follows a non-letter are capitalised.
Example:
PROPER("gooD morNINg")
returns Good Morning.
Pour mettre une chaîne de caractères en majuscule, il est nécessaire d'utiliser la fonction Calc UPPER.
Voir l'aide Wiki :
UPPER
Converts a text string to uppercase.
Syntax:
UPPER(text)
returns text with all characters converted to upper case.
Example:
UPPER("Good Morning")
returns GOOD MORNING
Re: [Calc]Obliger type de caractère
Publié : 21 oct. 2017 14:22
par Daniel60
Bonjour Thierry
Merci pour l'explication
J'ai donc modifier la macro
Code : Tout sélectionner
Sub Main
MiseEnMajuscule("D6")
End Sub
Function MiseEnMajuscule(NomDeCellule as String) As String
Dim MonDoc as Object, oCalc as Object, oTexte as String
MonDoc = ThisComponent
oTexte = MonDoc.Sheets(0).getCellRangeByName(NomDeCellule).String
oCalc = CreateUnoService("com.sun.star.sheet.FunctionAccess")
MonDoc.Sheets(0).getCellRangeByName(NomDeCellule).String = oCalc.callFunction("UPPER", array(oTexte))
End Function
Mais rien ne se passe dans la cellule D6
Tableau.ods
Re: [Calc]Obliger type de caractère
Publié : 21 oct. 2017 14:43
par ThierryT
Que veut dire "rien ne se passe" ?
Si dans la cellule D6, j'ai le texte "titi", après exécution de la procédure Main, dans la cellule D6, j'obtiens bien "TITI".
La fonction MiseEnMajuscule fonctionne bien.
Ceci avec les différentes versions de LO et AOO de ma signature.
Après modifications de ton fichier voilà les résultats obtenus en tapant dans tous les champs texte du dialogue que des minuscules.
Capture.PNG
Re: [Calc]Obliger type de caractère
Publié : 21 oct. 2017 16:29
par Daniel60
Mercy Thierry
Par contre pour mettre plusieurs cellule en majuscule je dois modifier la macro?
Code : Tout sélectionner
Sub Main
MiseEnMajuscule("D6")
End Sub
De cette manière
[code]Sub Main
MiseEnMajuscule("D6","C6","I6")
End Sub
Re: [Calc]Obliger type de caractère
Publié : 21 oct. 2017 16:42
par ThierryT
Il suffit de modifier la procédure suivante en intégrant un select case :
Code : Tout sélectionner
Sub WriteToRowNumber(n As Integer)
Dim control As Object, column As Integer, cell As Object, theDate As Long
''----------------------------------------------------------------------------------------------------------------
For column=firstColumn To lastColumn
cell=theSheet.GetCellByPosition(column,n)
control=theControls(column)
'on distingue les types de contrôle
With control
If .SupportsService(listControl) Then
cell.string=.SelectedItem
ElseIf .SupportsService(dateControl) Then
WriteDate control,cell
Else
Select Case column
Case 2, 3, 8 ' Colonnes C, D, I
cell.string = MiseEnMajuscule(.text)
Case Else
cell.string = NomPropre(.text)
End Select
End If
End With
Next column
theDialog.EndExecute
End Sub
Re: [Calc]Obliger type de caractère
Publié : 21 oct. 2017 16:43
par Piaf
Re
J'apprécie toujours autant la mauvaise fois
Daniel60 a écrit :Pour le créateur OUI en effet il me semble que ce soit alhazred
Dans son fichier il me semble également qu'il avait donné des consignes à respecter pour qu'une adaptation puisse fonctionner. Ce qui n'est pas le cas de ton fichier.
Quel est l'intérêt d'utiliser la fonction Calc UPPER alors qu'il suffit d'utiliser directement la fonction UCase du basic.
Daniel60 a écrit :Par contre pour mettre plusieurs cellule en majuscule
Piaf a écrit :Si la fonction ne dois être utilisée que pour certaines colonnes, tu dois les définir dans le Else
Daniel60 a écrit : le nom en majuscule et le prénom, uniquement la première lettre en majuscule
Et donc en fonction de la colonne utiliser l'une ou l'autre fonction.
Ajout : Encore une fois à la bourre |
A+