Skip to main content
Announcements
Introducing Qlik Answers: A plug-and-play, Generative AI powered RAG solution. READ ALL ABOUT IT!
cancel
Showing results for 
Search instead for 
Did you mean: 
dandaanilreddy
Partner - Creator III
Partner - Creator III

how to export charts to excel using macro in qlikview

Hello Qlik Developers

I want to exports all objects(images) from a sheet to excel. I have the vb script to send the data into excel,but i want to send images to excel,i tried many vb scripts but i am unable to achieve the requirement below is the script i am using to export images to excel i am getting error (Blue Line) Can someone Help me please?

ErrorMessage: Type mismatch: 'copyObjectsToExcelSheet'

vPathVariant3 = "C:\Users\dimsum2\Desktop\qvd\Data.xlsx"

Dim aryExport(0,3)

aryExport(0,0) = "CH824"

aryExport(0,1) = "Per Month"

aryExport(0,2) = "A1"

aryExport(0,3) = "image"

Dim objExcelWorkbook 'as Excel.Workbook

Set objExcelWorkbook = copyObjectsToExcelSheet(ActiveDocument, aryExport)

objExcelWorkbook.SaveAs "C:\Users\dimsum2\Desktop\qvd\data.xlsx"

objExcelWorkbook.Application.Quit

Thanks

Anil Danda

10 Replies
Clever_Anjos
Employee
Employee

copyObjectsToExcelSheet(ActiveDocument, aryExport)


It´s not a regular VBA function. Do you have it implemented?

dandaanilreddy
Partner - Creator III
Partner - Creator III
Author

Hi Clever

Thanks for the reply. I used the same script from the blog you provided but i am not sure why it's not working for me moreover i don't know VB script can you please help me with the script which exports images to excel

Thanks

Anil

Clever_Anjos
Employee
Employee

Full code extracted from here: http://www.qlikblog.at/wp-content/uploads/2011/03/qlikblog_ExportToMultipleExcelSheets.zip

'// ****************************************************************

'// Simple Export of just one object

'// ****************************************************************

sub exportToExcel_Variant1

'// Array for export definitions

Dim aryExport(0,3)

aryExport(0,0) = "objSalesPerYearAndRegion"

aryExport(0,1) = "Sales per Region a. Year"

aryExport(0,2) = "A1"

aryExport(0,3) = "data"

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

'// ****************************************************************

'// More enhanced export of three objects to three different sheets

'// ****************************************************************

sub exportToExcel_Variant2

'// Array for export definitions

Dim aryExport(2,3)

aryExport(0,0) = "objSalesPerRegion"

aryExport(0,1) = "Sales per Region"

aryExport(0,2) = "A1"

aryExport(0,3) = "data"

aryExport(1,0) = "objTopCustomers"

aryExport(1,1) = "Top Customers"

aryExport(1,2) = "A1"

aryExport(1,3) = "data"

aryExport(2,0) = "objSalesPerYearAndRegion"

aryExport(2,1) = "Sales per Region a. Year"

aryExport(2,2) = "A1"

aryExport(2,3) = "data"

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

'// ****************************************************************

'// Export of multiple objects in different formats (data & image)

'// In one case (sheet "Sales Overview") two objects are placed on

'// one sheet.

'// ****************************************************************

sub exportToExcel_Variant3

Dim aryExport(4,3)

aryExport(0,0) = "objSalesPerRegion"

aryExport(0,1) = "Sales Overview"

aryExport(0,2) = "A1"

aryExport(0,3) = "image"

aryExport(1,0) = "objTopCustomers"

aryExport(1,1) = "Sales Overview"

aryExport(1,2) = "H1"

aryExport(1,3) = "image"

aryExport(2,0) = "objSalesPerYearAndRegion"

aryExport(2,1) = "Sales Overview"

aryExport(2,2) = "A14"

aryExport(2,3) = "data"

aryExport(3,0) = "objTopCustomers"

aryExport(3,1) = "Top Customers"

aryExport(3,2) = "A1"

aryExport(3,3) = "image"

aryExport(4,0) = "objTopCustomers"

aryExport(4,1) = "Top Customers"

aryExport(4,2) = "A14"

aryExport(4,3) = "data"

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

'// ****************************************************************

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

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)

               

  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

  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

'//__________________________________________________________________

dandaanilreddy
Partner - Creator III
Partner - Creator III
Author

Hi Clever

I have implemented the same code from export variant 3 as the code exports the images to the sheets i changed the sheet id and the object id but i am not getting the output. Below is the error message i am getting .

ErrorMessage: Type mismatch: 'copyObjectsToExcelSheet'

vPathVariant3 = "C:\Users\dimsum2\Desktop\qvd\Data.xlsx"

Dim aryExport(0,3)

aryExport(0,0) = "CH824"

aryExport(0,1) = "Per Month"

aryExport(0,2) = "A1"

aryExport(0,3) = "image"

Dim objExcelWorkbook 'as Excel.Workbook

Set objExcelWorkbook = copyObjectsToExcelSheet(ActiveDocument, aryExport)

objExcelWorkbook.SaveAs "C:\Users\dimsum2\Desktop\qvd\data.xlsx"

objExcelWorkbook.Application.Quit

Do you have any idea how to solve this?

Thanks

Anil

Not applicable

Anil,

Could you post your qvw file? I think that would make it easier to troubleshoot.

Stan

trdandamudi
Master II
Master II

See if the attached file is working for you...

tamilarasu
Champion
Champion

Hi Anil,

As mentioned above, copyObjectsToExcelSheet is not a VBA function but a function created by author. Like a sub procedure, a function is used to perform an assignment. We can call them whenever and any time we want. Seems you have copied only part of the code and tried in your application. Below thread has some discussion on the same topic.

Error exporting to excel with macro.

dandaanilreddy
Partner - Creator III
Partner - Creator III
Author

Hey Guys

Thanks for the reply i found a simple solution for this and the script is working fine. Please see the script below.

SUB SendExcel

      set XLApp = CreateObject("Excel.Application") ' Define Object

      XLApp.Visible = True 'Visible set as true

      set XLDoc = XLApp.Workbooks.Add 'Open new workbook

          

      Set obj = ActiveDocument.GetSheetObject("CH822")

      obj.CopyBitmapToClipboard

      XLDoc.Sheets(1).Range("B8").Select

      XLDoc.Sheets(1).PasteSpecial DataType=wdPasteBitmap

End Sub

The above script works for single chart, now how to send all charts in the sheet do we need to write the same logic for each object or is there any other script that can export all the charts and tables as image into excel? Please let me know

Thanks

Anil Danda