Pagina 1 di 1

[Risolto] Sintassi array

MessaggioInviato: domenica 21 aprile 2019, 13:49
da Raoul Duke
Salve a tutti
non sono pratico di sintassi array, quindi vi chiedo cortesemente (visto che questo codice era una prova ma in realtà le dimensioni saranno molto maggiori) come si può scrivere in maniera più compatta questo codice?
grazie a tutti e buona pasqua

Codice: Seleziona tutto   Espandi visualeStringi visuale
Sub SelezionaM

Doc      = thisComponent
Foglio1   = Doc.sheets(0)

for i=1 to 5

x1=Foglio1.getCellByPosition (4,i)
y1=Foglio1.getCellByPosition (5,i)
z1=Foglio1.getCellByPosition (6,i)

   x1.String=""
   y1.string=""
   z1.string=""

   j=j+1
next

j=1

for i=1 to 5

a1=Foglio1.getCellByPosition (0,i)
b1=Foglio1.getCellByPosition (1,i)
c1=Foglio1.getCellByPosition (2,i)

a2=Foglio1.getCellByPosition (4,i)
b2=Foglio1.getCellByPosition (5,i)
c2=Foglio1.getCellByPosition (6,i)

If b1.String = "M" Then
   
   a2=Foglio1.getCellByPosition (4,j)
   b2=Foglio1.getCellByPosition (5,j)
   c2=Foglio1.getCellByPosition (6,j)
   
   a2.String=a1.string
   b2.string=b1.string
   c2.string=c1.string
   
   j=j+1

End if

next

end sub

Re: Sintassi array

MessaggioInviato: domenica 21 aprile 2019, 21:01
da patel
Ciao, cosa c'entrano gli array ? tu stai usando celle, magari range di celle, faresti meglio ad allegare un file di esempio con i dati di partenza, il risultato desiderato e qualche spiegazione sul tuo obiettivo.
Per cancellare un range puoi usare questo codice invece di fare un ciclo.
Codice: Seleziona tutto   Espandi visualeStringi visuale
Doc = ThisComponent
Sheet = Doc.Sheets(0)
CellRange = Sheet.getCellRangeByName("A2:C20")
CellRange.clearContents(5) ' value + string VALUE = 1 STRING = 4

Re: Sintassi array

MessaggioInviato: domenica 21 aprile 2019, 21:28
da Raoul Duke
hai ragione, credo di fare un pò di confusione...
cmq ho cambiato leggermente la funzione che deve eseguire il codice.
così com'è non mi funziona perché non sono capace a creare un array di valori (misti numeri e stringhe), e poi selezionarli per inserirli in un range di celle.
allego il file che forse si capisce meglio....

Re: Sintassi array

MessaggioInviato: domenica 21 aprile 2019, 21:49
da gioh66
Intanto buona Pasqua, poi premetto che io non so scrivere codice, ma quello che vorresti fare tu si può ottenere con delle formule matriciali:
in A2 di Foglio2 metti
Codice: Seleziona tutto   Espandi visualeStringi visuale
=SE(VAL.ERRORE(INDICE(Foglio1!A$2:A$6;PICCOLO(SE(Foglio1!$B$2:$B$6=Foglio1!$B$15;RIF.RIGA(Foglio1!$A$2:$A$6)-1);RIF.RIGA($A1))));"";INDICE(Foglio1!A$2:A$6;PICCOLO(SE(Foglio1!$B$2:$B$6=Foglio1!$B$15;RIF.RIGA(Foglio1!$A$2:$A$6)-1);RIF.RIGA($A1))))

inserisci la formula nella cella conferma con ctrl+maiuscolo+invio e copia incolla in basso
In B2 invece metti
Codice: Seleziona tutto   Espandi visualeStringi visuale
=SE(VAL.ERRORE(INDICE(Foglio1!C$2:C$6;PICCOLO(SE(Foglio1!$B$2:$B$6=Foglio1!$B$15;RIF.RIGA(Foglio1!$A$2:$A$6)-1);RIF.RIGA($A1))));"";INDICE(Foglio1!C$2:C$6;PICCOLO(SE(Foglio1!$B$2:$B$6=Foglio1!$B$15;RIF.RIGA(Foglio1!$A$2:$A$6)-1);RIF.RIGA($A1))))

matriciale come la prima.

Re: Sintassi array

MessaggioInviato: domenica 21 aprile 2019, 22:22
da Raoul Duke
Grazie gioh,
Si so che si può fare con le matriciali, ma avrei bisogno di farlo col codice. Grazie comunque della disponibilità!

Re: Sintassi array

MessaggioInviato: domenica 21 aprile 2019, 22:32
da gioh66
Di nulla, allora confidiamo in chi il codice lo sa scrivere :D

