[RISOLTO] in attesa della macro....

Creare una macro - Scrivere uno script - Usare le API
Rispondi
upacill
Messaggi: 24
Iscritto il: venerdì 17 febbraio 2012, 22:44

[RISOLTO] in attesa della macro....

Messaggio da upacill »

Eccomi ancora qui, ho creato una macro che effettua dei calcoli con dati presi nel foglio1 che poi inserisce i risultati in celle nel foglio2, durante questi calcoli e per via della formattazione che appllico(sempre tramite macro)è molto lenta e si vedono le celle comparire una per volta e tutto il lavoro dura circa 20 secondi, io chiedo a voi Lumi se esiste un modo per nascondere questo materializzarsi delle celle una per volta o se è possibile far comparirte una messagbox del tipo ATTENDERE PREGO che poi sparisce alla conclusione della macro.... Grassie :P
Ultima modifica di upacill il martedì 24 aprile 2012, 22:13, modificato 1 volta in totale.
Libre office 3.5.2 su Ubuntu 11.10
vladko
Volontario
Volontario
Messaggi: 1637
Iscritto il: martedì 3 agosto 2010, 8:02

Re: in attesa della macro....

Messaggio da vladko »

20 secondi??? :shock: :shock: :shock:
ma quanti dati deve calcolare?
metti il codice creato che magari è da sistemare
fai sapere
grazie
AOO 3.4.1 AOO341m1(Build:9593) Linux Mint Debian/Mate 64bit java 1.6.0.22 XP PRO/32bit
con Base --> sempre backup!!!
Se problema è Risolto --> Inserire [Risolto]nel titolo come spiega qui, grazie :-)
upacill
Messaggi: 24
Iscritto il: venerdì 17 febbraio 2012, 22:44

Re: in attesa della macro....

Messaggio da upacill »

Codice: Seleziona tutto

Sub Previsionale

Dim Doc,Sheet,sheet2,sheet1 As Object
dim dispatcher as object
Dim aBorder as New com.sun.star.table.BorderLine

Dim riga,col,skill,ctr,ctr2,A,ultagg,i2,cont,proxskill,sett,sett2,coll,eta2,riga3,riga2 As integer
Dim perc,colall,correttivo,ass,appskill3,appsett,appsett3 As Double
Dim stringa,all,all2,app,dec,alle,appalle As String
Dim data,datains,appskill,appskill2,gg,eta,gg2,ggtot,corrgiorni,a2,correttivogg,appsk,appet as integer
Dim corrskill,correta,Pskilldec,percall,percall2,res,corrall as double


Doc = ThisComponent
Sheet = Doc.Sheets(0) 
Sheet2 = Doc.Sheets(2)
oSheet = Doc.Sheets(1)
sheet1= Doc.sheets(1)

' Controllo se esisteono giocatori
cont=0
 cell=sheet.getcellbyposition(2,15 )
 riga=15
do while cell.string<>""
  cell=sheet.getcellbyposition(2,riga )
  stringa=cell.string
  cont=cont+1
  riga=riga+1
  
  loop
  cont=cont-1 'numero di giocatori presenti
  if Cont=0 then  
          ctr=0
         
          sheet.getcellbyposition(15,0).value=ctr
          exit sub
          end if
          '
               
all=Sheet.getcellbyposition(3,3).string 'prende l'allenamento scelto
for i=6 to 12
		all2=Sheet.getcellbyposition(i,14).string 'vede la colonna dell'allenamento
		if all=all2 then exit for
next i
colall=i 'colonna allenamento scelto
riga=15
Cell = Sheet.getCellByPosition(2, riga)
stringa=cell.string

for i=4 to 15 ' calcolo correttore allenamento
		all2=Sheet2.getcellbyposition(7,i).string 
		corrall=sheet2.getcellbyposition(8,i).value
		if all= all2  then exit for
 next i
 res=Sheet2.getcellbyposition(11,4).value
 
 allen=sheet.getcellbyposition(13,3).string
 
 for i=7 to 11 ' calcolo correttore allenatore
 		appalle=Sheet2.getcellbyposition(10,i).string
 		corralle=sheet2.getcellbyposition(11,i).value 
		if appalle= allen  then exit for        
 next i
ass=Sheet2.getcellbyposition(11,14).value'numero assistenti 
correttivo=res*corralle*ass

