[RÉSOLU] [VBA] - Ttraitement des données importées depuis un CSV

grhum29

XLDnaute Junior
Bonjour,
Je travaille actuellement sur la mise en place d'un fichier Excel qui me permet d'importer un fichier CSV depuis un userform (userform1) dans une feuille de mon fichier. Une fois ce fichier intégré, je traite les informations du fichier importé :

1 - Dans la colonne I, je récupère les noms uniques des conducteurs et dans la colonne J, Je compte le nom de fois que chaque nom apparait.

=> Et c'est là que mon 1er problème apparait car dans la colonne J, j'applique ma formule de calcul mais j'ai créé des variables uniquement pour les 3 premieres personnes mais s'il y en a plus, je ne sais pas trop comment m'y prendre...
Pour reproduire, il faut aller sur le userform (s’ouvre à l’ouverture du fichier ou à partir de l’onglet interface) et cliquer sur Import CSV du bloc « Nb dépassement de vitesse » et choisir le fichier csv qui se trouve en PJ.


2 - Ensuite, je fais apparaitre un 2ème userform (userform2) afin de pouvoir renseigner le nombre de kilomètres réalisés sur la période pour chaque personne (données intégrées dans la colonne L). Ceci me sert ensuite à faire un calcul pour rapporter les nombres présents dans la colonne J pour 1000 Kms parcourus (données intégrées dans la colonne M).
Grâce à cela, j’établis un classement en fonction du nombre de dépassements / 1000 Kms parcourus (colonne M) :

=> Et c'est là que mon 2ème problème apparait car j’utilise la fonction RANG (ex : =RANG(M7;M$5:M$34;1)) mais j’ai également un nombre aléatoire de conducteur à classer donc avec ma formule j’ai des erreurs qui m’indiquer qu’il y a des données manquantes pour effectuer le calcul…
=> Comment est ce que je peux faire pour que le classement s’affiche en fonction du nombre de personnes à classer et non pas en fonction du nombre de lignes ?


Pouvez-vous m’aider sur ces 2 points ?

Et si vous avez d’autres conseils par rapport au code que j’ai mis en place, je suis preneur. Je suis conscient que ce code n’est pas forcément super car j’ai souvent utilisé du code généré automatiquement à partir de macro test que j’ai faite à coté pour réussir a faire ce que je voulais.

Merci de votre aide.

Jérôme.
 

Pièces jointes

  • CR.zip
    54.5 KB · Affichages: 19
  • CR.zip
    54.5 KB · Affichages: 19
  • CR.zip
    54.5 KB · Affichages: 24
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : [VBA] - Ttraitement des données importées depuis un CSV

Bonjour.

Pour le 1er problème déjà :
VB:
'--------------------
'Début calcul - Nb.si
'Calcul du nombre de fois que chaque chauffeur a dépassé la vitesse de 74 Km/h sur au moins 30 secondes.
'--------------------
Dim PlgRé As Range, LFinD As Long
Set PlgRé = Feuil7.[I5].Resize(Feuil7.[I65000].End(xlUp).Row - 4, 6)
LFinD = Feuil7.[B65000].End(xlUp).Row
PlgRé.Columns(2).FormulaR1C1 = "=COUNTIF(R5C2:R" & LFinD & "C2,RC9)"
'------------------
'Fin calcul - Nb.si
'------------------
 

grhum29

XLDnaute Junior
Re : [VBA] - Ttraitement des données importées depuis un CSV

Bonjour Dranreb,

Tout d'abord, merci de ta réponse.

Elle répond parfaitement à ma demande pour le point n° 1.

Si je comprends bien, je peux me servir du même genre de code pour mon problème N°2?

En plus du point 2 de mon premier post, j'ai une question supplémentaire concernant l'insertion des noms des personnes dans le userform2.
Actuellement j'utilise ce genre de code pour les récupérer :
UserForm2.Label1.Caption = Range("I5").Value
UserForm2.Label2.Caption = Range("I6").Value
UserForm2.Label3.Caption = Range("I7").Value
UserForm2.Label4.Caption = Range("I8").Value
UserForm2.Label5.Caption = Range("I9").Value
UserForm2.Label6.Caption = Range("I10").Value
UserForm2.Label7.Caption = Range("I11").Value

Seulement ceci permet de récupérer uniquement 7 noms mais pas plus d'autant plus que j'ai créé que 7 zones "Intitulés"...

Comment est-ce que je peux faire pour créer autant de zones qu'il y a de personnes selon les cas? Et pour récupérer les noms dans les X zones "Intitulés" créées ?

Le même problème se pose ensuite quand je veux insérer dans la feuille Excel (colonne L) les kilomètres saisis dans le Userform2.

Voici le code que j'utilise actuellement :

Range("L5") = Me.TextBox2.Value
Range("L6") = Me.TextBox3.Value
Range("L7") = Me.TextBox4.Value
Range("L8") = Me.TextBox5.Value
Range("L9") = Me.TextBox6.Value
Range("L10") = Me.TextBox7.Value
Range("L11") = Me.TextBox8.Value

Cordialement,

