[Risolto] caricamento listbox lento

Creare una macro - Scrivere uno script - Usare le API
Luka2017
Messaggi: 69
Iscritto il: giovedì 16 febbraio 2017, 11:59

[Risolto] caricamento listbox lento

Messaggio da Luka2017 »

Ciao ho questo codice per popolare la listbox ma è molto lenta. C'è un modo per velocizzarlo?

Grazie

Codice: Seleziona tutto

Sub Elenco_descr
Dim oCell
 Dim a As String
  Dim b As String
  Dim oComboBox 
    Dim oTextBox 
    oTextBox = oDialogo7.getControl("TextField1")
oComboBox = oDialogo7.getControl("ListBox1")
Sheet = ThisComponent.Sheets(6)
oComboBox.removeItems(0,oComboBox.getItemCount())
Daric = UCase(oTextBox.Text)
Lungh = Len(Daric)
For i = 1 to 5000
 oCell = Sheet.getCellByPosition(2, i) 
 a = oCell.String
    If UCase(Left(Sheet.getCellByPosition(2, i).String, Lungh)) = Daric then
       oComboBox.addItem(a, oDialogo7.getControl("ListBox1").ItemCount)
       Redim Preserve Arr(0 To x)
       Arr(x) = i
       x = x+1   
       End If  
next i
End sub  
Ultima modifica di Luka2017 il venerdì 10 marzo 2017, 21:10, modificato 1 volta in totale.
XLUPOGRIGIOX
Messaggi: 142
Iscritto il: domenica 10 maggio 2015, 18:17
Località: Busto Arsizio (VA)

Re: caricamento listbox lento

Messaggio da XLUPOGRIGIOX »

Ciao,prova ad allegare un file e spiega bene cosa vorresti ottenere.
OpenOffice 4.1.1 su windows seven
patel
Volontario attivo
Volontario attivo
Messaggi: 4030
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: caricamento listbox lento

Messaggio da patel »

ma che casino ! perché chiami oComboBox una ListBox ? allega un file di esempio
per velocizzare devi caricare la listbox direttamente dal range interessato tramite array, questo comporterà modifiche anche al resto del codice
-------------------
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
Luka2017
Messaggi: 69
Iscritto il: giovedì 16 febbraio 2017, 11:59

Re: caricamento listbox lento

Messaggio da Luka2017 »

STO METTENDO UN FILE DI PROVA, PERO' VI AVVISO IL MIO COMPRENDE MOLTISSIME RIGHE E COLONNE E LA LISTBOX CI METTE ALMENO 2 MINUTI PER CARICARE.

Oppure ho visto che cè possibilità di utilizzare il grid control però non riesco ha fare lo stesso lavoro del listbox che quando clicco gli item appaiono i dati nelle text box accanto come già fa la listbox grazie a patel

GRAZIE
Allegati
prova.ods
(16.98 KiB) Scaricato 242 volte
patel
Volontario attivo
Volontario attivo
Messaggi: 4030
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: caricamento listbox lento

Messaggio da patel »

nel file che hai allegato non succede niente cliccando gli item della listbox, comunque quanto ho scritto sopra sulla possibilità di caricare la listbox da range vale soltanto se rinunci al filtro

Codice: Seleziona tutto

Dim Sheet
Dim oDialogo1
Dim LB as object
Dim oTextBox
Dim Arr()
Sub Trasf_Bc
DialogLibraries.LoadLibrary("Standard")
oDialogo1 = CreateUnoDialog(DialogLibraries.Standard.Dialog1)
oDialogo1.Title = "Trasferimento Prodotti"
oDialogo1.getControl("TextField1").Enable = TRUE 
oDialogo1.getControl("TextField2").Enable = FALSE 
oDialogo1.getControl("TextField3").Enable = FALSE
oDialogo1.getControl("TextField4").Enable = FALSE
oDialogo1.getControl("TextField5").Enable = FALSE
oDialogo1.getControl("TextField6").Enable = FALSE
LB = oDialogo1.getControl("ListBox1")
oTextBox = oDialogo1.getControl("TextField1")
Call Option_bc
oDialogo1.Execute()
oDialogo1.dispose()
End Sub

Sub Option_bc 
Dim oCell
Sheet = ThisComponent.Sheets(0)
LB.removeItems(0,LB.getItemCount())
Daric = UCase(oTextBox.Text)
Lungh = Len(Daric)
'---------------
c = Sheet.createCursor
c.gotoEndOfUsedArea(false)
LastRow = c.RangeAddress.EndRow + 1
CellRange = Sheet.getCellRangeByName("A2:A" & LastRow)
Dati = CellRange.GetDataArray
svc = createUnoService("com.sun.star.sheet.FunctionAccess")
Dati1 =  svc.callFunction("TRANSPOSE", Array(Dati))
LB.getModel.StringItemList = Dati1(0)
redim arr(LastRow)
For i =1 to LastRow
  Arr(i) = i