riga2=5
for a=1  to cont

   				colonna=6
			    pskilldec=0
				settimane=sheet.getcellbyposition(3,6).value
				skill=Sheet.getcellbyposition(colall,riga).value 
				appskill2= int(skill)
				data=Sheet.getcellbyposition(20,15).value 'prende la data di oggi
 				eta=Sheet.getcellbyposition(3,riga).value'prende il valore degli anni all'inserimento
 				gg=Sheet.getcellbyposition(4,riga).value  'prende i giorni all'inserimento     
 				datains=Sheet.getcellbyposition(5,riga).value    'prende la data dell'inserimento
 				ggtot=(eta*112)+gg+data-datains  'Calcola i giorni totali del giocatore
 				appeta=ggtot mod 112
 				eta=(ggtot-appeta)/112     ' calcola l'eta attuale  in anni
 				gg =ggtot-(eta*112)        'calcolo i giorni attuali
 				proxskill=int(skill)+1
				nome=sheet.getcellbyposition(2,riga).string
				
				cellrange=Sheet1.getCellRangeByPosition(1,riga2,5,riga2)
   				With aBorder
      				.Color = RGB(0, 0, 0)
    				.OuterLineWidth = 2
   				End With
 			    oBorder = Cell.TableBorder
   				With oBorder
   					.BottomLine = aBorder
      				
    		   End with
				sheet1.getcellbyposition(1,riga2).string=nome
				sheet1.getcellbyposition(3,riga2).value=eta
 				sheet1.getcellbyposition(4,riga2).value=gg
 			
 				cellRange.CellBackColor = RGB (255,255,255)
 					cellrange.tableborder=oborder
 				
				a2=21-proxskill
 				sett=0
 				appsett3=0
 				eta2=0
 	
	for i2=1 to a2
 				if settimane<sett then exit for	
 		    	Perc=Sheet.getcellbyposition(14,riga).value
				if perc=0 then perc=100
				percall=perc
  				perc=percall/100
    			correttivogg=sheet2.getcellbyposition(13,10).value
   			    if (perc*100) <=1 then exit for 
       			for i=4 to 23 ' calcolo correttore skill
 					appskill=Sheet2.getcellbyposition(1,i).value
  					corrskill=sheet2.getcellbyposition(2,i).value
					if appskill= appskill2  then exit for
  				next i 
    			if (perc*100)<>1 then
       				 do while int(pskilldec)<proxskill
    				 	for i=4 to 18 'Calcolo correttore eta
 								appeta=Sheet2.getcellbyposition(4,i).value
 								correta=sheet2.getcellbyposition(5,i).value
								if appeta= eta  then exit for 
 						next i 
 	  					pskilldec=skill+(perc/(corrall*correta*corrskill*correttivo))
 	 					skill=pskilldec
		  				sett=sett+1
 			 			ggtot2=eta*112+gg+(7*sett) 'giorni totali al prossimo scatto
    					appeta=ggtot2 mod 112
 						eta2=(ggtot2-appeta)/112     ' calcolagli anni al prossimo scatto
 						gg2=ggtot2-(eta2*112)        'calcolo i giorni al prox scatto
 		
 					loop

   				Cell = oSheet.getCellByPosition(13, riga)
   				With aBorder
      				.Color = RGB(0, 0, 0)
    				.OuterLineWidth = 1
   				End With
 			    oBorder = Cell.TableBorder
   				With oBorder
   					.BottomLine = aBorder
      				.LeftLine = aBorder
     				 .TopLine = aBorder
      				.RightLine = aBorder
    		   End with
   
		 	 	sheet1.getcellbyposition(colonna+2,riga2).value=sett
 	 			Cell = Sheet1.getCellByPosition(colonna+2, riga2)
 	 			Cell.tableborder=oborder
 			  	sheet1.getcellbyposition(colonna+2,riga2).CellBackColor = RGB (255, 255, 0)
 			 	sheet1.getcellbyposition(colonna,riga2).value=eta2
		 		sheet1.getcellbyposition(colonna+1,riga2).value=gg2
		 		sheet1.getcellbyposition(colonna+1,riga2-1).value=proxskill
 				CellRange = oSheet.getCellRangeByPosition(colonna,riga2-1,Colonna+2 ,riga2-1)
 				Cell2 = Sheet1.getCellByPosition(colonna, riga2-1)
 				cell3= Sheet1.getCellByPosition(colonna+2, riga2-1)
 
    			if proxskill >2 then
 	  						cellRange.CellBackColor = RGB (170, 221, 150)
 	  						cellrange.tableborder=oborder
 	  '	cellRange.tableborder= rgb (0,0,0)
 	  	'cell2.CellBackColor = RGB (170, 221, 150)
 	  	'cell3.CellBackColor = RGB (170, 221, 150)
 	  			end if
 	    	if proxskill >5 then
 	  				cellRange.CellBackColor = RGB (160, 219, 142)
 	  				cellRange.tableborder= oborder
 	  	'cell2.CellBackColor = RGB (160, 219, 142)
 	  	'cell3.CellBackColor = RGB (160, 219, 142)
 	  		end if
 	  	 	if proxskill >8 then
 	  				cellRange.CellBackColor = RGB (96, 198, 89)
 	  				cellRange.tableborder= oborder
 	  '	cell2.CellBackColor = RGB (96, 198, 89)
 	  '	cell3.CellBackColor = RGB (96, 198, 89)
 	  		end if
 	  		 if proxskill>12 then
 	  				cellRange.CellBackColor = RGB (0, 122, 61)
 	  				cellRange.tableborder= oborder
 		  	end if 
 		  	if proxskill>14 then
 	  				cellRange.CellBackColor = RGB (0, 135, 81)
 	  				cellRange.tableborder= oborder
 	  		end if		
 	  	 	if proxskill>16 then
 	 				cellRange.CellBackColor = RGB (0, 107, 73)
 	  				cellRange.tableborder= oborder
 	  		end if
 	  		 if proxskill>18 then
 					cellRange.CellBackColor = RGB (2, 73, 48)
 	  				cellRange.tableborder= oborder
 	  		end if
 	 	 	 if proxskill=20 then
				cellRange.CellBackColor = RGB (0, 0, 0)
 	  			cellRange.tableborder= oborder
 	  		end if
 	  		if proxskill>12 then
 	  				sheet1.getcellbyposition(colonna+1,riga2-1).CharColor = RGB (255,255, 255)
 	  		end if
 			colonna=colonna+3
			proxskill=proxskill+1
			appsett3=sett
		end if 
	next i2	
	riga=riga+1
	riga2=riga2+2
