[Risolto] Macro cerca verticale su piu foglio

Discussioni sull'applicazione per i fogli di calcolo
Rispondi
ilkappa
Messaggi: 39
Iscritto il: mercoledì 1 febbraio 2017, 12:52

[Risolto] Macro cerca verticale su piu foglio

Messaggio da ilkappa »

Ciao a tutti.
Spulciando nel forum ho trovato alcune macro che ho copiato e riadattato per cercare di eseguire una ricerca verticale su piu fogli dello stesso documento, in base al valore che viene inserito in una cella.
Piu o meno il sistema funziona, quello che non funziona è la scelta del foglio, legata ad un SELECT CASE.
Allego di seguito il file che utilizzo come test, sapreste indicarmi dove sbaglio.
Nei foglio Primo > Quarto inserisco dei codici con relativa descrizione e relativo peso
Nel foglio Ordini in base all'articolo che inserisco la macro deve restituirmi la relativa descrizione e peso pescato dal giusto foglio.

Domanda dedicata allo studio:
nella macro che sto utilizzando erano presenti queste righe che ho commentato, notando che la macro continua a funzionare. Queste righe sono presenti anche in altre macro che uso fornite da utenti piu esperti di me qui sul forum
Sareste cosi gentili da spiegarmi cosa fanno, poichè riesco a capire che creano un range.. ma non capisco a che serve.

Codice: Seleziona tutto

'range1 = this.getCellByPosition(col,rig)
  'range2 = range1.queryintersection(Target.rangeaddress())
  'If range2.RangeAddressesAsString = "" Then  Exit Sub
Grazie a tutti per l'aiuto
Allegati
Esempio.ods
(19.63 KiB) Scaricato 180 volte
Ultima modifica di ilkappa il lunedì 6 marzo 2017, 7:46, modificato 1 volta in totale.
OpenOffice 3.1 su Ubuntu 16.04
patel
Volontario attivo
Volontario attivo
Messaggi: 4020
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Macro cerca verticale su piu foglio

Messaggio da patel »

le righe commentate sono inutili, servono soltanto per controllare una specifica cella, ne tuo coso controlli tutta la colonna con "if col = 2 then"
il tuo codice non funziona a causa del select case errato (non funziona come con VBA)

Codice: Seleziona tutto

Sub CercaOrdini(Target)
If NOT Target.supportsService("com.sun.star.sheet.SheetCell") then exit sub
 this = Target.getSpreadsheet()
 rig = Target.celladdress.Row
 col = Target.celladdress.Column
 if col = 2 then
  Doc = ThisComponent
  svc = createUnoService("com.sun.star.sheet.FunctionAccess") 'creo la chiamata alle funzioni generali di Calc
  item =  Target.value ' string

If IsNumeric(item) Then
  Select Case item
    Case  < 20000 
    	 InRange = Doc.Sheets.getByName("Primo").getCellRangeByName("a2:c500") 'devo inserire il rage degli articoli e tuti i dati seguenti
  	Case   20001 to 50000
    	 InRange = Doc.Sheets.getByName("Secondo").getCellRangeByName("a2:c500") 'devo inserire il rage degli articoli e tuti i dati seguenti
	Case 50001 to 60000 
    	 InRange = Doc.Sheets.getByName("Terzo").getCellRangeByName("a2:c500") 'devo inserire il rage degli articoli e tuti i dati seguenti
  	Case Else
  End Select
Else
	InRange = Doc.Sheets.getByName("Quarto").getCellRangeByName("a2:c500") 'devo inserire il rage degli articoli e tuti i dati seguenti
End If

  For i = 3 To 4
    this.getCellByposition(i,rig).String = svc.callFunction("VLOOKUP", Array(item, InRange, i-1, True))  
  Next i  
 end if
 
End Sub
-------------------
Libre Office 7.5.3.2 su Windows 11
allega un file di esempio, guadagnerai tempo tu e lo farai risparmiare a chi ti aiuta
Gaetanopr
Volontario
Volontario
Messaggi: 3300
Iscritto il: mercoledì 21 novembre 2012, 20:07

Re: Macro cerca verticale su piu foglio

Messaggio da Gaetanopr »

Ciao patel, io farei diversamente non hai considerato il 4°caso, ilkappa a target assegna un valore string perchè item può essere sia numerico che testo(io avrei fatto in altro modo) ma va bene lo stesso
Ecco perchè poi verifica con IsNumeric altrimenti non ce ne sarebbe motivo.
allego solo la parte del select case

Codice: Seleziona tutto