next i
End sub

Sub List_Ordine
Dim Sheet
Dim MyCounter
Sheet = ThisComponent.Sheets(0)
MyCounter = Arr(LB.selectedItemPos) + 2
oDialogo1.getControl("TextField2").text = Sheet.getCellRangeByName("A" & MyCounter).String
oDialogo1.getControl("TextField3").text = Sheet.getCellRangeByName("B" & MyCounter).String 
oDialogo1.getControl("TextField4").text = Sheet.getCellRangeByName("C" & MyCounter).String 
oDialogo1.getControl("TextField5").text = Sheet.getCellRangeByName("D" & MyCounter).String
oDialogo1.getControl("TextField6").text = Sheet.getCellRangeByName("E" & MyCounter).String

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
Luka2017
Messaggi: 69
Iscritto il: giovedì 16 febbraio 2017, 11:59

Re: caricamento listbox lento

Messaggio da Luka2017 »

Grazie come al solito.
Ma esiste una listbox a più colonne dove riga per riga c'è una checkbox per selezionare gli item che servono in una volta sola?
patel
Volontario attivo
Volontario attivo
Messaggi: 4030
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: caricamento listbox lento

Messaggio da patel »

è abbastanza veloce ora con 5000 righe ?
la listbox ha una sola colonna, però aspettiamo Gaetano prima di dire NO
Ultima modifica di patel il mercoledì 8 marzo 2017, 7:48, modificato 1 volta in totale.
-------------------
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
Luka2017
Messaggi: 69
Iscritto il: giovedì 16 febbraio 2017, 11:59

Re: caricamento listbox lento

Messaggio da Luka2017 »

Ora ci provo a lavoro. Grazie mille
Gaetanopr
Volontario
Volontario
Messaggi: 3316
Iscritto il: mercoledì 21 novembre 2012, 20:07

Re: caricamento listbox lento

Messaggio da Gaetanopr »

Luka2017 ha scritto:Grazie come al solito.
Ma esiste una listbox a più colonne dove riga per riga c'è una checkbox per selezionare gli item che servono in una volta sola?
Si esiste la listbox a più colonne ma è da creare tutta da codice, discorso affrontato qua
viewtopic.php?f=26&t=8103

Però la checkbox non può essere inserita come su excel, ma si possono selezionare più elementi contemporaneamente e lavorare su questi.
Ma a cosa ti serve selezionarne più di 1 quando puoi visualizzare i dati nelle text box solo di un elemento a volta?
LibreOffice 7.2.2.2 windows 10
Openoffice 4.1.13 su windows 10
patel
Volontario attivo
Volontario attivo
Messaggi: 4030
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: caricamento listbox lento

Messaggio da patel »

Ciao Gaetano, hai visto i post precedenti, ho detto giusto qui ? o si può fare qualcosa ?
patel ha scritto:....comunque quanto ho scritto sopra sulla possibilità di caricare la listbox da range vale soltanto se rinunci al filtro
-------------------
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: 3316
Iscritto il: mercoledì 21 novembre 2012, 20:07

Re: caricamento listbox lento

Messaggio da Gaetanopr »

Ciao patel, secondo me qualcosa si può fare, ho un'idea vediamo se riesco a postarla in giornata.
LibreOffice 7.2.2.2 windows 10
Openoffice 4.1.13 su windows 10
Luka2017
Messaggi: 69
Iscritto il: giovedì 16 febbraio 2017, 11:59

Re: caricamento listbox lento

Messaggio da Luka2017 »

Grazie per l'impegno che state dando alla mia domanda.

Per filtrare con la textbox neanche inserendo un pulsante senza che sia automatico è possibile?

Ed inoltre per la gridcontrol ho provato quello che mi ha allegato Gaetanopr ma mi dà sempre valore oggetto non impostato

nel valore

Codice: Seleziona tutto

col = columnmodel.createColumn()
Gaetanopr
Volontario
Volontario
Messaggi: 3316
Iscritto il: mercoledì 21 novembre 2012, 20:07

Re: caricamento listbox lento

Messaggio da Gaetanopr »

Si può usare un filtro standard per filtrare velocemente il range e successivamente tramite una query(istantanea) creare un array con i valori filtrati e darli in pasto alla funzione TRANSPOSE che ha usato patel

Codice: Seleziona tutto

Dim Sheet
Dim oDialogo1
Dim LB as object
Dim oTextBox
Dim Arr()