next a

End Sub

questo è il codice, sicuramente ci sono variabili in eccesso ....
Libre office 3.5.2 su Ubuntu 11.10
c.spaziani
Messaggi: 21
Iscritto il: lunedì 16 gennaio 2012, 12:48

Re: in attesa della macro....

Messaggio da c.spaziani »

Puoi fare così:
crea un dialogo e inserisci una label con un messaggio di attesa, poi modifica la tua macro sulla base di questo esempio

Codice: Seleziona tutto

Sub Attesa
	oSheet = ThisComponent.Sheets.getByName("Foglio1")
	oSheet.isVisible = False
	oDialog = CreateUnoDialog(DialogLibraries.Standard.Dialog1)
	oDialog.setVisible(True)
	Wait 5000 'Sostituisci questa riga con il codice della tua macro
	oDialog.setVisible(False)
	oSheet.isVisible = True
	ThisComponent.CurrentController.setActiveSheet(oSheet)
End Sub
Se poi vuoi fare le cose in grande potresti anche mettere invece della label una progress bar che andresti ad aggiornare man mano che esegui il codice...
OpenOffice 3.4.1
LibreOffice 3.6.1.2
Microsoft Windows 7 (6.1) x64 Ultimate Edition Service Pack 1 (Build 7601)
upacill
Messaggi: 24
Iscritto il: venerdì 17 febbraio 2012, 22:44

Re: in attesa della macro....

Messaggio da upacill »

scusa ma sono abbastanza neofita :oops: ma come creo un dialogo?
Libre office 3.5.2 su Ubuntu 11.10
c.spaziani
Messaggi: 21
Iscritto il: lunedì 16 gennaio 2012, 12:48

Re: in attesa della macro....

Messaggio da c.spaziani »

strumenti -> macro -> organizza finestre di dialogo... -> Nuovo -> Ok -> Modifica
OpenOffice 3.4.1
LibreOffice 3.6.1.2
Microsoft Windows 7 (6.1) x64 Ultimate Edition Service Pack 1 (Build 7601)
upacill
Messaggi: 24
Iscritto il: venerdì 17 febbraio 2012, 22:44

Re: in attesa della macro....

Messaggio da upacill »

c.spaziani ha scritto:strumenti -> macro -> organizza finestre di dialogo... -> Nuovo -> Ok -> Modifica
Inanzitutto grazie per l'aiuto ,
allora la finestra di dialogo fatta con il label "Attendi", un'ultima domanda ma come si fa per aggiornare la barra di completamento?
Libre office 3.5.2 su Ubuntu 11.10
c.spaziani
Messaggi: 21
Iscritto il: lunedì 16 gennaio 2012, 12:48

Re: in attesa della macro....

Messaggio da c.spaziani »

Codice: Seleziona tutto

Sub Attesa
	oSheet = ThisComponent.Sheets.getByName("Foglio1")
	oSheet.isVisible = False
	oDialog = CreateUnoDialog(DialogLibraries.Standard.Dialog1)
	oDialog.setVisible(True)
	oProgressBarModel = oDialog.Model.ProgressBar1
	oProgressBarModel.ProgressValueMin = 1
	oProgressBarModel.ProgressValueMax = 3
	oProgressBarModel.ProgressValue = 1
	Wait 1000
	oProgressBarModel.ProgressValue = 2
	Wait 1000
	oProgressBarModel.ProgressValue = 3 
	Wait 1000
	oDialog.setVisible(False)
	oSheet.isVisible = True
	ThisComponent.CurrentController.setActiveSheet(oSheet)
End Sub
Per 20 secondi di esecuzione devi considerare almeno una decina di progressi...
Un po' laborioso, ma credo sia l'unico modo dal momento che, a quanto ne so, nei dialog non è possibile inserire né testo lampeggiante, né gif animate!
OpenOffice 3.4.1
LibreOffice 3.6.1.2
Microsoft Windows 7 (6.1) x64 Ultimate Edition Service Pack 1 (Build 7601)
upacill
Messaggi: 24
Iscritto il: venerdì 17 febbraio 2012, 22:44

Re: in attesa della macro....

Messaggio da upacill »

Mille Grazie sei stato gentilissimo :)
Libre office 3.5.2 su Ubuntu 11.10
Rispondi