VBA sur Excel [HELP] - VB/VBA/VBS - Programmation
Marsh Posté le 02-01-2013 à 14:24:37
Faudrait déjà commencer par expliquer ce qui ne marche pas dans le VBA? Déjà, quels sont ces traitements VBA dont tu parles. Ensuite, quels msg d'erreur ou bug constatés?
Question annexe : quelle méthode pour transférer les données de la BD Access vers Excel? ODBC depuis Excel, SQL+VBA depuis Access, extract en CSV depuis Access + traitement du CSV via VBA depuis Excel, autre ?
Marsh Posté le 02-01-2013 à 15:36:52
Mieux vaudrait mettre les données sur ce topic, plus de gens pourront t'aider. J'ai vu ton msg en MP : non, je ne veux pas que tu m'envoies les fichiers et que je me dépatouille seul (déjà parce que j'ai pas Access). Si ce n'est pas toi qui a fait le code, demandes à tes copains qui l'ont pondu de venir ici expliquer ce qui ne marche pas. Ce n'est pas à nous de deviner.
Du reste, pourquoi est-ce toi qui ouvre ce topic qui semble important pour ton groupe si tu n'es pas en mesure d'exposer les pbs techniques Tu as dû pourtant contribuer à ce projet, non?
Marsh Posté le 02-01-2013 à 15:45:44
Tout simplement car ils ne sont pas en "état" de le faire... Je vais transmettre des Screenshots
Marsh Posté le 02-01-2013 à 15:55:37
http://img203.imageshack.us/img203/7821/excelh.png
Voici la fiche qui bug...
IOn a actuellement un tableau excel plein de données issues d'Access (donc surtout ne pas changer ces données) sinon les deux programmes ne corresponderaient plus.
On a du, pour excel, faire des traitements statistiques (faits) et des représentation graphiques (fait aussi)
Il ne nous reste plus qu'à, via des Macros (en excell c'est donc simplement un moyen pour faire des programmes automatiques, pas hyper compliqués je pense.) J'en ai deja réalisé deux assez semblables, qui présentent un petit defaut c'est que je n'arrive pas à faire demarrer les "ordres" par defaut de la bonne case pour rendre le remplissage des cases semi automatique correct quel que soit la "Active Cell" au momenrt de lancer la macro (et de pousser sur le bouton donc, car on relie chaque programmation VBA (macro) à un bouton) (Tres simple à faire) J'ai commencé un programme dans lequel je voulais faire que toutes les donnees au dessus d'un chiffre (la moyenne dans notre cas) se mettent en une couleur et tout celles en dessous de la colonne total de la feuille "Fiches d'entretien" en une autre colonne
Voici les codes qu'on a utilisé pour ce faire :
Sub Total_Entretien()
Dim rng_total As Range
Dim compteur As Integer
Set rng_total = Sheets("Fiches_d'entretien" ).Range("rng_Total" )
compteur = 1
'La boucle commence ici
For Each valeir_total In rng_total
If valeur_total < 500 Then
Sheets("Fiches_d'entretien" ).Cells(compteur, 13).Value = "Petite réparation"
Else
Sheets("Fiches_d'entretien" ).Cells(compteur, 13).Value = "Grosse Réparatoin"
End If
compteur = compteur + 1
'On termine finit la boucle
Next
End Sub
Sub Somme_si_Couleurs()
'déclaration
Dim rng_total As Range
Dim compteur As Integer
Dim moyenne_compteur As Integer
Dim somme_total As Variant
Dim Moyenne_total As Variant
'Initialisation
Set rng_total = Sheets("Fiches_d'entretien" ).Range("rng_Total" )
compteur = 1
moyenne_compteur = 0
somme_total = 0
'On calcule la moyenne des la colonne Total
For Each valeur_total In rng_total
moyenne_compteur = moyenne_compteur + 1
somme_total = somme_total + valeur_solde
Next
Moyenne_total = somme_total / (moyenne_compteur)
'On donne une couleur aux cases
For Each valeur_total In rng_total
If valeur_total < Moyenne_total Then
Sheets("Fiches_d'entretien" ).Cells(compteur, 12).Font.ColorIndex = 20
Else
Sheets("Fiches_d'entretien" ).Cells(compteur, 12).Font.ColorIndex = 30
End If
compteur = compteur + 1
Next
End Sub
Et mon module (qui ne marche pas) :
Sub Macro1()
' Macro1 Macro
Range("L2,L3,L5,L7,L6,L8,L9,L10,L1," ).Select
Range("L2" ).Activate
With Selection.Font
.Color = -11489280
.TintAndShade = 0
End With
With Selection.Font
.ColorIndex = xlAutomatic
.TintAndShade = 0
End With
With Selection.Interior
.Pattern = xlNone
.TintAndShade = 0
.PatternTintAndShade = 0
End With
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 5287936
.TintAndShade = 0
.PatternTintAndShade = 0
End With
Range("G38" ).Select
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 5287936
.TintAndShade = 0
.PatternTintAndShade = 0
End With
Range("L4,L11,L14,L16,L21,G39" ).Select
Range("L4" ).Activate
With Selection.Interior
.Pattern = xlNone
.TintAndShade = 0
.PatternTintAndShade = 0
End With
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 15773696
.TintAndShade = 0
.PatternTintAndShade = 0
End With
Range("G39" ).Select
End Sub
Sub entretien_inférieur_moyenne()
'
' Entretien inférieur à la moyenne
'
'
Range("L2:L3" ).Select
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 15773696
.TintAndShade = 0
.PatternTintAndShade = 0
End With
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 15773696
.TintAndShade = 0
.PatternTintAndShade = 0
End With
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 15773696
.TintAndShade = 0
.PatternTintAndShade = 0
End With
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 15773696
.TintAndShade = 0
.PatternTintAndShade = 0
End With
Range("L5:L6:L8:L9:L10:L12:L13:L15:L17:L18:L19:L20" ).Select
Range("G38" ).Activate
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 15773696
.TintAndShade = 0
.PatternTintAndShade = 0
End With
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 15773696
.TintAndShade = 0
.PatternTintAndShade = 0
End With
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 15773696
.TintAndShade = 0
.PatternTintAndShade = 0
End With
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 15773696
.TintAndShade = 0
.PatternTintAndShade = 0
End With
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 15773696
.TintAndShade = 0
.PatternTintAndShade = 0
End With
End Sub
Sub Entretien_suppérieur_moyenne()
'
' Entretien Suppérieur à la moyenne
'
'
Range("L4" ).Select
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 5287936
.TintAndShade = 0
.PatternTintAndShade = 0
End With
Range("L7:L11:L14:L16:L21" ).Select
Range("G39" ).Activate
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 5287936
.TintAndShade = 0
.PatternTintAndShade = 0
End With
Range("K29" ).Select
End Sub
Marsh Posté le 02-01-2013 à 16:08:52
Pour le bouton "ajouter client" où l'ajout se fait automatiquement à la suite de notre tableau voici notre code :
Sub ajouterclient()
ActiveCell.FormulaR1C1 = ActiveCell.Offset(-1, 0).Value + 1
ActiveCell.Offset(0, 1).Select
' Encode le nom de la personne
Nom = InputBox("Entrez le nom du nouveau client" )
ActiveCell.FormulaR1C1 = Nom
ActiveCell.Offset(0, 1).Select
' Encode le prénom de la personne
Prénom = InputBox("Entrez le prénom du client" )
ActiveCell.FormulaR1C1 = Prénom
ActiveCell.Offset(0, 1).Select
' Encode l'adresse
Adresse = InputBox("Entrez l'adresse du nouveau client" )
ActiveCell.FormulaR1C1 = Adresse
ActiveCell.Offset(0, 1).Select
' Encode le code postal
Codepostal = InputBox("Entrez le code postal du nouveau client (B-****)" )
ActiveCell.FormulaR1C1 = Codepostal
ActiveCell.Offset(0, 1).Select
' Encode la ville
Ville = InputBox("Entrez la ville du nouveau client" )
ActiveCell.FormulaR1C1 = Ville
ActiveCell.Offset(0, 1).Select
' Encode le sexe du client
Sexe = InputBox("Entrez le sexe du client (Homme/Femme)" )
ActiveCell.FormulaR1C1 = Sexe
ActiveCell.Offset(0, 1).Select
' Encode la date de naissance du client
Naissance = InputBox("Entrez la date de naissance du client (**/**/****)" )
ActiveCell.FormulaR1C1 = Naissance
ActiveCell.Offset(0, 1).Select
' Encode le Numéro de Fixe du client
Fixe = InputBox("Entrez le Numéro de téléphone fixe" )
ActiveCell.FormulaR1C1 = Fixe
ActiveCell.Offset(0, 1).Select
' Encode le Numéro du gsm du client
Gsm = InputBox("Entrez le Numéro de Gsm client" )
ActiveCell.FormulaR1C1 = Gsm
ActiveCell.Offset(0, 1).Select
' Encode le type de client
Typeclient = InputBox("Entrez le type de client (Particulier/Professionnel)" )
ActiveCell.FormulaR1C1 = Typeclient
ActiveCell.Offset(0, 1).Select
End Sub
Marsh Posté le 02-01-2013 à 17:55:04
1- Sheets("NomFeuille".Cells(indexligne, indexcolonne).Select
pour en faire ton activecell
2-je voulais faire que toutes les donnees au dessus d'un chiffre (la moyenne dans notre cas) se mettent en une couleur
je conseille la mise en forme conditionnelle je vois le bouton sur ton screen
ensuite je pense qu'en 2 semaines de vacances il y avait le temps de faire qqchose car le 2 janvier on est pas productif
et l’enregistreur de macro c'est pas génial pour un travail a rendre
Marsh Posté le 02-01-2013 à 18:00:50
Malheureusement je ne suis pas en vacances mais en blocus... Je commence les examens le 7 :s
Marsh Posté le 02-01-2013 à 18:04:33
Désolé, à mon boulot, on n'a pas accès à imageshack
C'est normal tous les With Selection.Interior qui se suivent avec le même code plusieurs fois
Marsh Posté le 02-01-2013 à 19:14:48
aucune idée.. si c'est bizarre peut-être que ce n'est pas normal
Marsh Posté le 02-01-2013 à 19:32:54
Merci boomy29.. Malheureusement, pour les couleurs c'est uniquement en VBA.
Et pour 1- Sheets("NomFeuille".Cells(indexligne, indexcolonne).Select
pour en faire ton activecell ça bloque sur une seule cellule... Nous voudrions que toutes les rentrées que l'on fait s'enregistre à la suite
(ex: passer à la ligne 26 pour un client, passer à la ligne 27 pour un autre) et ce automatiquement
Marsh Posté le 02-01-2013 à 23:18:37
il faudrait faire un collection des cellules a mettre en couleur 1
et faire une boucle for sur cette collection
et faire pareil pour la 2eme couleur
mais je reste sur ma mise en forme conditionnelle car je vois pas l’intérêt d'utiliser une machine a écrire quand on a un ordinateur
Marsh Posté le 03-01-2013 à 09:50:17
Plutôt que faire des .select ou .active, vaudrait mieux faire une boucle et à l'intérieur, un truc du genre :
With Application.Worksheets("NomOnglet" ).Cells(i, j)
.Interior.Color = RGB(204, 255, 204)
...
End With
Au passage, vaudrait mieux utiliser RGB() pour les codes couleurs, c'est plus lisible, je pense que des codes genre 15773696
Enfin, ça manque cruellement de commentaires pertinents. Parce que "La boucle commence ici", ça c'est du commentaire
Par contre, d'expliquer la raison de l'enchaînement de tous ces blocs de mise en forme de cellules, ça, ça aiderait la compréhension, la preuve, t'es pas capable de m'expliquer leur raison d'être T'as fait des trucs dans ce code, au moins?
Mon impression est que ce code n'est franchement pas de qualité : on sent qu'il n'y a pas eu beaucoup de réflexion sur sa structure et son algorithmie (pas d'appels de fonctions alors qu'il y a de grosses portions répétitives)...
Marsh Posté le 02-01-2013 à 12:26:08
Bonjour à tous,
Je suis étudiant à l'université et j'ai un sacré problème...
Pour notre cours d'informatique, nous devons faire une base de données via Access, puis la transférer vers Excel... Avec, évidemment, beaucoup de consignes... Nous sommes parvenus à tout faire excepté nos traitements VBA... On ne parvient pas à les faire fonctionner Nous devons rendre notre travail demain ainsi que notre rapport pour 16H au plus tard... Nous sommes vraiment mal barré et je fais donc un appel au secours en espérant qu'une âme charitable pourra nous aider...
Les codes sont déjà fait mais ça foire quand on les exécute....
Je vous en supplie... Quelqu'un pourrait-il nous consacrer un tout petit peu de son temps pour vérifier et corriger nos code ?
Je vous remercie d'avance....
leodarth