Sub Trasf_Bc
DialogLibraries.LoadLibrary("Standard")
oDialogo1 = CreateUnoDialog(DialogLibraries.Standard.Dialog1)
oDialogo1.Title = "Trasferimento Prodotti"
oDialogo1.getControl("TextField1").Enable = TRUE 
oDialogo1.getControl("TextField2").Enable = FALSE 
oDialogo1.getControl("TextField3").Enable = FALSE
oDialogo1.getControl("TextField4").Enable = FALSE
oDialogo1.getControl("TextField5").Enable = FALSE
oDialogo1.getControl("TextField6").Enable = FALSE
LB = oDialogo1.getControl("ListBox1")
oTextBox = oDialogo1.getControl("TextField1")
'Call Option_bc
oDialogo1.Execute()
oDialogo1.dispose()
End Sub

Sub Option_bc 
Dim oCell
Dim oFilterDesc  ' Filter descriptor.
Dim oFields(0) As New com.sun.star.sheet.TableFilterField2  '
Sheet = ThisComponent.Sheets(0)
LB.removeItems(0,LB.getItemCount())
Daric = UCase(oTextBox.Text)

c = Sheet.createCursor
c.gotoEndOfUsedArea(false)
LastRow = c.RangeAddress.EndRow + 1
CellRange = Sheet.getCellRangeByName("A2:A" & LastRow)
oFilterDesc = CellRange.createFilterDescriptor(True)

  With oFields(0)
      .Field = 0
      .Operator = com.sun.star.sheet.FilterOperator2.BEGINS_WITH
      .StringValue = Daric
  End With
oFilterDesc = CellRange.createFilterDescriptor(True)

With oFilterDesc
    .ContainsHeader = False
    .CopyOutputData = False
    .FilterFields2 = oFields()
    
End With    

CellRange.filter(oFilterDesc)
ranges = CellRange.queryVisibleCells()
 e = ranges.createEnumeration()
while e.hasMoreElements()
     rg = e.nextElement()
     a() = rg.getDataArray()
wend
     
If IsEmpty (a) = False Then 
   Dati = a
   svc = createUnoService("com.sun.star.sheet.FunctionAccess")
   Dati1 =  svc.callFunction("TRANSPOSE", Array(Dati))

   LB.getModel.StringItemList = Dati1(0)
   redim Arr(LastRow)
  For i =1 to LastRow
     Arr(i) = i
   next i
End if
  Call RemoveSheetFilter()
End sub

Sub List_Ordine
Dim Sheet
Dim MyCounter
Sheet = ThisComponent.Sheets(0)
MyCounter = Arr(LB.selectedItemPos) + 2
oDialogo1.getControl("TextField2").text = Sheet.getCellRangeByName("A" & MyCounter).String
oDialogo1.getControl("TextField3").text = Sheet.getCellRangeByName("B" & MyCounter).String 
oDialogo1.getControl("TextField4").text = Sheet.getCellRangeByName("C" & MyCounter).String 
oDialogo1.getControl("TextField5").text = Sheet.getCellRangeByName("D" & MyCounter).String
oDialogo1.getControl("TextField6").text = Sheet.getCellRangeByName("E" & MyCounter).String

End Sub

Sub RemoveSheetFilter()
  Dim oSheet          ' Sheet to filter.
  Dim oFilterDesc     ' Filter descriptor.
 
  oSheet = ThisComponent.getSheets().getByIndex(0)
  oFilterDesc = oSheet.createFilterDescriptor(True)
  oSheet.filter(oFilterDesc)
End Sub
Un sistema ancor più veloce è copiare i dati filtrati dal filtro standard su un'altra area e applicare il metodo GetDataArray su quell'area
LibreOffice 7.2.2.2 windows 10
Openoffice 4.1.13 su windows 10
Luka2017
Messaggi: 69
Iscritto il: giovedì 16 febbraio 2017, 11:59

Re: caricamento listbox lento

Messaggio da Luka2017 »

Grazie per la soluzione.

Lo sto provando ma devo scrivere correttamente il nome senno' non appare ed è molto difficile ricordasi il nome preciso.
patel
Volontario attivo
Volontario attivo
Messaggi: 4030
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: caricamento listbox lento

Messaggio da patel »

temo che sia necessario copiare i dati filtrati dal filtro standard su un'altra area perché con la soluzione sopra esposta l'array arr contiene tutti i dati, non solo quelli filtrati
-------------------
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
Luka2017
Messaggi: 69
Iscritto il: giovedì 16 febbraio 2017, 11:59

Re: caricamento listbox lento

Messaggio da Luka2017 »

Siccome non l'ho fatto mai mi puoi dare un dritta patel.

Grazie
Gaetanopr
Volontario
Volontario
Messaggi: 3316
Iscritto il: mercoledì 21 novembre 2012, 20:07

Re: caricamento listbox lento

Messaggio da Gaetanopr »

patel ha scritto:temo che sia necessario copiare i dati filtrati dal filtro standard su un'altra area perché con la soluzione sopra esposta l'array arr contiene tutti i dati, non solo quelli filtrati
Si può rimediare, non avevo pensato alll'array Arr, la macro l'ho modificata in quanto oltretutto funziona bene solo se i dati sono ordinati
Ora dovrebbe andare bene.

