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

Announcements
Posting on Qlik Community is temporarily paused for some users. Thank you for patience and we'll update you soon!
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

Labels (1)
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
'//__________________________________________________________________