item =  Target.string
If IsNumeric(item) Then
  Select Case Target.Value
    Case < 20000 
    	 InRange = Doc.Sheets.getByName("Primo").getCellRangeByName("a2:c500") 'devo inserire il rage degli articoli e tuti i dati seguenti
    	 MsgBox 1
  	Case < 50000 and Target.Value > 20000
    	 InRange = Doc.Sheets.getByName("Secondo").getCellRangeByName("a2:c500") 'devo inserire il rage degli articoli e tuti i dati seguenti
    	 MsgBox 2
	Case < 60000 and Target.Value > 50000
    	 InRange = Doc.Sheets.getByName("Terzo").getCellRangeByName("a2:c500") 'devo inserire il rage degli articoli e tuti i dati seguenti
    	 MsgBox 3
  	Case Else
  End Select
Else
	InRange = Doc.Sheets.getByName("Quarto").getCellRangeByName("a2:c500") 'devo inserire il rage degli articoli e tuti i dati seguenti
	MsgBox 4
End If
LibreOffice 7.2.2.2 windows 10
Openoffice 4.1.13 su windows 10
Gaetanopr
Volontario
Volontario
Messaggi: 3300
Iscritto il: mercoledì 21 novembre 2012, 20:07

Re: Macro cerca verticale su piu foglio

Messaggio da Gaetanopr »

Oppure in questo modo

Codice: Seleziona tutto

msgbox Target.value
'If IsNumeric(item) Then
  Select Case item
    Case  < 20000 And item > 0
        InRange = Doc.Sheets.getByName("Primo").getCellRangeByName("a2:c500") 'devo inserire il rage degli articoli e tuti i dati seguenti
  
     Case   20001 to 50000
        InRange = Doc.Sheets.getByName("Secondo").getCellRangeByName("a2:c500") 'devo inserire il rage degli articoli e tuti i dati seguenti

     Case 50001 to 60000 
        InRange = Doc.Sheets.getByName("Terzo").getCellRangeByName("a2:c500") 'devo inserire il rage degli articoli e tuti i dati seguenti

     Case 0
       InRange = Doc.Sheets.getByName("Quarto").getCellRangeByName("a2:c500") 'devo inserire il rage degli articoli e tuti i dati seguenti

     End Select
'End If
LibreOffice 7.2.2.2 windows 10
Openoffice 4.1.13 su windows 10
ilkappa
Messaggi: 39
Iscritto il: mercoledì 1 febbraio 2017, 12:52

Re: Macro cerca verticale su piu foglio

Messaggio da ilkappa »

Ciao.
Grazie ad entrambi.

Ho capito gli errori sia legati al Select Case sia la motivazione delle righe commentate.

Due domande:
Come mai per il primo case Gaetano, non hai impostato un

Codice: Seleziona tutto

Case   0 to 20000
ma una valutazione di maggiore e minore, mentre lo hai fatto per gli altri?

Seconda domanda sempre per imparare:
ilkappa a target assegna un valore string perchè item può essere sia numerico che testo(io avrei fatto in altro modo)
quale altro modo?

Grazie della disponibilità
OpenOffice 3.1 su Ubuntu 16.04
Gaetanopr
Volontario
Volontario
Messaggi: 3300
Iscritto il: mercoledì 21 novembre 2012, 20:07

Re: Macro cerca verticale su piu foglio

Messaggio da Gaetanopr »

ilkappa ha scritto: Due domande:
Come mai per il primo case Gaetano, non hai impostato un

Codice: Seleziona tutto

Case   0 to 20000
Semmai Case 1 To 20000, comunque non c'è un motivo specifico per cui ho fatto in questo modo.

Per la seconda domanda l'altro modo è proprio quello che ti postato, eliminando la verifica con isnumeric e snellendo la macro.
Nella programmazione puoi arrivare allo stesso risultato in diversi modi non è detto che il tuo come logica era sbagliato.
La select case potrebbe essere migliorata così, partendo da case 0 a seguire senza indicare il range (20001 to 50000).

Codice: Seleziona tutto

 item =  Target.value ' string
  Select Case item
    Case 0
        InRange = Doc.Sheets.getByName("Quarto").getCellRangeByName("a2:c500") 'devo inserire il rage degli articoli e tuti i dati seguenti

    Case  < 20001
        InRange = Doc.Sheets.getByName("Primo").getCellRangeByName("a2:c500") 'devo inserire il rage degli articoli e tuti i dati seguenti

    Case  < 50001
        InRange = Doc.Sheets.getByName("Secondo").getCellRangeByName("a2:c500") 'devo inserire il rage degli articoli e tuti i dati seguenti
       
    Case < 60001 
        InRange = Doc.Sheets.getByName("Terzo").getCellRangeByName("a2:c500") 'devo inserire il rage degli articoli e tuti i dati seguenti

    Case > 60000 
        msgbox "non presente" : exit sub
    End Select
LibreOffice 7.2.2.2 windows 10
Openoffice 4.1.13 su windows 10
Rispondi