Codice: Seleziona tutto

Dim Sheet
Dim oDialogo1
Dim LB as object
Dim oTextBox
Dim Arr()

Sub Trasf_Bc
DialogLibraries.LoadLibrary("Standard")
oDialogo1 = CreateUnoDialog(DialogLibraries.Standard.Dialog1)
oDialogo1.Title = "Trasferimento Prodotti"
oDialogo1.getControl("TextField1").Enable = TRUE 
oDialogo1.getControl("TextField2").Enable = FALSE 
oDialogo1.getControl("TextField3").Enable = FALSE
oDialogo1.getControl("TextField4").Enable = FALSE
oDialogo1.getControl("TextField5").Enable = FALSE
oDialogo1.getControl("TextField6").Enable = FALSE
LB = oDialogo1.getControl("ListBox1")
oTextBox = oDialogo1.getControl("TextField1")
'Call Option_bc
oDialogo1.Execute()
oDialogo1.dispose()
End Sub

Sub Option_bc 
Dim oCell
Dim oFilterDesc  ' Filter descriptor.
Dim oFields(0) As New com.sun.star.sheet.TableFilterField2  '
Sheet = ThisComponent.Sheets(0)
LB.removeItems(0,LB.getItemCount())
Daric = UCase(oTextBox.Text)

c = Sheet.createCursor
c.gotoEndOfUsedArea(false)
LastRow = c.RangeAddress.EndRow + 1
CellRange = Sheet.getCellRangeByName("A2:A" & LastRow)
oFilterDesc = CellRange.createFilterDescriptor(True)

  With oFields(0)
      .Field = 0
      .Operator = com.sun.star.sheet.FilterOperator2.BEGINS_WITH
      .StringValue = Daric
  End With
oFilterDesc = CellRange.createFilterDescriptor(True)

With oFilterDesc
    .ContainsHeader = False
    .CopyOutputData = False
    .FilterFields2 = oFields()
    
End With    

CellRange.filter(oFilterDesc)
ranges = CellRange.queryVisibleCells()
ReDim Arr(0 To Ubound(ranges.RowDescriptions))
Dim a(0 To Ubound(ranges.RowDescriptions))
For Each oCell in ranges.Cells
      Arr(x) = oCell.CellAddress.Row
     a(x) = oCell.DataArray(0)
     x = x +1
Next 

If IsEmpty (a) = False Then 
   Dati = a
   svc = createUnoService("com.sun.star.sheet.FunctionAccess")
   Dati1 =  svc.callFunction("TRANSPOSE", Array(a))

   LB.getModel.StringItemList = Dati1(0)
End if   
  Call RemoveSheetFilter()

End sub

Sub List_Ordine
Dim Sheet
Dim MyCounter
Sheet = ThisComponent.Sheets(0)
MyCounter = Arr(LB.selectedItemPos)+1
oDialogo1.getControl("TextField2").text = Sheet.getCellRangeByName("A" & MyCounter).String
oDialogo1.getControl("TextField3").text = Sheet.getCellRangeByName("B" & MyCounter).String 
oDialogo1.getControl("TextField4").text = Sheet.getCellRangeByName("C" & MyCounter).String 
oDialogo1.getControl("TextField5").text = Sheet.getCellRangeByName("D" & MyCounter).String
oDialogo1.getControl("TextField6").text = Sheet.getCellRangeByName("E" & MyCounter).String

End Sub

Sub RemoveSheetFilter()
  Dim oSheet          ' Sheet to filter.
  Dim oFilterDesc     ' Filter descriptor.
 
  oSheet = ThisComponent.getSheets().getByIndex(0)
  oFilterDesc = oSheet.createFilterDescriptor(True)
  oSheet.filter(oFilterDesc)
End Sub
Luka2017 ha scritto:Grazie per la soluzione.

Lo sto provando ma devo scrivere correttamente il nome senno' non appare ed è molto difficile ricordasi il nome preciso.
La macro funziona come le precedenti, cambia solo il metodo per popolare la listbox, la ricerca avviene sempre sui dati immessi quindi non capisco cosa vuoi dire.
Se scrivi "Bi" vengono filtrati tutti i nominativi che iniziano in questo modo quindi "Biondi" e "Bianchi"
LibreOffice 7.2.2.2 windows 10
Openoffice 4.1.13 su windows 10
Luka2017
Messaggi: 69
Iscritto il: giovedì 16 febbraio 2017, 11:59

Re: caricamento listbox lento

Messaggio da Luka2017 »

mi da errore
Redim Arr(0 To Ubound(ranges.RowDescriptions))

valore non valido indice al di fuori dell'area definita
Gaetanopr
Volontario
Volontario
Messaggi: 3316
Iscritto il: mercoledì 21 novembre 2012, 20:07

Re: caricamento listbox lento

