Macro

Résolu/Fermé
Mark - 2 août 2012 à 11:32
Marrk Messages postés 2 Date d'inscription vendredi 3 août 2012 Statut Membre Dernière intervention 3 août 2012 - 3 août 2012 à 09:55
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 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 750
2 août 2012 à 12:09
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
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 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 750
3 août 2012 à 08:47
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
Okok faut sans doute que je m'inscrive pour ajouter un document..
0
Bonjour, utilisez cjoint.com ;)
0
Marrk Messages postés 2 Date d'inscription vendredi 3 août 2012 Statut Membre Dernière intervention 3 août 2012
3 août 2012 à 09:33
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 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 750
3 août 2012 à 09:41
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 Date d'inscription vendredi 3 août 2012 Statut Membre Dernière intervention 3 août 2012
3 août 2012 à 09:55
Ok Parfait!! Merci beaucoup!
0