Créer une feuille Excel de Temps de VBA
Bonjour à tous,
Je suis en Master 2 système d'informations et contrôle de gestion et j'ai un projet de génie logiciel à réaliser.
Dans ce projet nous devons réaliser des traitements en VBA. Je viens vers vous car j'ai une difficulté.
Mon objectif est de créer une table des temps qui sera ensuite insérée dans un système de base de données de type Access ou encore SQL-SERVER.
Je voudrais que ma table est la structure suivante:
day_id / day_date / dayofweek_id / month_id / year_id / Dayofweek_name / month_name
731 / 01/01/2004/ 1 / 1 / 2004 / Jeudi / Janvier
732 / 02/01/2004 / 2 / 1 / 2004 / vendredi / Janvier
Ma question, comment réaliser le script de la colonnes "day_date"? Je voudrai allez de la day_id 732 a 1506.
Merci de votre aide, j’espère que ma demande est claire pour vous.
Armand
Bonjour,
regarde peut être ceci, espérant que cela puisse t'aider à avancer, les lignes 1 et 2 étant déjà renseignées...
Option Explicit
Sub test()
Dim i As Integer, j As Integer
Application.ScreenUpdating = False
j = 3
For i = 732 To 1506
Cells(j, 1) = i
Cells(j, 2) = Cells(j - 1, 2) + 1
j = j + 1
Next i
Application.ScreenUpdating = True
End Subbonne fin d'après midi
@+
Merci pour ta réponse mais je souhaite créer ma table a partir de rien. Je souhaite qu'elle se forme avec des codes VBA.
En bidouillant, j'ai réalisé ça :
Sub day_date()
Sheets("DATE").Select
' test day_date
Range("B2").Select
ActiveCell.FormulaR1C1 = "1/1/2004"
Selection.AutoFill Destination:=Range("B2:B776"), Type:=xlFillDefault
End SubMais je trouve pas ça trop sexy :/
Bonjour,
une autre solution :
Option Explicit
Sub day_date()
With Sheets("DATE")
.Range("B2").Value = "1/1/2004"
With .Range("B3:B776")
.FormulaR1C1 = "=R[-1]C+1"
.Value = .Value
End With
End With
End Subbonne journée
@+
Voila ce que j'ai codé. Qu'est ce que tu en penses ? Le fichier est en pièce jointe.
' DECLARATION OBLIGATOIRE DES VARIABLES (RECOMMANDE)
' AUTEUR : BERAUD Armand
'
Option Explicit ' Déclaration obligatoire des variables
Sub Date_TABLE()
Sheets("DATE").Select
Dim COMPTEUR_day_date_fin As Date
Dim COMPTEUR_day_date As Date
Dim COMPTEUR_day_id As Integer
' Suppression Macro
Range("A1").Select ' Sélection cellule A1
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.ClearContents
With Selection.Font ' Format du tableau
.Name = "Calibri"
.Size = 11
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.ThemeColor = xlThemeColorLight1
.TintAndShade = 0
.ThemeFont = xlThemeFontMinor
End With
' Création de l'en-tête
Range("A1").Select ' Sélection cellule A1
ActiveCell.Value = "day_id" ' Stockage libellé day_id en cellule active
ActiveCell.Offset(0, 1).Select
ActiveCell.Value = "day_date" ' Stockage libellé day_date en cellule active
ActiveCell.Offset(0, 1).Select
ActiveCell.Value = "dayofweek_id" ' Stockage valeur dayofweek_id en cellule active
ActiveCell.Offset(0, 1).Select
ActiveCell.Value = "month_id" ' Stockage libellé month_id en cellule active
ActiveCell.Offset(0, 1).Select
ActiveCell.Value = "year_id" ' Stockage libellé year_id en cellule active
ActiveCell.Offset(0, 1).Select
ActiveCell.Value = "dayofweek_number" ' Stockage libellé dayofweek_number en cellule active
ActiveCell.Offset(0, 1).Select
ActiveCell.Value = "dayofweek_name" ' Stockage libellé dayofweek_name en cellule active
ActiveCell.Offset(0, 1).Select
ActiveCell.Value = "month_name" ' Stockage libellé month_name en cellule active
ActiveCell.Offset(0, 1).Select
ActiveCell.Value = "quater" ' Stockage libellé Quater en cellule active
ActiveCell.Offset(0, 1).Select
ActiveCell.Value = "full_date" ' Stockage libellé Full_date en cellule active
Range("A2").Select ' Sélection cellule A2
MsgBox "Column Heading realized"
' Création du corps de la table
COMPTEUR_day_date_fin = Application.InputBox(Prompt:="Saisir une date de fin postérieur au 01/01/2004 sous la forme JJ/MM/AAAA", Type:=2)
COMPTEUR_day_id = "732" ' Initialisation du COMPTEUR_day_id, 1er clé de la table Time_base du fichier access
COMPTEUR_day_date = "1/1/2004" ' Initialisation du COMPTEUR_day_date,date qui correspond
' à la première clé de la table Time_base du fichier access
Do While COMPTEUR_day_date <= COMPTEUR_day_date_fin
ActiveCell.Value = COMPTEUR_day_id ' Stockage de la valeur de COMPTEUR_day_id dans la 1er colonne
COMPTEUR_day_id = COMPTEUR_day_id + 1 ' Incrémentation du compteur "COMPTEUR_day_id"
ActiveCell.Offset(0, 1).Select ' Décalage d'une cellule vers la droite
ActiveCell.Value = COMPTEUR_day_date ' Stockage de la valeur de COMPTEUR_day_date dans la 2ième colonne
COMPTEUR_day_date = COMPTEUR_day_date + 1 ' Incrémentation du compteur "COMPTEUR_day_date"
ActiveCell.Offset(0, 1).Select ' Décalage d'une cellule vers la droite
ActiveCell.FormulaR1C1 = "=DAY(RC[-1])" ' Stockage du numéro du jour avec la fonction "=DAY()"
ActiveCell.Offset(0, 1).Select
ActiveCell.FormulaR1C1 = "=MONTH(RC[-2])" ' Stockage du numéro du mois avec la fonction "=MONTH()"
ActiveCell.Offset(0, 1).Select
ActiveCell.FormulaR1C1 = "=YEAR(RC[-3])" ' Stockage du numéro de l'année avec la fonction "=YEAR()"
ActiveCell.Offset(0, 1).Select
ActiveCell.FormulaR1C1 = "=WEEKDAY(RC[-4],14)" ' Stockage du numéro du jour de la semaine avec la fonction "=WEEKDAY()" ; 14 pour commencer à compter à partir du Jeudi
ActiveCell.Offset(0, 1).Select
ActiveCell.FormulaR1C1 = _
"=IF(RC[-1]=1,""Thursday"",IF(RC[-1]=2,""Friday"",IF(RC[-1]=3,""Saturday"",IF(RC[-1]=4,""Sunday"",IF(RC[-1]=5,""Monday"",IF(RC[-1]=6,""Tuesday"",IF(RC[-1]=7,""Wednesday"")))))))"
ActiveCell.Offset(0, 1).Select
ActiveCell.FormulaR1C1 = _
"=IF(RC[-4]=1,""January"",IF(RC[-4]=2,""February"",IF(RC[-4]=3,""March"",IF(RC[-4]=4,""April"",IF(RC[-4]=5,""May"",IF(RC[-4]=6,""June"",IF(RC[-4]=7,""July"",IF(RC[-4]=8,""August"",IF(RC[-4]=9,""September"",IF(RC[-4]=10,""October"",IF(RC[-4]=11,""November"",IF(RC[-4]=12,""December""))))))))))))"
ActiveCell.Offset(0, 1).Select
ActiveCell.FormulaR1C1 = _
"=IF(RC[-5]<=6,""Q1"",IF(RC[-5]>6,""Q2""))" ' Stockage du numéro du semestre en fonction de la valeur du mois
ActiveCell.Offset(0, 1).Select
ActiveCell.FormulaR1C1 = _
"=CONCATENATE(RC[-3],"" "",RC[-7],"" "",RC[-2],"" "",RC[-5])" ' Stockage du numéro du semestre en fonction de la valeur du mois
ActiveCell.Offset(1, -9).Select ' Décalage 1 ligne vers le bas et 9 colonnes vers la gauche
Loop
MsgBox "Successful"
End SubBonjour,
A priori pas de fichier en pièce jointe, petite remarque rarement utilse les "select" et autres "activate" en vba, ne font que ralentir le code...
bon après midi
@+
Re,
une proposition, pas tout traiter, A voir...
Option Explicit
Sub test()
Dim COMPTEUR_day_date_fin As Date, d As Date, COMPTEUR_day_id As Long, l As Long
Application.ScreenUpdating = False
Range("A1:J1").Value = Array("day_id", "day_date", "dayofweek_id", "month_id", "year_id", _
"dayofweek_number", "dayofweek_name", "month_name", "quater", "full_date")
COMPTEUR_day_date_fin = Application.InputBox(Prompt:="Saisir une date de fin postérieur au 01/01/2004 sous la forme JJ/MM/AAAA", Type:=2)
If Not IsDate(COMPTEUR_day_date_fin) Then Exit Sub
COMPTEUR_day_id = 732: l = 2
For d = #1/1/2004# To COMPTEUR_day_date_fin
Cells(l, 1) = COMPTEUR_day_id
Cells(l, 2) = d
Cells(l, 3) = Day(d)
Cells(l, 4) = Month(d)
Cells(l, 5) = Year(d)
Cells(l, 6) = Weekday(d, vbMonday)
Cells(l, 7) = WeekdayName(Weekday(d, vbMonday))
Cells(l, 8) = MonthName(Month(d))
Cells(l, 9) = IIf(Month(d) > 6, "Q2", "Q1")
COMPTEUR_day_id = COMPTEUR_day_id + 1: l = l + 1
Next d
Application.ScreenUpdating = True
End SubC'est vraiment pas mal! c'est plus clair et le traitement va beaucoup plus vite.
Je pense que je vais prendre ta version pour faire une version plus algorithmique et la mienne sera une version en utilisant l'outils d'enregistrement d'excel.
petite question: à quoi sert : Application.ScreenUpdating = False et Application.ScreenUpdating = True ??
et comment concaténer les données des cellules pour faire la colonne "full_date"? en gardant le même esprit que ton traitement?
Merci pour tous
Armand
Bonjour,
petite question: à quoi sert : Application.ScreenUpdating = False et Application.ScreenUpdating = True ??
cette instruction bloque la mise à jour de l'écran et la rétablit à la fin, permet de gagner sur la vitesse d'éxécution...
pour la concaténation, rajoute cette ligne, juste avant la valorisation des variables, à compléter....
Cells(l, 10) = Cells(l, 1) & " " & Cells(l, 2).Text & " " & Cells(l, 3) & " " 'etc...
COMPTEUR_day_id = COMPTEUR_day_id + 1: l = l + 1
Next dbonne journée
@+