Messaggio da Gaetanopr »

questo succede quando non vi sono dati da filtrare cambia così

Codice: Seleziona tutto

Dim Sheet
Dim oDialogo1
Dim LB as object
Dim oTextBox
Dim Arr()

Sub Trasf_Bc
DialogLibraries.LoadLibrary("Standard")
oDialogo1 = CreateUnoDialog(DialogLibraries.Standard.Dialog1)
oDialogo1.Title = "Trasferimento Prodotti"
oDialogo1.getControl("TextField1").Enable = TRUE 
oDialogo1.getControl("TextField2").Enable = FALSE 
oDialogo1.getControl("TextField3").Enable = FALSE
oDialogo1.getControl("TextField4").Enable = FALSE
oDialogo1.getControl("TextField5").Enable = FALSE
oDialogo1.getControl("TextField6").Enable = FALSE
LB = oDialogo1.getControl("ListBox1")
oTextBox = oDialogo1.getControl("TextField1")
'Call Option_bc
oDialogo1.Execute()
oDialogo1.dispose()
End Sub

Sub Option_bc 
Dim oCell
Dim oFilterDesc  ' Filter descriptor.
Dim oFields(0) As New com.sun.star.sheet.TableFilterField2  '
Sheet = ThisComponent.Sheets(0)
LB.removeItems(0,LB.getItemCount())
Daric = UCase(oTextBox.Text)

c = Sheet.createCursor
c.gotoEndOfUsedArea(false)
LastRow = c.RangeAddress.EndRow + 1
CellRange = Sheet.getCellRangeByName("A2:A" & LastRow)
oFilterDesc = CellRange.createFilterDescriptor(True)

  With oFields(0)
      .Field = 0
      .Operator = com.sun.star.sheet.FilterOperator2.BEGINS_WITH
      .StringValue = Daric
  End With
oFilterDesc = CellRange.createFilterDescriptor(True)

With oFilterDesc
    .ContainsHeader = False
    .CopyOutputData = False
    .FilterFields2 = oFields()
    
End With    

CellRange.filter(oFilterDesc)
ranges = CellRange.queryVisibleCells()

If Ubound(ranges.RowDescriptions) > -1 Then 
  ReDim Arr(0 To Ubound(ranges.RowDescriptions))
  Dim a(0 To Ubound(ranges.RowDescriptions))
  For Each oCell in ranges.Cells
        Arr(x) = oCell.CellAddress.Row 
       a(x) = oCell.DataArray(0)
       x = x +1
  Next 
   Dati = a
   svc = createUnoService("com.sun.star.sheet.FunctionAccess")
   Dati1 =  svc.callFunction("TRANSPOSE", Array(a))

   LB.getModel.StringItemList = Dati1(0)
End if   
  Call RemoveSheetFilter()

End sub

Sub List_Ordine
Dim Sheet
Dim MyCounter
Sheet = ThisComponent.Sheets(0)
MyCounter = Arr(LB.selectedItemPos)+1
oDialogo1.getControl("TextField2").text = Sheet.getCellRangeByName("A" & MyCounter).String
oDialogo1.getControl("TextField3").text = Sheet.getCellRangeByName("B" & MyCounter).String 
oDialogo1.getControl("TextField4").text = Sheet.getCellRangeByName("C" & MyCounter).String 
oDialogo1.getControl("TextField5").text = Sheet.getCellRangeByName("D" & MyCounter).String
oDialogo1.getControl("TextField6").text = Sheet.getCellRangeByName("E" & MyCounter).String

End Sub

Sub RemoveSheetFilter()
  Dim oSheet          ' Sheet to filter.
  Dim oFilterDesc     ' Filter descriptor.
 
  oSheet = ThisComponent.getSheets().getByIndex(0)
  oFilterDesc = oSheet.createFilterDescriptor(True)
  oSheet.filter(oFilterDesc)
End Sub
LibreOffice 7.2.2.2 windows 10
Openoffice 4.1.13 su windows 10
Luka2017
Messaggi: 69
Iscritto il: giovedì 16 febbraio 2017, 11:59

Re: caricamento listbox lento

Messaggio da Luka2017 »

Codice: Seleziona tutto

Dim oFilterDesc  
mi da' errore sintassi sto provando con il 4.1.2 puo' essere per quello?
patel
Volontario attivo
Volontario attivo
Messaggi: 4030
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: caricamento listbox lento

Messaggio da patel »

no, prova a digitarla invece di copiarla quella riga, a me l'ulimo codice di Gaetano funziona perfettamente
-------------------
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
Luka2017
Messaggi: 69
Iscritto il: giovedì 16 febbraio 2017, 11:59

Re: caricamento listbox lento

Messaggio da Luka2017 »

