Malheureusement, peu importe la façon dont les tables jointes sont triés, tableau croisé triera colonnes par défaut dans l'ordre alphabétique, par conséquent avril, décembre ... commence l'ordre. Pour modifier ou même filtrer l'ordre des colonnes dans les tableaux croisés, vous devez spécifier des valeurs dans la clause PIVOT Col IN()
de l'instruction SQL.
Étant donné que vous avez besoin d'une requête dynamique, pensez à créer un fichier queydef dans VBA pour mettre à jour le SQL derrière le tableau croisé où vous mettez à jour dynamiquement la clause PIVOT Col IN()
. Bien sûr, passer commencer et terminer les dates au besoin ou par des paramètres:
Public Sub BuildCrossTab()
Dim db As Database
Dim qdef As QueryDef
Dim strSQL As String, dates As String
Dim i As Integer, monthsDiff As Integer
Set db = CurrentDb
' DELETE PREVIOUS SAVED QUERY
For Each qdef in db.QueryDefs
If qdef.Name = "AccuralsCrosstabQ" Then
db.Execute "DROP Table " & qdef.Name, dbFailOnError
End If
Next qdef
' LOOP THROUGH ALL MONTHS BACKWARDS
dates = "("
monthsDiff = DateDiff("m", #7/1/2016#, #12/1/2016#)
For i = monthsDiff To 0 Step -1
dates = dates & " '" & Format(DateAdd("m", i, #7/1/2016#), "mmm-yyyy") & "',"
Next i
dates = dates & ")"
dates = Replace(dates, ",)", ")")
' PREPARE SQL STRING
strSQL = "TRANSFORM SUM(a.[Amount $]) AS SumAmount" _
& " SELECT a.Company, a.[Accrual ID], SUM(a.[Amount $]) As [Total Amount $]" _
& " FROM [Accruals Raw Data] a " _
& " GROUP BY a.Company, a.[Accrual ID]" _
& " PIVOT Format(a.[Posted Date], ""mmm-yyyy"")" _
& " IN " & dates
' CREATE QUERY
Set qdef = db.CreateQueryDef("AccuralsCrosstabQ", strSQL)
Set qdef = Nothing
Set db = Nothing
End Sub
Une option consiste à formater les dates en utilisant un format qui sorte correctement, comme:'AAAA-mm'. – Gustav