Skip to main content
Announcements
Introducing a new Enhanced File Management feature in Qlik Cloud! GET THE DETAILS!
cancel
Showing results for 
Search instead for 
Did you mean: 
Not applicable

Macro help to send charts to one excel workbook?


Hi,

I have four charts CH01,CH02,CH03,CH06. I need to send four charts into single excel workbook as four sheets.

can anyone help me with macro please. I have tried in site but seems not matching with me requirement.

Thanks in advance.

4 Replies
alexandros17
Partner - Champion III
Partner - Champion III

Amelia, this is what you need ...

sub exportToExcel_TOT
Dim aryExport(2,4)

aryExport(0,0) = "CHTOT01"
aryExport(0,1) = "Total TO"
aryExport(0,2) = "A2"
aryExport(0,3) = "data"
aryExport(0,4) = "A1"

aryExport(1,0) = "CHTOT02"
aryExport(1,1) = "Total TO"
aryExport(1,2) = "E2"
aryExport(1,3) = "data"
aryExport(1,4) = "E1"

aryExport(2,0) = "CHTOT03"
aryExport(2,1) = "Total TO"
aryExport(2,2) = "E14"
aryExport(2,3) = "data"
aryExport(2,4) = "E13"

Dim objExcelWorkbook 'as Excel.Workbook
Set objExcelWorkbook = copyObjectsToExcelSheet(ActiveDocument, aryExport)

''// Now either just leave Excel open or do some other stuff here
''// like saving the excel, some formatting stuff, ...
end sub

'// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
'// YOU DO NOT NEED TO CHANGE THE CODE BELOW !!!!!!!!!!!!!!!!!!!!!!!
'// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


'// ****************************************************************
'// copyObjectsToExcel
'// ~~
'// Parameters:
'// qvDoc - Reference to the QlikView document (normally just use
'// "ActiveDocument", but you can also use copyObjectsToExcel
'// outside of QlikView ...
'// aryExportDefinition - array of settings
'// ~~
'// Version 1.02
'// ~~
'// The aryExportDefinition is used to pass the following properties to
'// copyObjectsToExcelSheet:
'//
'// Index Description
'// ------------------------
'// 0 - Id of the QlikView object to copy from
'// 1 - Name of the sheet (in Excel) where the object should be copied to
'//
'// (If a sheet with the same name already exists no new
'// sheet will be created, instead the existing sheet will
'// be used for pasting the object)
'//
'// Note: the sheetName can be max 31 characters long
'//
'// 2 - Range in Excel where the object should be pasted to
'// 3 - PasteMode ["data", "image"]
'// Defines if the objects underlaying data should be
'// pasted ("data") or the the image representing the object
'// should be used
'// Introdotto da A.Saccone
'// 4 - Range in Excel where object's caption should be pasted
'// ****************************************************************
Private Function copyObjectsToExcelSheet(qvDoc, aryExportDefinition) 'as Excel.Workbook


Dim i 'as Integer
Dim objExcelApp 'as Excel.Application
Dim objExcelDoc 'as Excel.Workbook

Set objExcelApp = CreateObject("Excel.Application")

objExcelApp.Visible = true 'false if you want to hide Excel
objExcelApp.DisplayAlerts = false

Set objExcelDoc = objExcelApp.Workbooks.Add

Dim strSourceObject

Dim qvObjectId 'as String
Dim sheetName
Dim sheetRange
Dim pasteMode
Dim objSource
Dim objCurrentSheet
Dim objExcelSheet
Dim sheetRangeCapt



for i = 0 to UBOUND(aryExportDefinition)

'// Get the properties of the exportDefinition array
qvObjectId = aryExportDefinition(i,0)
sheetName = aryExportDefinition(i,1)
sheetRange = aryExportDefinition(i,2)
pasteMode = aryExportDefinition(i,3)
sheetRangeCapt = aryExportDefinition(i,4)

Set objExcelSheet = Excel_GetSheetByName(objExcelDoc, sheetName)
if (objExcelSheet is nothing) then
Set objExcelSheet = Excel_AddSheet(objExcelApp, sheetName)
if (objExcelSheet is nothing) then
msgbox("No sheet could be created, this should not occur!!!")
end if
end if

objExcelSheet.Select

set objSource = qvDoc.GetSheetObject(qvObjectId)
Call objSource.GetSheet().Activate()
objSource.Maximize
qvDoc.GetApplication.WaitForIdle


if (not objSource is nothing) then

if (pasteMode = "image") then
Call objSource.CopyBitmapToClipboard()
else
Call objSource.CopyTableToClipboard(true) '// default & fallback
end if

Set objCurrentSheet = objExcelDoc.Sheets(sheetName)
objExcelDoc.Sheets(sheetName).Range(sheetRange).Select
objExcelDoc.Sheets(sheetName).Paste

