Do not input private or sensitive data. View Qlik Privacy & Cookie Policy.
Skip to main content

Announcements
Independent validation for trusted, AI-ready data integration. See why IDC named Qlik a Leader: Read the Excerpt!
cancel
Showing results for 
Search instead for 
Did you mean: 
Not applicable

Export in Excel with Macro

Dear Qlikview community,

I simply need to export an object in Excel putting the Object Title (set in Object Properties -> Caption Tab) in the first excel row.

I have tried this code (found in QlikView community) but it doesn't work.

     sub Ext:

     set obj = ActiveDocument.GetSheetObject("CH22")

       captiontext = obj.GetCaption.Name.v

       curSheet.Range("A1") = captiontext

       obj.SendToExcel

     end Sub

Could you help me please?

Thank you in advance

3 Replies
alexandros17
Partner - Champion III
Partner - Champion III

This piece of code works ...

SUB EXPORT_Percentage
set sObject1 = ActiveDocument.GetSheetObject("CH_EXPORT")
set v = ActiveDocument.GetVariable("vOggi")

sObject1.ExportBiff "E:\qlik\Excel\" & v.GetContent.String & "_Summary_Export.xls"

end sub

Not applicable
Author

Hello,

thank you for your reply.

I don't know this language code and I'm not sure to understand.....

but I don't want to put the caption in the Excel name, but I need to Have the caption inside the excel in the cell A1.


Thank you

alexandros17
Partner - Champion III
Partner - Champion III

Here it is the code, it is not easy but it works

sub exportToExcel_TOT
Dim aryExport(0,4)

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

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
'//__________________________________________________________________