si infatti era per quello, però quando avvio il dialog non mi carica tutti i nomi nella listbox ma devo andare a tentativi nella text box e poi mi appaiono i nomi filtrati,
Ma se rimane la textbox vuota pure la listbox diventa vuota.
patel
Volontario attivo
Volontario attivo
Messaggi: 4030
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: caricamento listbox lento

Messaggio da patel »

quindi tu vorresti vedere tutta la lista quando la textbox è vuota ?
-------------------
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
Luka2017
Messaggi: 69
Iscritto il: giovedì 16 febbraio 2017, 11:59

Re: caricamento listbox lento

Messaggio da Luka2017 »

si e poi quando devo filtrare con la textbox la listbox effettua il filtraggio
Gaetanopr
Volontario
Volontario
Messaggi: 3316
Iscritto il: mercoledì 21 novembre 2012, 20:07

Re: caricamento listbox lento

Messaggio da Gaetanopr »

Cambia con questa

Codice: Seleziona tutto

Dim Sheet
Dim oDialogo1
Dim LB as object
Dim oTextBox
Dim Arr()

Sub Trasf_Bc
DialogLibraries.LoadLibrary("Standard")
oDialogo1 = CreateUnoDialog(DialogLibraries.Standard.Dialog1)
oDialogo1.Title = "Trasferimento Prodotti"
oDialogo1.getControl("TextField1").Enable = TRUE 
oDialogo1.getControl("TextField2").Enable = FALSE 
oDialogo1.getControl("TextField3").Enable = FALSE
oDialogo1.getControl("TextField4").Enable = FALSE
oDialogo1.getControl("TextField5").Enable = FALSE
oDialogo1.getControl("TextField6").Enable = FALSE
LB = oDialogo1.getControl("ListBox1")
oTextBox = oDialogo1.getControl("TextField1")
Call Option_bc
oDialogo1.Execute()
oDialogo1.dispose()
End Sub

Sub Option_bc 
Dim oCell
Dim oFilterDesc  ' Filter descriptor.
Dim oFields(0) As New com.sun.star.sheet.TableFilterField2  '
Sheet = ThisComponent.Sheets(0)
LB.removeItems(0,LB.getItemCount())
Daric = UCase(oTextBox.Text)

c = Sheet.createCursor
c.gotoEndOfUsedArea(false)
LastRow = c.RangeAddress.EndRow + 1
CellRange = Sheet.getCellRangeByName("A2:A" & LastRow)
oFilterDesc = CellRange.createFilterDescriptor(True)

  With oFields(0)
      .Field = 0
      .Operator = com.sun.star.sheet.FilterOperator2.BEGINS_WITH
      .StringValue = Daric
  End With
oFilterDesc = CellRange.createFilterDescriptor(True)

With oFilterDesc
    .ContainsHeader = False
    .CopyOutputData = False
    .FilterFields2 = oFields()
    
End With    

CellRange.filter(oFilterDesc)
ranges = CellRange.queryVisibleCells()

If Ubound(ranges.RowDescriptions) > -1 Then 
  ReDim Arr(0 To Ubound(ranges.RowDescriptions))
  Dim a(0 To Ubound(ranges.RowDescriptions))
  For Each oCell in ranges.Cells
       Arr(x) = oCell.CellAddress.Row
       a(x) = oCell.DataArray(0)
       x = x +1
  Next 
   Dati = a
Else
   Dati = CellRange.getDataArray
End if  
   
   svc = createUnoService("com.sun.star.sheet.FunctionAccess")
   Dati1 =  svc.callFunction("TRANSPOSE", Array(Dati))
   LB.getModel.StringItemList = Dati1(0)
  
   Call RemoveSheetFilter()

End sub

Sub List_Ordine
Dim Sheet
Dim MyCounter
Sheet = ThisComponent.Sheets(0)
MyCounter = Arr(LB.selectedItemPos)+1
oDialogo1.getControl("TextField2").text = Sheet.getCellRangeByName("A" & MyCounter).String
oDialogo1.getControl("TextField3").text = Sheet.getCellRangeByName("B" & MyCounter).String 
oDialogo1.getControl("TextField4").text = Sheet.getCellRangeByName("C" & MyCounter).String 
oDialogo1.getControl("TextField5").text = Sheet.getCellRangeByName("D" & MyCounter).String
oDialogo1.getControl("TextField6").text = Sheet.getCellRangeByName("E" & MyCounter).String

End Sub

Sub RemoveSheetFilter()
  Dim oSheet          ' Sheet to filter.
  Dim oFilterDesc     ' Filter descriptor.
 
  oSheet = ThisComponent.getSheets().getByIndex(0)
  oFilterDesc = oSheet.createFilterDescriptor(True)
  oSheet.filter(oFilterDesc)
End Sub
Ci interessa sapere come va in termini di velocità
LibreOffice 7.2.2.2 windows 10
Openoffice 4.1.13 su windows 10
patel
Volontario attivo
Volontario attivo
Messaggi: 4030
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: caricamento listbox lento