grhum29.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : [VBA] - Ttraitement des données importées depuis un CSV

Oui, tout à fait. C'est bien d'avoir vu ça.
Entre autres dans la suite :
VB:
PlgRé.Columns(6).FormulaR1C1 = "=RANK(RC13,R5C13:R" & PlgRé.Row + PlgRé.Rows.Count - 1 & "C13,1)"
 

Paf

XLDnaute Barbatruc
Re : [VBA] - Ttraitement des données importées depuis un CSV

Bonjour grhum29, Dranreb


Comment est-ce que je peux faire pour créer autant de zones qu'il y a de personnes selon les cas? Et pour récupérer les noms dans les X zones "Intitulés" créées ?

Le même problème se pose ensuite quand je veux insérer dans la feuille Excel (colonne L) les kilomètres saisis dans le Userform2.

ci dessous le code du userform2,( tous les labels et textbox doivent être supprimés).

en tête de module
Code:
Dim NbChauffeur As Integer



Code:
Private Sub UserForm_Activate()
 Dim MonLabel As Control, MaBox As Control
 Dim DerLig As Integer

 With Worksheets("Nb_depassement_vitesse")

 DerLig = .Range("I" & Rows.Count).End(xlUp).Row
 NbChauffeur = DerLig - 4

 For i = 1 To NbChauffeur
 'création des labels et box
    Set MonLabel = Me.Controls.Add("Forms.label.1")
    Set MaBox = Me.Controls.Add("Forms.Textbox.1")
    MonLabel.Name = "Lab" & i
    MaBox.Name = "TextBox" & i
    MonLabel.Caption = .Range("I" & i + 4)
    
 'positionnement des labels et box à adapter
    MonLabel.Left = 18
    MonLabel.Top = i * 25
    MonLabel.Width = 75
    MonLabel.Height = 20
    MaBox.Left = 118
    MaBox.Top = i * 25
    MaBox.Width = 75
    MaBox.Height = 20
 Next

 End With
End Sub

Code:
Private Sub CommandButton1_Click()

 Dim i As Integer

 For i = 1 To NbChauffeur
    Worksheets("Nb_depassement_vitesse").Range("L" & i + 4) = Val(Me.Controls("TextBox" & i))
 Next

 Unload UserForm2
    
End Sub

A+
 

grhum29

XLDnaute Junior
Re : [VBA] - Ttraitement des données importées depuis un CSV

Bonjour Paf et Dranreb,

Je vais commencer par vous remercier car votre aide m'a permis de faire exactement ce que je voulais.

J'ai encore quelques points sur lesquels je bloque et je ne sais pas trop comment m'y prendre :

1 - Je me sert du code ci-dessous pour calculer le nombre de dépassement de vitesse par personne pour 1000 Kms.

Le problème est que je répète ce bloc X fois, et je suis bien conscient que ce n'est pas propre.

J'ai essayé de me servir du code que Dranreb m'a donné et de l'adapter mais je n'y suis pas parvenu. Je ne sais pas comment écrire la formule.

Range("M5").Select
If Range("I5").Value <> "" Then
ActiveCell.FormulaR1C1 = "=(RC[-3]*1000)/RC[-1]"
Range("M5").Select
End If


Range("M6").Select
If Range("I6").Value <> "" Then
ActiveCell.FormulaR1C1 = "=(RC[-3]*1000)/RC[-1]"
Range("M6").Select
End If

J'ai réussi à réutiliser le code de Dranreb pour d'autres usages mais j'ai du mal à tout comprendre :

Dim PlgRé As Range, LFinD As Long
Set PlgRé = Feuil7.[I5].Resize(Feuil7.[I65000].End(xlUp).Row - 4, 6)
LFinD = Feuil7.[B65000].End(xlUp).Row
PlgRé.Columns(2).FormulaR1C1 = "=COUNTIF(R5C2:R" & LFinD & "C2,RC9)"

=> A la ligne 2, je ne vois pas à quoi correspond -4, 6
=> A la ligne 4, à quoi correspond le (2)

Dans la colonne O, j'ai réutiliser ce code (en bidouillant) afin d'attribuer une note pondérée selon un coefficient :

Dim PlgRé3 As Range, LFinD3 As Long
Set PlgRé3 = Feuil7.[N5].Resize(Feuil7.[N65000].End(xlUp).Row - 4, 6)
LFinD3 = Feuil7.[O65000].End(xlUp).Row
PlgRé3.Columns(2).FormulaR1C1 = "=(RC14*0.5)"


Dans ce code, j'ai du mal à comprendre le RC14 que j'ai mis dans la formule malgré le fait que ça marche. Pouvez-vous m'expliquer?


2 - Ensuite, mon interrogation suivante est que dans ce classeur, je vais intégrer d'autres exports CSV dans différentes feuilles de mon classeur pour en tirer également un classement.

Une fois ceci fait, je souhaite faire une synthèse de tout cela sur une même feuille nommée "Synthèse" par exemple avec en colonne le nom des chauffeurs et les notes attribuées dans chacune des autres feuilles.

Soit en synthétisant tout dans un même tableau ou soit en faisant X tableaux différents sur la feuille "Synthèse"...

