IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenOffice & LibreOffice Discussion :

Macro: colorer une ligne sur condition dans une macro?


Sujet :

OpenOffice & LibreOffice

  1. #1
    Membre actif

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2011
    Messages
    371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 371
    Points : 276
    Points
    276
    Par défaut Macro: colorer une ligne sur condition dans une macro?
    Bonjour,

    J'ai ne liste d'IBAN que je vérifie. Je peux sélectionner la cellule et la mettre en rouge si l'iban est mauvais.
    Je voudrais non seulement colorier la cellule mais aussi la ligne.
    Comment faire?

    PS: je n'ai pas tout mis pour faire plus simple. Les déclaration fonctionnent bien. Je veux donc remplacer le petit bout de code suivant par le code qui va bien.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    oIbanEvent.CellBackColor =  RGB(255,0,0)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    monDocument = ThisComponent
    lesFeuilles = monDocument.Sheets
    maFeuille = lesFeuilles.getByName("csv70043")
    'maFeuille = lesFeuilles.getByName("Iban incorrecte")
    'Cherche la dernière ligne et se positionne dessus
    finligne ()
    'Met toutes les infos de la Cellule ùans la variable sel
    sel=thisComponent.currentSelection
    'Stoque dans NumLigneFin la position de la dernière colonne. 
    NumFin = sel.CellAddress.Row
    'Affichage de la boite avec barre de progression.
    DialogLibraries.LoadLibrary( "Standard" )
    boiteAttente = CreateUnoDialog(DialogLibraries.Standard.Dialog1)
    boiteAttente.setVisible(True) ' affiche la fenêtre de la barre de progression
    	for z=51 to NumFin
     
    	iban = maFeuille.getCellByPosition(27, z)
     
    	CtrlIban (iban)
     
    	pourcent = (z * 100 / NumFin)
    	boiteAttente.getControl("ProgressBar1").value= pourcent
    	'boiteAttente.dispose 'ferme la fenêtre de la barre de progressio
    	next
    End sub
     
    function CtrlIban( oIbanEvent as object)
    ' François GATTO - 2005-2009 (adaptation pour OOoBase)
    Dim numCompte As String, numIban As String, checkDigit As String
    Dim isoValue As Variant, sMid As Variant, ncpte
    Dim msg As Variant, Cpte As Variant, c As Variant, mdlo As Variant
    Dim i As Integer, l As Integer, lc As Integer, x As Integer
    Dim LibPays As String
    Dim oForm As Object
     
    'oForm = oIbanEvent.Source.Model.Parent
    'msg = "" : numCompte = "" : numIban = ""
     
    numCompte = oIbanEvent.string
    numCompte = UCase(numCompte)
    l = len(numCompte)
     
    If l < 1 OR l > 34 Then
    	'MsgBox("Saisie N° IBAN invalide", IconErr, SaisieErr)
    	'oIbanEvent.CellBackColor =  RGB(255,141,56)
    	oIbanEvent.CellBackColor =  RGB(255,0,0)
    	goto sortiedefonction
    	'exit Function
    End If
    Merci

  2. #2
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 043
    Points : 9 452
    Points
    9 452
    Par défaut
    hello,
    pour colorer la ligne, tu peux utiliser un code du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	x =  oIbanEvent.CellAddress.Row  // on récupère la ligne  en cours
         y =  oIbanEvent.CellAddress.Column // on récupère la colonne de la cellule
        // on crée une plage de cellule partant de la colonne 0 à la colonne de la cellule sur la ligne en cours
        CellRange = ThisComponent.getCurrentController.getActiveSheet.getCellrangeByPosition(0,x,y,x)
       // on colore  les cellules de la plage
        CellRange.CellBackColor = RGB(255,0,0)
    Ami calmant, J.P

  3. #3
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 043
    Points : 9 452
    Points
    9 452
    Par défaut
    A titre indicatif pour montrer que l'on peut utiliser le python pour ses macros sous LibreOffice voici une macro en python qui écrit des IBAN dans un classeur Calc et qui vérifie la validité des IBAN. :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    #   exemple de macro python pour libreoffice
    #   macro en : C:\Users\<nom du user>\AppData\Roaming\LibreOffice\4\user\Scripts\python\testIban.py
    #   Outils/Macros/Gérer les Macros/Python  Mes Macros/testIBan   exécuter test_valid_iban
    #   testé avec Libreoffice 4.3 sous WINDOWS 7
    #   J.P  décembre 2014
    #
    import re
     
    _country2length = dict(
        AL=28, AD=24, AT=20, AZ=28, BE=16, BH=22, BA=20, BR=29,
        BG=22, CR=21, HR=21, CY=28, CZ=24, DK=18, DO=28, EE=20,
        FO=18, FI=18, FR=27, GE=22, DE=22, GI=23, GR=27, GL=18,
        GT=28, HU=28, IS=26, IE=22, IL=23, IT=27, KZ=20, KW=30,
        LV=21, LB=28, LI=21, LT=20, LU=20, MK=19, MT=31, MR=27,
        MU=30, MC=27, MD=24, ME=22, NL=18, NO=15, PK=24, PS=29,
        PL=28, PT=25, RO=24, SM=27, SA=24, RS=22, SK=24, SI=19,
        ES=24, SE=24, CH=21, TN=24, TR=26, AE=23, GB=22, VG=24 )
     
    def valid_iban(iban):
        # Ensure upper alphanumeric input.
        iban = iban.replace(' ','').replace('\t','')
        if not re.match(r'^[\dA-Z]+$', iban): 
            return False
        # Validate country code against expected length.
        if len(iban) != _country2length[iban[:2]]:
            return False
        # Shift and convert.
        iban = iban[4:] + iban[:4]
        digits = int(''.join(str(int(ch, 36)) for ch in iban)) #BASE 36: 0..9,A..Z -> 0..35
        return digits % 97 == 1
     
    def test_valid_iban( ):
        """on ecrit des IBAN en cellules A:1 et A:2 on les teste si non valide on le met en rouge"""
    #get the calc from the scripting context which is made available to all scripts
        desktop = XSCRIPTCONTEXT.getDesktop()
        calc = desktop.getCurrentComponent()
        sheet = calc.getSheets().getByIndex(0) #1ere feuille du classeur
        sheet.getCellByPosition(0, 0).setString("GB82 WEST 1234 5698 7654 32") # On écrit un IBAN valide en cellule A:1
        sheet.getCellByPosition(0, 1).setString("GB82 TEST 1234 5698 7654 32") # On écrit un IBAN non valide en cellule A:2
        # on balaie les lignes pour tester les IBAN
        for i in range(0,2):
             ibanIsValid = valid_iban(sheet.getCellByPosition(0, i).getString())
             if ibanIsValid:
                sheet.getCellByPosition(0, i).setPropertyValue( "CharColor", 0x000000 ) # Police en noir
             else:
                sheet.getCellByPosition(0, i).setPropertyValue( "CharColor", 0xff0000 ) # Police en rouge
        return None
    Attention le langage python est sensible aux indentations et au codage des accents. Ne pas faire de copier coller du code dans un éditeur. Utiliser le fichier en pièce jointe
    Fichiers attachés Fichiers attachés

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Fonctionnaire
    Inscrit en
    Septembre 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fonctionnaire

    Informations forums :
    Inscription : Septembre 2015
    Messages : 9
    Points : 8
    Points
    8
    Par défaut
    hum désolé de remonter le poste mais serait-il possible de faire une macro en sélectionnant une plage qui sera coloré en cliquant sur un bouton qui exécutera la macro ?

  5. #5
    Membre actif

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2011
    Messages
    371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2011
    Messages : 371
    Points : 276
    Points
    276
    Par défaut
    Bonjour streaper2,

    Deux chose:
    Peux tu ouvrir un nouveau file?
    Je ne suis pas sur d'avoir compris ta question. Peux tu la reformuler?
    Veux tu que ta macro facce ceci dans l'ordre?
    1. Selectionne une plage
    2. Colorie la plage en cliquant sur un bouton


    Accessoirement, cette fonctionnalité existe déjà en natif dans OpenOffice (Selection de plage + choix de la couleur à appliquer).


    Cordialement,
    Vandman

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Fonctionnaire
    Inscrit en
    Septembre 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fonctionnaire

    Informations forums :
    Inscription : Septembre 2015
    Messages : 9
    Points : 8
    Points
    8
    Par défaut
    Merci Vandman, j'ai trouvé un code que j'ai adapté a mon problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    sub test
    oActivecell = ThisComponent.getCurrentController().getSelection()
    oActivecell1 = ThisComponent.getCurrentController().getSelection()
    oActiveSheet=oActivecell.getSpreadSheet
    Address=oActivecell.RangeAddress
    colonne=Address.StartColumn
    while colonne<=Address.EndColumn
    ligne=Address.StartRow
    while ligne<=Address.EndRow
    ligne=ligne+1
    oActivecell.CellbackColor = RGB(255,255,0)
    wend
    colonne=colonne+1
    oActivecell.CellbackColor = RGB(255,255,0)
    wend
    end sub

Discussions similaires

  1. Faire la somme d'une ligne sur 2 dans une matrice
    Par DJEcalcul dans le forum MATLAB
    Réponses: 2
    Dernier message: 02/05/2014, 18h38
  2. Réponses: 1
    Dernier message: 26/12/2010, 21h20
  3. colorer une ligne sur deux dans une listbox
    Par Didpa dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 31/08/2010, 13h59
  4. [XL-2007] Probléme pour séléctionner une ligne sur trois dans une colonne
    Par ro31hg dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/02/2010, 20h48
  5. Garder une ligne sur 5 dans une matrice
    Par benoitbs dans le forum MATLAB
    Réponses: 2
    Dernier message: 04/12/2008, 13h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo