Macro

Résolu
Mark -  
Marrk Messages postés 2 Statut Membre -
Bonjour,
Voici mon problème:
J'ai des tableaux avec en ligne des numéro d'article et en tête de colonnes des pays, dans le tableau ce sont des pourcentage.
je voudrais pour chaque article, renvoyer le nom des pays pour lesquels le pourcentage n'est pas nul.

Pouvez vous m'aider?
Merci d'avance.

6 réponses

  1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    Bonjour,
    Cette procédure, si la feuille NonNuls n'existe pas, va la créer, si elle existe, son contenu sera effacé, et va y stocker ce que tu suhaites.
    Exécution pour 20 000 lignes en 5,15 secondes...

    Option Explicit
    
    Sub RenvoieNonNuls()
    Dim MaFeuil As Worksheet, DrLig As Long, DrCol As Integer
    Dim Donnees(), Col As Integer, Lig As Long, CptCol As Integer
    '!!!IMPORTANT :
        '!!!La feuille active DOIT être la feuille qui contient toutes les données
    Set MaFeuil = ActiveSheet
    'Si dans le classeur, il existe une feuille appelée "NonNuls" Alors
    If FeuilleExiste(ThisWorkbook, "NonNuls") Then
        'On supprime tout ce qu'elle contient
        With Sheets("NonNuls")
            .Cells.Clear
        End With
    'Si elle n'existe par
    Else
        'on la créé
        Sheets.Add
        ActiveSheet.Name = "NonNuls"
    End If
    With MaFeuil
        DrLig = .Range("A" & Rows.Count).End(xlUp).Row
        DrCol = .Cells(1, Cells.Columns.Count).End(xlToLeft).Column
        Donnees = .Range(.Cells(1, 1), .Cells(DrLig, DrCol))
    End With
    With Sheets("NonNuls")
        For Lig = LBound(Donnees) + 1 To UBound(Donnees)
            CptCol = 2
            .Cells(Lig - 1, 1) = Donnees(Lig, 1)
            For Col = LBound(Donnees, 2) + 1 To UBound(Donnees, 2)
            'Debug.Print Donnees(Lig, Col) & " " & Lig & " " & Col
                If Donnees(Lig, Col) <> "" Or Donnees(Lig, Col) <> 0 Then
                    .Cells(Lig - 1, CptCol) = Donnees(1, Col)
                    CptCol = CptCol + 1
                End If
            Next
        Next
    End With
    End Sub
    
    Function FeuilleExiste(wk As Workbook, stFeuille) As Boolean
     On Error Resume Next
     FeuilleExiste = Not (wk.Sheets(stFeuille) Is Nothing)
    End Function
    0
  2. Mark
     
    Bonjour,

    le programme ne me renvoie pas la bonne donnée, il renvoie toute la première colonne c'est à dire tous les numéro article mais pas les pays.
    0
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      Bonjour,

      Dans ce code j'ai supposé que la ligne d'entêtes de colonne est la ligne 1. Est ce le cas?
      Dans tous les cas de figure, je vais avoir besoin d'un fichier exemple...
      0
  3. Mark
     
    Okok faut sans doute que je m'inscrive pour ajouter un document..
    0
    1. mcou
       
      Bonjour, utilisez cjoint.com ;)
      0
  4. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  5. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    Ok ok, une vulgaire erreur Or au lieu de And...
    J'ai ajouté un tyest pour éviter d'inscrire "Total général", et ça donne :
    Option Explicit
    
    Sub RenvoieNonNuls()
    Dim MaFeuil As Worksheet, DrLig As Long, DrCol As Integer
    Dim Donnees(), Col As Integer, Lig As Long, CptCol As Integer
    '!!!IMPORTANT :
        '!!!La feuille active DOIT être la feuille qui contient toutes les données
    Set MaFeuil = ActiveSheet
    'Si dans le classeur, il existe une feuille appelée "NonNuls" Alors
    If FeuilleExiste(ThisWorkbook, "NonNuls") Then
        'On supprime tout ce qu'elle contient
        With Sheets("NonNuls")
            .Cells.Clear
        End With
    'Si elle n'existe par
    Else
        'on la créé
        Sheets.Add
        ActiveSheet.Name = "NonNuls"
    End If
    With MaFeuil
        DrLig = .Range("A" & Rows.Count).End(xlUp).Row
        DrCol = .Cells(1, Cells.Columns.Count).End(xlToLeft).Column
        Donnees = .Range(.Cells(1, 1), .Cells(DrLig, DrCol))
    End With
    With Sheets("NonNuls")
        For Lig = LBound(Donnees) + 1 To UBound(Donnees)
            CptCol = 2
            .Cells(Lig - 1, 1) = Donnees(Lig, 1)
            For Col = LBound(Donnees, 2) + 1 To UBound(Donnees, 2)
            Debug.Print Donnees(1, Col)
                If Donnees(Lig, Col) <> "" And Donnees(Lig, Col) <> 0 And Donnees(1, Col) <> "Total général" Then
                    .Cells(Lig - 1, CptCol) = Donnees(1, Col)
                    CptCol = CptCol + 1
                End If
            Next
        Next
    End With
    End Sub
    
    Function FeuilleExiste(wk As Workbook, stFeuille) As Boolean
     On Error Resume Next
     FeuilleExiste = Not (wk.Sheets(stFeuille) Is Nothing)
    End Function
    --
    Cordialement,
    Franck P
    0
  6. Marrk Messages postés 2 Statut Membre
     
    Ok Parfait!! Merci beaucoup!
    0