Pouvez-vous m'aiguiller sur la façon de faire cela?

Ps : Je vous remet en pièce jointe le fichier CSV et le fichier Excel.

Merci de votre aide.

Bonne journée.

grhum29
 

Pièces jointes

  • CR.zip
    58.5 KB · Affichages: 27
  • CR.zip
    58.5 KB · Affichages: 15
  • CR.zip
    58.5 KB · Affichages: 29

Dranreb

XLDnaute Barbatruc
Re : [VBA] - Ttraitement des données importées depuis un CSV

Bonjour.
je ne vois pas à quoi correspond -4, 6
4 est le nombre de lignes qui précèdent la 5 et donc dont il faut diminuer le numéro de ligne de la dernière cellule renseignée de la colonne I pour obtenir le nombre de lignes que je veux considérer à partir de la cellule I5.
6 c'est le nombre de colonnes que je veux considérer. Mais vous devrez peut être mettre 7, maintenant.
à quoi correspond le (2)
parce que c'est la 2ième colonne dans la plage précédemment définie, soit la colonne J

Pour la suite je ne comprend pas pourquoi vous ne réutilisez pas la PlgRé telle qu'il est, en ayant juste pris jusqu'à 7 colonnes.
 

grhum29

XLDnaute Junior
Re : [VBA] - Ttraitement des données importées depuis un CSV

Bonsoir Dranreb,

J'ai compris pour le point n°1 et j'ai réussi à me débrouiller pour solutionner mon problème... Merci pour les explications qui m'ont bien éclairé...

Il me reste le point 2 sur lequel je n'arrive pas à avancer. Si quelqu'un pouvait m'aiguiller et m'expliquer comment je peux faire...

Bonne soirée.

grhum29.
 

Dranreb

XLDnaute Barbatruc
Re : [VBA] - Ttraitement des données importées depuis un CSV

Comme déjà dit vous continuez à la suite pour toutes les colonne où vous voulez mettre des formules :
VB:
Dim PlgRé As Range, LFinD As Long
Set PlgRé = Feuil7.[I5].Resize(Feuil7.[I65000].End(xlUp).Row - 4, 6)
LFinD = Feuil7.[B65000].End(xlUp).Row
PlgRé.Columns(2).FormulaR1C1 = "=COUNTIF(R5C2:R" & LFinD & "C2,RC9)"
PlgRé.Columns(3).FormulaR1C1 = "=RC14*0.5"
PlgRé.Columns(4).FormulaR1C1 = "=RANK(RC13,R5C13:R" & PlgRé.Rows.Count + 4 & "C13,1)"
(Non testé: je n'ai plus le classeur ni le code sous les yeux)
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : [VBA] - Ttraitement des données importées depuis un CSV

Bonjour.

Bon j'ai réouvert le dernier classeur. C'est plutôt après le UserForm2.Show que vous pouvez mettre :
VB:
PlgRé.Columns(5).FormulaR1C1 = "=(RC10*1000)/RC12"
PlgRé.Columns(6).FormulaR1C1 = "=RANK(RC13,R5C13:R" & PlgRé.Rows.Count + 4 & "C13,1)"
PlgRé.Columns(7).FormulaR1C1 = "=(RC14*0.5)"
Et au lieu de décaler cette plage dans l'userform, déclarez le plutôt Public PlgRé As Range en tête d'un module ordinaire, comme ça il sera connu aussi dans l'Userform2, où vous pourrez y travailler su PlgRé.Columns(1) et (4) sans plus vous préoccuper de la feuille.
 

grhum29

XLDnaute Junior
Re : [VBA] - Ttraitement des données importées depuis un CSV

Bonjour Dranreb,

Tout d'abord, merci pour vos dernières réponses qui m'ont fait avancer.

J' ai fait ce que vous m'avez dit :

HTML:
Et au lieu de décaler cette plage dans l'userform, déclarez le plutôt Public PlgRé As Range en tête d'un module ordinaire, comme ça il sera connu aussi dans l'Userform2,

Et ceci simplifie bien le code...

Par contre ce que je ne parviens à comprendre c'est ceci :

HTML:
où vous pourrez y travailler su PlgRé.Columns(1) et (4) sans plus vous préoccuper de la feuille.

Je ne vois pas comment je peux récupérer certaines données de la feuille 7 - "Nb dépassement_vitesse" (Colonne I, N et O par exemple) pour l' insérer dans la feuille1 - "Synthèse".

J'ai fait différents essais mais rien de concluant... :(

Merci de votre aide.

Grhum29
 

Dranreb

XLDnaute Barbatruc
Re : [VBA] - Ttraitement des données importées depuis un CSV

Bonjour.
Comme j'ai dit:
PlgRé.Columns(1) c'est I5:Ix
PlgRé.Columns(6) c'est N5:Nx
PlgRé.Columns(7) c'est O5:Ox

Pour vous en convaincre faites un :
VB:
MsgBox PlgRé.Columns(1).Address(External:=True)
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
311 720
Messages
2 081 926
Membres
101 841
dernier inscrit
ferid87