Re: Sintassi array

MessaggioInviato: lunedì 22 aprile 2019, 8:23
da patel
non capisco la tua ostinazione nell'usare array, è inutile salvare il contenuto di un range in un array e poi trasferire l'array in altro range, i range sono già array, nel tuo caso io copierei il range che ti interessa nel foglio 2 e poi eliminerei le righe che non vuoi vedere:
Codice: Seleziona tutto   Espandi visualeStringi visuale
sub copia
  Doc = thisComponent
  oSheet1 = Doc.Sheets.getByIndex(0)
  oSheet2 = Doc.Sheets.getByIndex(1)
  CellaSesso = oSheet1.getCellByPosition (1,14)
  Sex = CellaSesso.String
  oRange = oSheet1.getCellRangeByName("A1:C8").RangeAddress ' range da copiare
  oCellCpy = oSheet2.getCellByPosition(0,0).CellAddress ' destinazione
  oSheet1.CopyRange(oCellCpy, oRange) ' copia il range

  for riga = 5 to 1 step -1
     if oSheet2.getCellByPosition (1,riga).String <> Sex then
       oSheet2.getRows.removeByIndex(riga, 1)
     end if
  next
End Sub

Re: Sintassi array

MessaggioInviato: martedì 23 aprile 2019, 2:09
da Raoul Duke
grazie
patel
, ho fatto come mi dicevi, in effetti funziona.
ora ho un problema però con le call... come mai quando avvio la sub main non mi esegue la coll alle sub degli altri moduli?
grazie della pazienza

Re: Sintassi array

MessaggioInviato: martedì 23 aprile 2019, 8:16
da patel
Mettere le varie sub in altri moduli non è la cosa miglore per un principiante, non ti rendi conto se le variabili che usi sono valorizzate. Qundo c'è qualcosa che non funziona avvia la sub Main con F8 step by step, così vedi il flusso del programma e posizionando il cursore sulle variabili ne vedi il valore.

Re: Sintassi array

MessaggioInviato: martedì 23 aprile 2019, 10:35
da Raoul Duke
col cursore mi mostra solo il valore delle variabili numeriche (non le variabili Doc, sheet, ecc... che sono quelle messe in argomento alle funzioni che chiamo).
ma cmq sono talmente poche le variabili che ho impostato che mi sembra strano che sia un problema di dimenticanza di valorizzazione.

Re: Sintassi array

MessaggioInviato: martedì 23 aprile 2019, 10:49
da patel
resta il fatto che anch'io, con un codice così frammentato, non riesco a capire cosa c'è che non funziona.
Cosa vuoi fare dopo aver copiato i dati filtrati nel foglio2 ?

Re: Sintassi array

MessaggioInviato: martedì 23 aprile 2019, 11:05
da Raoul Duke
capisco, scusami.
ho creato un doc di prova molto più semplificato (che mi da lo stesso problema con le call). per caso potresti vedere se riesci a capire dove starebbe il problema adesso?
grazie mille in ogni caso.

Re: Sintassi array

MessaggioInviato: martedì 23 aprile 2019, 11:15
da patel
Ma allora parlo al vento, non si tratta del documento semplificato o no, ti ho chiesto cosa vuoi fare e tu mi alleghi un nuovo file con le macro sempre sparpagliate in moduli diversi

Re: Sintassi array

MessaggioInviato: martedì 23 aprile 2019, 11:27
da Raoul Duke
ah, beh, dentro la macro main ho inserito una riga "call selezione", ma quando eseguo la main sembra che questa chiamata la salti proprio. invece vorrei che la eseguisse.
la sub selezione dovrebbe copiarmi i dati nel foglio TRATT, ma invece non me lo fa: rimane vuota la pagina TRATT.

Re: Sintassi array

MessaggioInviato: martedì 23 aprile 2019, 16:13
da Raoul Duke
non so come mai ma è bastato nominare il modulo dove c'è il main con un nome che alfabeticamente viene prima di quello dove ci stanno le sub che vengono chiamate e ora funziona... bah.
grazie a tutti in ogni caso :)

Re: Sintassi array

MessaggioInviato: martedì 23 aprile 2019, 19:16
da patel
bene, spero che la prossima volta metterai tutte le sub in module1

Re: Sintassi array

MessaggioInviato: martedì 23 aprile 2019, 21:05
da Raoul Duke
ma se le metto tutte in un modulo quando il codice si allunga poi per trovarle devo scorrere migliaia di righe no? non è più comodo usare più moduli?

Re: Sintassi array

MessaggioInviato: mercoledì 24 aprile 2019, 17:40
da patel
usando più moduli come fai a ricordarti in quale modulo hai messo le sub ? comunque se ti trovi bene così continua pure.