Messaggio da patel »

l'hai testata Gaetano ? a me da errore, non hai corretto il riempimento di arr
-------------------
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: 3316
Iscritto il: mercoledì 21 novembre 2012, 20:07

Re: caricamento listbox lento

Messaggio da Gaetanopr »

hai ragione, non l'ho testata, oggi sono proprio fuori fase dimentico sempre l'array Arr.
Comunque così dovrebbe andare

Codice: Seleziona tutto

Dim Sheet
Dim oDialogo1
Dim LB as object
Dim oTextBox
Dim Arr()
Dim ranges

Sub Trasf_Bc
DialogLibraries.LoadLibrary("Standard")
oDialogo1 = CreateUnoDialog(DialogLibraries.Standard.Dialog1)
oDialogo1.Title = "Trasferimento Prodotti"
oDialogo1.getControl("TextField1").Enable = TRUE 
oDialogo1.getControl("TextField2").Enable = FALSE 
oDialogo1.getControl("TextField3").Enable = FALSE
oDialogo1.getControl("TextField4").Enable = FALSE
oDialogo1.getControl("TextField5").Enable = FALSE
oDialogo1.getControl("TextField6").Enable = FALSE
LB = oDialogo1.getControl("ListBox1")
oTextBox = oDialogo1.getControl("TextField1")
Call Option_bc
oDialogo1.Execute()
oDialogo1.dispose()
End Sub

Sub Option_bc 
Dim oCell
Dim oFilterDesc  ' Filter descriptor.
Dim oFields(0) As New com.sun.star.sheet.TableFilterField2  '
Sheet = ThisComponent.Sheets(0)
LB.removeItems(0,LB.getItemCount())
Daric = UCase(oTextBox.Text)

c = Sheet.createCursor
c.gotoEndOfUsedArea(false)
LastRow = c.RangeAddress.EndRow + 1
CellRange = Sheet.getCellRangeByName("A2:A" & LastRow)
oFilterDesc = CellRange.createFilterDescriptor(True)

  With oFields(0)
      .Field = 0
      .Operator = com.sun.star.sheet.FilterOperator2.BEGINS_WITH
      .StringValue = Daric
  End With
oFilterDesc = CellRange.createFilterDescriptor(True)

With oFilterDesc
    .ContainsHeader = False
    .CopyOutputData = False
    .FilterFields2 = oFields()
    
End With    

CellRange.filter(oFilterDesc)
ranges = CellRange.queryVisibleCells()

If Ubound(ranges.RowDescriptions) > -1 Then 
  ReDim Arr(0 To Ubound(ranges.RowDescriptions))
  Dim a(0 To Ubound(ranges.RowDescriptions))
  For Each oCell in ranges.Cells
       Arr(x) = oCell.CellAddress.Row
       a(x) = oCell.DataArray(0)
       x = x +1
  Next 
   Dati = a
Else
   Dati = CellRange.getDataArray
End if  
   
   svc = createUnoService("com.sun.star.sheet.FunctionAccess")
   Dati1 =  svc.callFunction("TRANSPOSE", Array(Dati))
   LB.getModel.StringItemList = Dati1(0)
  
   Call RemoveSheetFilter()

End sub

Sub List_Ordine
Dim Sheet
Dim MyCounter
Sheet = ThisComponent.Sheets(0)
If Ubound(ranges.RowDescriptions) > -1 Then 
   MyCounter = Arr(LB.selectedItemPos)+1
else
   MyCounter = LB.selectedItemPos+2
End if
oDialogo1.getControl("TextField2").text = Sheet.getCellRangeByName("A" & MyCounter).String
oDialogo1.getControl("TextField3").text = Sheet.getCellRangeByName("B" & MyCounter).String 
oDialogo1.getControl("TextField4").text = Sheet.getCellRangeByName("C" & MyCounter).String 
oDialogo1.getControl("TextField5").text = Sheet.getCellRangeByName("D" & MyCounter).String
oDialogo1.getControl("TextField6").text = Sheet.getCellRangeByName("E" & MyCounter).String

End Sub

Sub RemoveSheetFilter()
  Dim oSheet          ' Sheet to filter.
  Dim oFilterDesc     ' Filter descriptor.
 
  oSheet = ThisComponent.getSheets().getByIndex(0)
  oFilterDesc = oSheet.createFilterDescriptor(True)
  oSheet.filter(oFilterDesc)
End Sub
LibreOffice 7.2.2.2 windows 10
Openoffice 4.1.13 su windows 10
Luka2017
Messaggi: 69
Iscritto il: giovedì 16 febbraio 2017, 11:59

Re: caricamento listbox lento

Messaggio da Luka2017 »

