Skip to main content
Announcements
July 15, NEW Customer Portal: Initial launch will improve how you submit Support Cases. IMPORTANT DETAILS
cancel
Showing results for 
Search instead for 
Did you mean: 
Not applicable

Export to Excel

Hi everyone,

i have in one sheet multiple pivot tables, i need to export them all to the same excel sheet so i have found the marco below i modify it and it works for me

what i did is create button -> add action-> execute macro and it works fine ,

now i need to copy this button to another QV sheet and modify the macro so that i can export the pivot tables in that sheet, but once i do this , the modifications i add are propagate the other Macro.

it seems like once you have one marco in your QV applivation all macro you create after are merged together.

any help please.

thank you

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

'// Simple Export

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

sub exportToExcel

'// Array for export definitions

Dim aryExport(18,3)

aryExport(0,0) = "CH53"   

aryExport(0,1) = "Compte d'Exploitation"

aryExport(0,2) = "A36"

aryExport(0,3) = "data"

aryExport(1,0) = "CH52"   

aryExport(1,1) = "Compte d'Exploitation"

aryExport(1,2) = "A30"

aryExport(1,3) = "data"

aryExport(2,0) = "CH51"   

aryExport(2,1) = "Compte d'Exploitation"

aryExport(2,2) = "A29"

aryExport(2,3) = "data"

aryExport(3,0) = "CH40"   

aryExport(3,1) = "Compte d'Exploitation"

aryExport(3,2) = "A28"

aryExport(3,3) = "data"

aryExport(4,0) = "CH49"   

aryExport(4,1) = "Compte d'Exploitation"

aryExport(4,2) = "A27"

aryExport(4,3) = "data"

aryExport(5,0) = "CH50"   

aryExport(5,1) = "Compte d'Exploitation"

aryExport(5,2) = "A26"

aryExport(5,3) = "data"

aryExport(6,0) = "CH48"   

aryExport(6,1) = "Compte d'Exploitation"

aryExport(6,2) = "A25"

aryExport(6,3) = "data"

aryExport(7,0) = "CH46"   

aryExport(7,1) = "Compte d'Exploitation"

aryExport(7,2) = "A23"

aryExport(7,3) = "data"

aryExport(8,0) = "CH43"   

aryExport(8,1) = "Compte d'Exploitation"

aryExport(8,2) = "A22"

aryExport(8,3) = "data"

aryExport(9,0) = "CH42"   

aryExport(9,1) = "Compte d'Exploitation"

aryExport(9,2) = "A21"

aryExport(9,3) = "data"

aryExport(10,0) = "CH45"   

aryExport(10,1) = "Compte d'Exploitation"

aryExport(10,2) = "A19"

aryExport(10,3) = "data"

aryExport(11,0) = "CH41"   

aryExport(11,1) = "Compte d'Exploitation"

aryExport(11,2) = "A18"

aryExport(11,3) = "data"

aryExport(12,0) = "CH47"   

aryExport(12,1) = "Compte d'Exploitation"

aryExport(12,2) = "A17"

aryExport(12,3) = "data"

aryExport(13,0) = "CH38"   

aryExport(13,1) = "Compte d'Exploitation"

aryExport(13,2) = "A16"

aryExport(13,3) = "data"

aryExport(14,0) = "CH29"   

aryExport(14,1) = "Compte d'Exploitation"

aryExport(14,2) = "A9"

aryExport(14,3) = "data"

aryExport(15,0) = "CH37"   

aryExport(15,1) = "Compte d'Exploitation"

aryExport(15,2) = "A8"

aryExport(15,3) = "data"

aryExport(16,0) = "CH27"   

aryExport(16,1) = "Compte d'Exploitation"

aryExport(16,2) = "A5"

aryExport(16,3) = "data"

aryExport(17,0) = "CH36"   

aryExport(17,1) = "Compte d'Exploitation"

aryExport(17,2) = "A4"

aryExport(17,3) = "data"

aryExport(18,0) = "CH28"   

aryExport(18,1) = "Compte d'Exploitation"

aryExport(18,2) = "A2"

aryExport(18,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

'//__________________________________________________________________

2 Replies
Gysbert_Wassenaar

The macro is not part of the button. The button merely runs the macro. If you want another button running a different version of that macro then you have to copy the macro and then change the copy and make the second button run the changed copy.


talk is cheap, supply exceeds demand
Not applicable
Author

Hi,

thanks for yr reply, now it works.

but once deployed on th server, the export doesn't work