par , 04/03/2016 à 14h59 (2548 Affichages)
Pour exporter facilement des tableaux dans un fichier Excel, j'ai créé ces fonctions, que j'ai mises dans le module de macros :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124
| ' Variables utilisées par Excel.
Dim WorkBook
Dim ExcelApp
Dim RefSh
Dim CloseExcelWhenFinished
const xlExcel8 = 56 ' Format d'enregistrement Excel.
const xlExcel12 = 50 ' Format d'enregistrement Excel.
const xlOpenXMLWorkbook = 51 ' Format d'enregistrement Excel.
'***************************************************************
' Cette méthode permet d'ouvrir Excel.
'***************************************************************
sub excel_open()
' On essaye de prendre Excel s'il est déjà ouvert.
CloseExcelWhenFinished = false
On Error Resume Next
Err.Number = 0
' Si la ligne suivante provoque une erreur, c'est qu'il n'y a pas d'instance d'Excel ouverte.
Set ExcelApp = GetObject(, "Excel.Application")
If Err.Number <> 0 Then
' Pas d'instance Excel, on en crée une.
Set ExcelApp = CreateObject("Excel.Application")
CloseExcelWhenFinished = true
Err.Clear
end if
on error goto 0
ExcelApp.Visible = True
' On crée un workbook avec 1 seule feuille.
ExcelApp.SheetsInNewWorkbook = 1
Set WorkBook = ExcelApp.Workbooks.Add
Set RefSh = WorkBook.Worksheets(1) ' La première feuille (qui sera de toutes manières supprimée) servira de référence
RefSh.name = "a supprimer"
end sub
'***************************************************************
' Cette méthode permet de sauvegarder le fichier Excel.
'
' @param p_file_name : nom du fichier à enregistrer.
'***************************************************************
sub excel_save(p_file_name)
On Error Resume Next
Dim oFSO
Set oFSO = CreateObject("Scripting.FileSystemObject")
refSh.delete
WorkBook.Worksheets(1).activate
Err.Number = 0
CheminSauv = oFSO.GetAbsolutePathName(p_file_name)
ExcelApp.DisplayAlerts = False
WorkBook.SaveAs CheminSauv, xlOpenXMLWorkbook
ExcelApp.DisplayAlerts = True
WorkBook.Saved = true
NewNameCounter = 0
NewName = ""
On Error Goto 0
WorkBook.close
end sub
'***************************************************************
' Cette méthode permet d'envoyer un graphique dans Excel, comme
' si on avait utilisé la fonction "envoyer vers Excel".
'
' @param p_GraphID : l'identifiant du graphique à exporter.
' @param p_SheetName : la feuille sur laquelle on veut mettre le tableau.
'***************************************************************
sub excel_export_chart(p_GraphID, p_SheetName)
Set obj = ActiveDocument.GetSheetObject(p_GraphID)
On Error Resume Next
Err.Number = 0
obj.sendtoexcel
on error goto 0
Set tmpWorkbook = ExcelApp.ActiveWorkbook
tmpWorkbook.ActiveSheet.name = p_SheetName
On Error Resume Next
Err.Number = 0
' on recopie la feuille contenant les données dans le classeur créé en premier lieu
tmpWorkbook.ActiveSheet.copy RefSh
If Err.Number <> 0 Then
Err.Clear
end if
on error goto 0
If ExcelKeepColors = true Then
' Conservation de la mise en forme.
WorkBook.Colors = tmpWorkbook.Colors
End If
' puis on ferme le classeur qui contenait les données exportées
tmpWorkbook.close false
Set obj = Nothing
end sub
'***************************************************************
' Cette méthode permet d'ajuster la taille de toutes les colonnes.
'***************************************************************
sub excel_autofit()
' On met au propre toutes les colonnes.
for i = 1 to WorkBook.Worksheets.count
WorkBook.Worksheets(i).Columns.Autofit()
next
end sub |
Sans oublier d'autoriser les accès système.
Ensuite, il suffit de créer une sub qui dit quels charts sont à exporter :
1 2 3 4 5 6 7 8 9 10
| sub export_chart()
call excel_open
call excel_export_chart("CH01", "onglet 1")
call excel_export_chart("CH02", "onglet 2")
call excel_autofit
call excel_save("c:\temp\toto.xlsx")
end sub |
L'appel de cette macro générera automatiquement un fichier Excel qui contiendra autant d'onglets que souhaité.
Il est aussi possible de créer un script VBS externe qui ouvrira un QlikView et qui fera les exports souhaités :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
| const xlOpenXMLWorkbook = 51 ' Format d'enregistrement Excel.
' Ouverture du document QV.
Set myApp = CreateObject("QlikTech.QlikView")
Set myDoc = myApp.OpenDoc("C:\Program Files\QlikView\Examples\Documents\Executive Dashboard.qvw")
Set ActiveDocument = myDoc
Set ExcelApp = CreateObject("Excel.Application")
ExcelApp.Visible = True
ExcelApp.SheetsInNewWorkbook = 1
Set WorkBook = ExcelApp.Workbooks.Add
Set RefSh = WorkBook.Worksheets(1)
RefSh.name = "vide" ' Une feuille vide, qu'on supprimera à la fin
' ClearAll
ActiveDocument.ClearAll
for i = 2009 to 2011
' Selection de l'année.
Set MyField = ActiveDocument.Fields("[Fiscal Year]")
MyField.Select i
' Export du chart CH54 dans une onglet.
Set obj = ActiveDocument.GetSheetObject("CH54")
obj.sendtoexcel
Set tmpWorkbook = ExcelApp.ActiveWorkbook
tmpWorkbook.ActiveSheet.name = "Export " & i
tmpWorkbook.ActiveSheet.copy RefSh
tmpWorkbook.close false
' Export du chart sous forme d'image au niveau de la ligne 1, colonne 5.
Set obj = ActiveDocument.GetSheetObject("CH54")
Set currentSheet = obj.GetSheet
currentSheet.Activate
obj.CopyBitmapToClipboard
Workbook.Worksheets("Export " & i).Cells(1, 5).Select
Workbook.Worksheets("Export " & i).Paste
next
' Suppression de la feuille vide.
refSh.delete
WorkBook.Worksheets(1).activate
ExcelApp.DisplayAlerts = False
WorkBook.SaveAs "c:\temp\export.xlsx", xlOpenXMLWorkbook
ExcelApp.DisplayAlerts = True
WorkBook.Saved = True
'On ferme le doc Excel.
WorkBook.close
' On ferme Excel.
ExcelApp.quit
' On ferme QV.
myApp.Quit |