'Inserimento del Caption dell'oggetto
chartCaption = objSource.GetCaption.Name.v
objCurrentSheet.Range(sheetRangeCapt) = chartCaption

if (pasteMode <> "image") then
With objExcelApp.Selection
.WrapText = False
.ShrinkToFit = False
End With
end if

objCurrentSheet.Range("A1").Select
end if



next

Call Excel_DeleteBlankSheets(objExcelDoc)

'// Finally select the first sheet
objExcelDoc.Sheets(1).Select

'// Return value
Set copyObjectsToExcelSheet = objExcelDoc

end function
'// ________________________________________________________________



'// ****************************************************************
'// Internal function for getting the Excel sheet by sheetName
'// ****************************************************************
Private Function Excel_GetSheetByName(ByRef objExcelDoc, sheetName) 'as Excel.Sheet

For Each ws In objExcelDoc.Worksheets
If (trim(ws.Name) = Excel_GetSafeSheetName(sheetName)) then
Set Excel_GetSheetByName = ws
exit function
End If
Next

'// default return value
Set Excel_GetSheetByName = nothing

End Function
'// ________________________________________________________________


Private Function Excel_GetSafeSheetName(sheetName)

'// can be max 31 characters long
retVal = trim(left(sheetName, 31))

Excel_GetSafeSheetName = retVal
End Function



'// ****************************************************************
'// Internal function for adding a new sheet
'// ****************************************************************
Private Function Excel_AddSheet(objExcelApplication, sheetName) ' as Excel.Sheet

'// add a sheet to the last position
objExcelApplication.Sheets.Add , objExcelApplication.Sheets(objExcelApplication.Sheets.Count)

Dim objNewSheet
Set objNewSheet = objExcelApplication.Sheets(objExcelApplication.Sheets.Count)
objNewSheet.Name = left(sheetName,31)

'// return the newly created sheet
Set Excel_AddSheet = objNewSheet

End function
'// ________________________________________________________________



'// ****************************************************************
'// Delete all empty sheets
'// ****************************************************************
Private Sub Excel_DeleteBlankSheets(ByRef objExcelDoc)

For Each ws In objExcelDoc.Worksheets
If (not HasOtherObjects(ws)) then
If objExcelDoc.Application.WorksheetFunction.CountA(ws.Cells) = 0 Then
On Error Resume Next
Call ws.Delete()
End If
End If
Next

End Sub
'// ________________________________________________________________




'// ****************************************************************
'// Helper function to determine if there are other objects placed
'// on the sheet ...
'// ****************************************************************
Public Function HasOtherObjects(ByRef objSheet) 'As Boolean
Dim c
If (objSheet.ChartObjects.Count > 0) Then
HasOtherObjects = true
Exit function
End If
If (objSheet.Pictures.Count > 0) Then
HasOtherObjects = true
Exit function
End If
If (objSheet.Shapes.Count > 0) Then
HasOtherObjects = true
Exit function
End If


HasOtherObjects = false
End Function
'//__________________________________________________________________

Not applicable
Author

Thanks. when I am executing this it is showing

Object required: 'objSource'

Call objSource.GetSheet().Activate()

please help


alexandros17
Partner - Champion III
Partner - Champion III

Yes Amelia,

of course you have to customize the sub:

sub exportToExcel_TOT
Dim aryExport(2,4)

aryExport(0,0) = "CHTOT01"
aryExport(0,1) = "Total TO"
aryExport(0,2) = "A2"
aryExport(0,3) = "data"
aryExport(0,4) = "A1"

aryExport(1,0) = "CHTOT02"
aryExport(1,1) = "Total TO"
aryExport(1,2) = "E2"
aryExport(1,3) = "data"
aryExport(1,4) = "E1"

aryExport(2,0) = "CHTOT03"
aryExport(2,1) = "Total TO"
aryExport(2,2) = "E14"
aryExport(2,3) = "data"
aryExport(2,4) = "E13"

Dim objExcelWorkbook 'as Excel.Workbook
Set objExcelWorkbook = copyObjectsToExcelSheet(ActiveDocument, aryExport)

''// Now either just leave Excel open or do some other stuff here
''// like saving the excel, some formatting stuff, ...
end sub

Dim aryExport(2,4)
tells how many objects must be exported: 3 objects (0,1,2) having each 5 Details (0,1,2,3,4)

for each one of the 3 objects (From my example):

aryExport(0,0) = "CHTOT01" //This is the name of the object
aryExport(0,1) = "Total TO" //This is the title
aryExport(0,2) = "A2" //This is the cell where data are pasted
aryExport(0,3) = "data"
aryExport(0,4) = "A1" //this is the cell where title is pasted

let me know

Not applicable
Author

Sorry for delay reply. I am not getting where I need to use. I have tried so many ways but nothing seems to be working.

Please help