a me funziona !!!
l'ultima cosa
che se metto un nome che non è presente nell'elenco nella listbox sparisca tutto l'elenco
Gaetanopr
Volontario
Volontario
Messaggi: 3316
Iscritto il: mercoledì 21 novembre 2012, 20:07

Re: caricamento listbox lento

Messaggio da Gaetanopr »

Non può funzionarti, nelle textbox vengono riportati dati errati con la prima macro.
Comunque spero tu non cambi ancora idea, devi avere le idee chiare.

Codice: Seleziona tutto

Dim Sheet
Dim oDialogo1
Dim LB as object
Dim oTextBox
Dim Arr()
Dim ranges

Sub Trasf_Bc
DialogLibraries.LoadLibrary("Standard")
oDialogo1 = CreateUnoDialog(DialogLibraries.Standard.Dialog1)
oDialogo1.Title = "Trasferimento Prodotti"
oDialogo1.getControl("TextField1").Enable = TRUE 
oDialogo1.getControl("TextField2").Enable = FALSE 
oDialogo1.getControl("TextField3").Enable = FALSE
oDialogo1.getControl("TextField4").Enable = FALSE
oDialogo1.getControl("TextField5").Enable = FALSE
oDialogo1.getControl("TextField6").Enable = FALSE
LB = oDialogo1.getControl("ListBox1")
oTextBox = oDialogo1.getControl("TextField1")
Call Option_bc
oDialogo1.Execute()
oDialogo1.dispose()
End Sub

Sub Option_bc 
Dim oCell
Dim oFilterDesc  ' Filter descriptor.
Dim oFields(0) As New com.sun.star.sheet.TableFilterField2  '
Sheet = ThisComponent.Sheets(0)
LB.removeItems(0,LB.getItemCount())
Daric = UCase(oTextBox.Text)

c = Sheet.createCursor
c.gotoEndOfUsedArea(false)
LastRow = c.RangeAddress.EndRow + 1
CellRange = Sheet.getCellRangeByName("A2:A" & LastRow)
oFilterDesc = CellRange.createFilterDescriptor(True)

  With oFields(0)
      .Field = 0
      .Operator = com.sun.star.sheet.FilterOperator2.BEGINS_WITH
      .StringValue = Daric
  End With
oFilterDesc = CellRange.createFilterDescriptor(True)

With oFilterDesc
    .ContainsHeader = False
    .CopyOutputData = False
    .FilterFields2 = oFields()
    
End With    

CellRange.filter(oFilterDesc)
ranges = CellRange.queryVisibleCells()

Dim Dati()
If Ubound(ranges.RowDescriptions) > -1 Then 
  ReDim Arr(0 To Ubound(ranges.RowDescriptions))
  Dim a(0 To Ubound(ranges.RowDescriptions))
  For Each oCell in ranges.Cells
       Arr(x) = oCell.CellAddress.Row
       a(x) = oCell.DataArray(0)
       x = x +1
  Next 
   Dati = a
Elseif Len(Daric) = 0 Then
   Dati = CellRange.getDataArray
End if  
      If Ubound(Dati) > - 1 Then
         svc = createUnoService("com.sun.star.sheet.FunctionAccess")
         Dati1 =  svc.callFunction("TRANSPOSE", Array(Dati))
         LB.getModel.StringItemList = Dati1(0)
      End If
   Call RemoveSheetFilter()

End sub

Sub List_Ordine
Dim Sheet
Dim MyCounter
Sheet = ThisComponent.Sheets(0)
If Ubound(ranges.RowDescriptions) > -1 Then 
   MyCounter = Arr(LB.selectedItemPos)+1
else
   MyCounter = LB.selectedItemPos+2
End if
oDialogo1.getControl("TextField2").text = Sheet.getCellRangeByName("A" & MyCounter).String
oDialogo1.getControl("TextField3").text = Sheet.getCellRangeByName("B" & MyCounter).String 
oDialogo1.getControl("TextField4").text = Sheet.getCellRangeByName("C" & MyCounter).String 
oDialogo1.getControl("TextField5").text = Sheet.getCellRangeByName("D" & MyCounter).String
oDialogo1.getControl("TextField6").text = Sheet.getCellRangeByName("E" & MyCounter).String

End Sub

Sub RemoveSheetFilter()
  Dim oSheet          ' Sheet to filter.
  Dim oFilterDesc     ' Filter descriptor.
 
  oSheet = ThisComponent.getSheets().getByIndex(0)
  oFilterDesc = oSheet.createFilterDescriptor(True)
  oSheet.filter(oFilterDesc)
End Sub
LibreOffice 7.2.2.2 windows 10
Openoffice 4.1.13 su windows 10
Luka2017
Messaggi: 69
Iscritto il: giovedì 16 febbraio 2017, 11:59

Re: caricamento listbox lento

Messaggio da Luka2017 »

mi da' variabile non impostata su

Codice: Seleziona tutto

      If Ubound(Dati) > - 1 Then
Rispondi