Commentaires

  1. Avatar de rawsrc
    • |
    • permalink
    Salut,

    j'ai voulu vérifier ce que cette ventilation représentait en terme de code en PHP :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <?php
     
    $count  = $devises = ['500' => 0, '200' => 0, '100' => 0, '50' => 0, '20' => 0, '10' => 0, '5' => 0, '2' => 0, '1' => 0, '0.50' => 0, '0.20' => 0, '0.10' => 0, '0.05' => 0, '0.02' => 0, '0.01' => 0];
    $equipe = ['Dupont' => 4257.12, 'Durand' => 2024.78, 'Pierre' => 814.36];
     
    foreach ($equipe as $nom => $salaire) {
        $salaire *= 100;
        foreach ($devises as $d => &$nb) {
            $d         *= 100;
            $nb         = intdiv($salaire, $d);
            $salaire   -= $d * $nb;
            $count[$d] += $nb;      // nombre total de devises nécessaires [devise => nombre total]
        }
        $ventil[$nom] = $devises;   // [nom => [devise => nombre]]
    }
    Pour faciliter le truc, j'ai effectivement retenu la multiplication par 100

    Perso, je trouve que ça pique :
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for dico in employes.values():
        for t in dico["composition"]:
            for lst in devises_total:
  2. Avatar de JeitEmgie
    • |
    • permalink
    Pour le fun avec match_recognize :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select B7IDEN as c2, c3, c4, c5, c6 
    from (select * FROM TBB7 INNER JOIN TBB8 ON  B8IDEN = B7IDEN)
    match_recognize (
        partition by B7IDEN order by B8DTHR desc
        measures first(B7CPTE) c3, first(B8SEQN) c4, first(B8MONT) c5, first(B8DTHR) c6
        pattern( X+ )
        define X as 1 = 1
    )
    ;
  3. Avatar de danielhagnoul
    • |
    • permalink


    J'ai utilisé round() pour ne pas utiliser la multiplication par 100.

    Depuis, j'ai découvert que la solution pythonique au problème d'arrondi monétaire c'est decimal : https://docs.python.org/fr/3.7/library/decimal.html
  4. Avatar de bistouille
    • |
    • permalink
    Une autre méthode est de multiplier par 100 salaire et numéraire.

    Approche simpliste.

    Code python : 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
    NUMERAIRES = (
        500, 200, 100, 50, 20, 10, 5, 2, 1,
        0.5, 0.10, 0.05, 0.02, 0.01
    )
     
    def repartition_numeraires(montant) :
        montant *= 100
        nums = {}
        i = 0
        while montant :
            n, montant = divmod(montant, NUMERAIRES[i] * 100)
            nums[NUMERAIRES[i]] = int(n)
            i += 1
        return nums
     
    items = (
        ('Dupond', 4257.12),
        ('Durand', 2024.78),
        ('Pierre', 814.36),
    )
    employes = {}
    for nom, montant in items :
        employes[nom] = dict(
            salaire=dict(
                montant=montant,
                numeraires=dict.fromkeys(NUMERAIRES, 0),
            ),
        )
     
    for nom in employes :
        salaire = employes[nom]['salaire']
        num = repartition_numeraires(salaire['montant'])
        salaire['numeraires'].update(num)
     
    somme_salaires = round(
        sum(e['salaire']['montant'] for e in employes.values()),
        2
    )
    print('somme salaires :', somme_salaires)
     
    numeraires = dict.fromkeys(NUMERAIRES, 0)
    for e in employes.values() :
        for v in numeraires :
            numeraires[v] += e['salaire']['numeraires'][v]
     
    print(numeraires)
    somme_numeraires = round(sum(k * v for k, v in numeraires.items()), 2)
    print('somme numéraires :', somme_numeraires)
  5. Avatar de Abbbb
    • |
    • permalink
    Salut peut on discuter a propos des destructions de données numérique,merci
  6. Avatar de rawsrc
    • |
    • permalink
    Bonjour,

    Code source de PhpEcho mis à jour avec la nouvelle fonctionnalité : auto-génération et/ou définition d'un id d'exécution unique pour chaque instance de bloc.
    Pour les explications et un exemple concret d'utilisation, veuillez vous reporter au paragraphe 6.2.

    Bon code à tous
  7. Avatar de bouye
    • |
    • permalink
    Merci, je pensais qu'il s'agissait d'un soucis avec le lien dans ma news mais c'est en fait sur la page de garde de développez. Donc c'est du ressort de la rédaction / de l'équipe de publication et non pas du mien. Je vais transmettre au responsable de section.
  8. Avatar de CinePhil
    • |
    • permalink
    Citation Envoyé par Madmac
    À la base OpenSuse est intéressant pour faire ce genre de truc. Mais j'ai de plus en plus l'impression qu'ils nous prennent uniquement pour des Béta testeur. J'ai régulièrement des message qui me disent que j'ai 1500 mise-à-jour et des poussières à`faire. Ils ont même installé Leap15 sur mon grub. Et il n'y a pas de versions personnel de Suse.

    Je commence sérieusement me tourner vers Red Hat. J'adore Linux, mais j'ai besoin d'un système stable.
    J'utilise habituellement Mageia... depuis Mandrake 7 ; ça ne me rajeunit pas !

    Au boulot la quasi totalité de nos serveurs est sous OpenSuse et j'ai une relative habitude de cette distribution... en mode console.

    Pour mon serveur chez Kimsufi, Mageia n'était pas disponible, OpenSuse oui. J'ai donc naturellement opté pour OpenSuse.

    Red Hat fut ma première découverte de Linux, avant Mandrake. J'administre aussi deux serveurs OracleLinux au boulot. Cette distribution est une customisation de Red Hat par Oracle, en principe optimisée pour son SGBD Oracle Database. Nos premiers serveurs Oracle 11GR2 étaient sous Red Hat et en upgradant en Oracle 12, nous avons choisi de passer à OracleLinux qui est gratuit.
  9. Avatar de jcarbaut
    • |
    • permalink
    Je confirme le problème de lien :

    Sur la page https://java.developpez.com/ on a dans les actualités « Microsoft rejoint l'OpenJDK, la société derrière Windows contribue au développement du langage Java pour sa plateforme cloud Azure », avec pour url https://java.developpez.com/index/re...e-cloud-Azure/.
    Quand je clique, j'arrive sur une page d'erreur qui me dit « Vous n'avez pas les droits nécessaires pour accéder à cette page ».

    J'ai dû chercher le titre avec Google pour tomber sur l'url correct https://java.developpez.com/actu/282...e-cloud-Azure/.
  10. Avatar de danielhagnoul
    • |
    • permalink
    Bonsoir

    Superbe simplification de mon code, bravo !
    Merci d'avoir posté cette élégante solution.
  11. Avatar de bistouille
    • |
    • permalink
    En utilisant la méthode get des dictionnaires, tu peux améliorer et réduire tes deux fonctions.

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    def texte_vers_morse(texte):
        """Transforme un texte accentués, sans retour à la ligne, en morse"""
        texte = unicodedata.normalize('NFKD', texte).encode(
            'ASCII', 'ignore').decode('ASCII')
        morse = tuple(L2S.get(c.upper(), '') for c in texte)
        return ' '.join(morse)
     
    def morse_vers_texte(morse):
        """Transforme le code morse généré par texte_vers_morse() en texte ASCII"""
        lst = tuple(S2L.get(s, ' ') for s in morse.split(' '))
        return ''.join(lst)
  12. Avatar de MarcelG
    • |
    • permalink
    Salut Pierre,

    La déclaration de variables est pour moi, et je le mentionne souvent dans les discussions, fondamentale.

    Maintenant, il s'agit aussi, à mon avis, de bien effectuer cette déclaration.
    Je reprends souvent cet exemple des dictionnaires.

    En ayant activé la référence "Scripting.Runtime"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim dico as Scripting.Dictionary
    Le développeur peut ensuite bénéficier de l'IntelliSense, autrement dit des propriétés et méthodes afférant à la variable.

    Je sais qu'il y a sujet à discussion. Mais c'est mon avis.

    A plus tard.

    Marcel
  13. Avatar de MarcelG
    • |
    • permalink
    Très bien.

    Je prends note, en ayant mis à jour mon aide-mémoire (créé en 2009! ) dans sa partie "Feuilles".

    Merci et à bientôt.

    Marcel
  14. Avatar de Pierre Fauconnier
    • |
    • permalink
    Salut Marcel.

    Merci pour tes commentaires et questions. Je vais les prendre à l'envers, si tu veux bien, et d'abord répondre à ta dernière question: Pourquoi As Object et pas As Worksheet?

    Pour que la fonction puisse aussi être utilisée pour une feuille de graphique (Objet Chart) et éviter ainsi d'avoir deux fonctions, une qui traite la feuille de calcul et l'autre qui traite la feuille de graphique.

    Pour ce qui est des codes de Philippe, je ne peux pas les commenter en faisant abstraction de On Error puisque sans les On Error, les codes proposés ne sont pas fonctionnels et que perso, je ne veux pas utiliser les On Error dans ces cas.

    La dernière proposée, qui n'utilise pas de boucle et pas de gestion d'erreurs pourrait être intéressante, mais elle est limitée aux feuilles de calcul. Dès lors, chaud partisan de la systématisation dans mes codes, je préfère en utiliser une seule qui permet de tester une feuille quel que soit son type, de manière à ne pas encombrer mon module xlTools avec des fonctions presqu'identiques*, et de ne pas devoir me poser la question du type de la feuille.

    Je peux juste proposer une "fusion" de mes deux fonctions (celle qui renvoie la feuille et celle qui teste qu'elle existe), bien que je n'aime pas trop cette solution qui oblige à passer un objet même si l'on souhaite seulement tester l'existence de la feuille.

    Code vba : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Function SetSheetByName(Name As String, ByRef sh As Object, Optional wb As Workbook) As Boolean
      Dim Counter As Long
     
      Set sh = Nothing
      If wb Is Nothing Then Set wb = ActiveWorkbook
      Counter = 1
      Do While Counter <= wb.Sheets.Count And sh Is Nothing
        If StrComp(wb.Sheets(Counter).Name, Name, vbTextCompare) = 0 Then Set sh = wb.Sheets(Counter)
        Counter = Counter + 1
      Loop
      SetSheetByName = Not sh Is Nothing
    End Function

    Code vba : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Sub testSheet()
      Dim sh As Object
     
      If SetSheetByName("Feuil1", sh) Then
        Debug.Print sh.Name
      Else
        MsgBox "La feuille n'existe pas"
      End If
    End Sub




    * En son temps, j'avais aussi créé une fonction qui permettait de rechercher une feuille selon son name ou son codename. Elle traîne toujours dans mon module Tools (jétais moins organisé à l'époque... )

    Code vba : 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
    Function getSheetByName(Optional Name As String, Optional CodeName As String, Optional wb As Workbook) As Object
      Dim sh As Object
      Dim Counter As Long
     
      If Name <> "" Or CodeName <> "" Then
        If wb Is Nothing Then Set wb = ActiveWorkbook
        Counter = 1
        Do While Counter <= wb.Sheets.Count And getSheetByName Is Nothing
          If Name <> "" Then
            If StrComp(wb.Sheets(Counter).Name, Name, vbTextCompare) = 0 Then Set getSheetByName = wb.Sheets(Counter)
          Else
            If StrComp(wb.Sheets(Counter).CodeName, CodeName, vbTextCompare) = 0 Then Set getSheetByName = wb.Sheets(Counter)
          End If
          Counter = Counter + 1
        Loop
      End If
    End Function

    Elle s'appelle facilement avec les arguments nommés (que j'utilise très souvent dans mes codes, par ailleurs).

    Code vba : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub TestSheets()
      Debug.Print getSheetByName(Name:="Feuil2").CodeName
      Debug.Print getSheetByName(CodeName:="shTest").Name
    End Sub
  15. Avatar de MarcelG
    • |
    • permalink
    Dans les solutions précédentes, beaucoup - trop à mon goût - de gestions d'erreurs. Ce dont il faut user, certes, mais à bon escient. Personnellement, j'évite tant faire se peut.
    Cela dit, pas de sortie de bloc anticipée.

    Je mets donc ce billet dans mes priorités

    Ce tout en sachant que l'on peut, sauf erreur, obtenir, comme demandé la plupart du temps, une fonction booléenne sur getSheetByName = Nothing ou non.

    Du type:

    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
    Function ExisteFeuille(Name As String, Optional wb As Workbook) As Boolean
      
    Dim getSheetByName As Object
    Dim sh As Object
    Dim Counter As Long
    
    If wb Is Nothing Then Set wb = ActiveWorkbook
            Counter = 1
            Do While Counter <= wb.Sheets.Count And getSheetByName Is Nothing
            If StrComp(wb.Sheets(Counter).Name, Name, vbTextCompare) = 0 Then Set getSheetByName = wb.Sheets(Counter)
            Counter = Counter + 1
    Loop
    
    If getSheetByName Is Nothing Then
            ExisteFeuille = False
    Else
            ExisteFeuille = True
            Set getSheetByName = Nothing
    End If
    
    End Function
    Maintenant, je pose la question, Pierre.

    J'ai codé cette fonction en déclarant sh en Worksheet.
    La fonction reste bien effective. Une feuille étant un objet.

    Y a-t-il une raison à la déclaration initiale en Object?
    Il y a sans doute là des notions qui me sont étrangères.

    A plus tard.

    Bonne soirée.
    Mis à jour 20/11/2019 à 11h12 par MarcelG
  16. Avatar de MarcelG
    • |
    • permalink
    Salut Pierre,

    Sans flagornerie aucune.
    Intéressant

    A retenir en règle générale. Pas de Exit mais plutôt Do..While (ou Until sans doute)
    Si l'on m'y reprend (car je suis souvent tombé), une bière pour Marcel!

    Je reporte ci-dessous un extrait de mes aides-mémoires.
    (dont quelques liens de Philippe)
    Peut-être un avis? (les On Error, que tu mentionnes dans ton billet, mis à part)

    A plus tard.

    http://www.developpez.net/forums/d13...xcel-avec-vba/
    Function ExistSheet(Ws$, Optional Wb As Workbook) As Boolean
    If Wb Is Nothing Then Set Wb = ActiveWorkbook
    On Error Resume Next
    ExistSheet = IsObject(Wb.Sheets(Ws))
    End Function

    Voir les liens de Philippe Thulliez

    https://www.developpez.net/forums/d1.../#post10992616

    2 premières fonction = Philippe Thulliez

    Function IsSheetExist(SheetName As String, Optional Wkb As Workbook) As Boolean
    ' http://philippe.tulliez.be
    ' Renvoie True ou False
    ' Arguments
    ' SheetName (String) Nom de la feuille dont on teste l'existence
    ' [wkb] (Workbook) ThisWorkbook est le classeur par défaut
    Dim Sht As Worksheet
    If Wkb Is Nothing Then Set Wkb = ThisWorkbook
    On Error Resume Next
    Set Sht = Wkb.Sheets(SheetName)
    With Err
    If .Number Then .Clear Else IsSheetExist = True
    End With
    ‘--------------------------------

    http://philippe.tulliez.be/fonction-...s-un-classeur/

    Function IsSheetExist(Name As String) As Boolean
    ' Cette fonction renvoie TRUE si la feuille existe et FALSE dans le cas contraire
    ' Argument
    ' Name (String) - Nom de la feuille dont on teste l'existence
    On Error Resume Next
    IsSheetExist = Len(Sheets(Name).Name) > 0
    On Error GoTo 0
    End Function

    Function FeuilleExiste(NomFeuille) As Boolean
    Dim f As Object
    On Error Resume Next
    Set f = Sheets(NomFeuille)
    If Err = 0 Then FeuilleExiste = True
    Set f = Nothing
    End Function
    ‘--------------------------------
    http://www.mdf-xlpages.com/modules/s...q.php?faqid=40
    Function FeuilExiste(F As String) As Boolean
    On Error Resume Next
    FeuilExiste = Not Sheets(F) Is Nothing
    End Function
    ‘--------------------------------
    https://www.developpez.net/forums/d1...feuille-excel/
    Public Function WorkSheetExist(Sheetname As String) As Boolean

    On Error Resume Next
    WorkSheetExist = Sheets(Sheetname).Index
    End Function
    ‘--------------------------------
    Function sheetExists(Feuille) As Boolean ' Code Fait par Marc-L
    sheetExists = Evaluate("ISREF('" & Feuille & "'!A1)")
    End Function
    ‘‘--------------------------------
    Mis à jour 19/11/2019 à 22h01 par MarcelG
  17. Avatar de froggystar69
    • |
    • permalink
    Merci bcp pour cette info.

    J'ai un petit soucis lors du lancement du code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set objMsg = Application.CreateItem(olMailItem)
    avec une erreur "Propriété ou méthode non géré..."

    Auriez vous une idée ?

    EXCEL 2013

    En vous remerciant

    CDT

    Froggy
  18. Avatar de bouye
    • |
    • permalink
    Citation Envoyé par ionel.cerp
    Quand on clique sur le lien, on ne peut pas lire l'article directement.
    Aucun soucis pour moi.
  19. Avatar de ionel.cerp
    • |
    • permalink
    Quand on clique sur le lien, on ne peut pas lire l'article directement.
  20. Avatar de Beginner.
    • |
    • permalink
    Salut,

    Je viens de voir ton billet...

    Et oui ce n'est pas forcément évident à faire pour un débutant...

    Je note l'usage de la fonction trunc : quotient = trunc(n / 16)...

    J'avais vu il y a quelques temps que la division entière pouvait aussi se faire avec l'opérateur // : quotient = n // 16...

    Je ne connais pas encore zip, il faudra que je regarde ça...