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.



A voir également:

6 réponses

pijaku Messages postés 13513 Statut Modérateur 2 763
 
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
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
pijaku Messages postés 13513 Statut Modérateur 2 763
 
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
Mark
 
Okok faut sans doute que je m'inscrive pour ajouter un document..
0
mcou
 
Bonjour, utilisez cjoint.com ;)
0
Marrk Messages postés 2 Statut Membre
 
https://www.cjoint.com/?0HdjGV8ITFq

Voila. Merci de votre aide.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
pijaku Messages postés 13513 Statut Modérateur 2 763
 
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
Marrk Messages postés 2 Statut Membre
 
Ok Parfait!! Merci beaucoup!
0