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] Image 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 :roll:
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 :twisted:
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 :lol: 
A+