Condividi:        

vba2003: listbox con checkbox

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

vba2003: listbox con checkbox

Postdi karug64 » 21/12/11 22:58

Salve a tutti.
Volevo chiedervi se e' possibile inserire su ogni riga di una listbox un checkbox.
Grazie
Office 2010
karug64
Utente Senior
 
Post: 746
Iscritto il: 20/11/11 21:22

Sponsor
 

Re: vba2003: listbox con checkbox

Postdi Anthony47 » 21/12/11 23:55

Eh, lo so che chiedere e' piu' facile, pero' la documentazione a che serve?
Se imposti la selezione multipla, allora impostando ListStyle = fmListStyleOption avrai su ogni riga il checkbox; se invece hai impotato la selezione singola, quel setting ti dara' un radiobutton.

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: vba2003: listbox con checkbox

Postdi karug64 » 22/12/11 18:18

Intanto grazie per la risposta.
Hai raguione l'enciclopedia online e' sicuramente piu' veloce .... ma questo non giustifica ....
Dimmi: ora ho i checkbox, ma se seleziono una riga col check come faccio a mettere nella cella A(x) della riga selezionata il valore VERO )o X ecc) senza avere un textbox ?
Grazie
Office 2010
karug64
Utente Senior
 
Post: 746
Iscritto il: 20/11/11 21:22

Re: vba2003: listbox con checkbox

Postdi Anthony47 » 22/12/11 22:29

Quindi tu dici: ho un listbox e tramite il checkbox seleziono una riga. Giusto?
Quello che dici dopo invece non l' ho capito: cosa intendi per A(x)? Da dove viene "Vero" oppure "X" oppure "ecc"?

Ciao.
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: vba2003: listbox con checkbox

Postdi karug64 » 22/12/11 22:56

Ciao Anthony.
Allora cerco di spiegarmi.
Sul foglio "BF" ho x colonne.
La colonna A e' vuota.
Carico tutto il foglio sul listbox1 con ListBox1.RowSource = "BF!A2:CC2000" (primo problema: il foglio "nasce" dal caricamento di un file txt e, quindi, puo' avere X+n colonne ed Y+n righe. Dopo aver caricato il file sul foglio eseguo il riempimento della listbox e dovrei passare i parametri giusti X,Y, ma non sapendo come fare, lo carico in abbondanza ... CC2000).

Dopo aver caricato il listbox1 (che e' multiselect) seleziono piu' righe.
Alla fine della selezione nell'evento click di un command dovrei inserire un codice che per ogni riga selezionata mi metta sulla corrispondete riga, nella colonna A, una "X". Ovviamente se nella colonna A c'e' gia' una X -perche' l'avevo gia' selezionata precedentemente, la deve togliere.

In poche parole, devo segnare/deselezionare sul foglio BF le righe selezionate sul listbox.

Spero di essermi speigato.
Grazie.
Office 2010
karug64
Utente Senior
 
Post: 746
Iscritto il: 20/11/11 21:22

Re: vba2003: listbox con checkbox

Postdi karug64 » 23/12/11 07:25

Dunque, ho trovato questa soluzione che, pero', prevede un doppio passaggio:
prima carico in un array le righe selezionate e poi rileggo il foglio e metto la X in colonna a sulle righe.
Se ci dovesse essere (come sono sicuro che ci sia...) una soluzione piu' immediata e veloce ... grazie

Private Sub CommandButton4_Click()

Dim Selezionati() As Integer
Dim Ind As Integer
Ind = -1
For K = 0 To ListBox1.ListCount - 1
If ListBox1.Selected(K) Then
Ind = Ind + 1
ReDim Preserve Selezionati(Ind)
Selezionati(Ind) = K + 2
End If
Next K

For X = 0 To Ind
If Selezionati(X) <> 0 Then
If Sheets("BF").Cells(Selezionati(X), 1) = "X" Then
Sheets("BF").Cells(Selezionati(X), 1) = ""
ElseIf Sheets("BF").Cells(Selezionati(X), 1) = "" Then
Sheets("BF0").Cells(Selezionati(X), 1) = "X"
End If
End If
Next X

ListBox1.RowSource = "BF!A2:CC2000"

end sub
Office 2010
karug64
Utente Senior
 
Post: 746
Iscritto il: 20/11/11 21:22

Re: vba2003: listbox con checkbox

Postdi Anthony47 » 23/12/11 14:22

Prima un po' di teoria, sapendo che non finisce nel uoto...
Hai gia' imparato che ListIndex restituisce l' indice della riga selezionata, eventualmente tramite una cella ControlSource e BoundColumn=0; giustamente ora ti chiedi "ma se posso scegliere piu' righe come faccio?" La risposta e': usi la Proprietà Selected, che "Restituisce o imposta lo stato di selezione degli elementi di un controllo ListBox" (di ogni singola riga).
Dovrai quindi fare un loop per sondare tutti gli elementi della matrice restituita da Selected; ad esempio con un codice del tipo
Codice: Seleziona tutto
With Me.ListBox1
    For I = 0 To .ListCount - 1
        If .Selected(I) Then
            Sheets("Foglio3").Range(.RowSource).Range("A1").Offset(I, -1).Value = "X"
        Else: Sheets("Foglio3").Range(.RowSource).Range("A1").Offset(I, -1).ClearContents
        End If
        .Selected(I) = False  '<< Vedi testo
    Next I
End With


Questa scorre tutta la matrice Selected, se trova la riga selezionata mette una X nella colonna appena a sx del RowSource associato al listbox, oppure azzera quella cella, e poi cancella (tramite l' istruzione marcata <<) la selezione nel listbox.
Ovviamente logiche diverse comporteranno adattamenti al codice.

Senza nulla togliere alla macro che hai pubblicato, che ha il pregio di funzionare. Nota che la mia macro azzera le righe di col A non selezionate, la tua lavora solo sulle selezionate invertendo X con "vuoto" e viceversa; se la logica giusta e' questa seconda allora modifica tutto il blocco If /Endif in
Codice: Seleziona tutto
        If .Selected(I) Then
            if Sheets("Foglio3").Range(.RowSource).Range("A1").Offset(I, -1).Value = "X" Then
            Sheets("Foglio3").Range(.RowSource).Range("A1").Offset(I, -1)ClearContens
            Else: Sheets("Foglio3").Range(.RowSource).Range("A1").Offset(I, -1).Value= "X"
            End If
        End If


Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: vba2003: listbox con checkbox

Postdi karug64 » 23/12/11 19:01

Innanzitutto grazie (e non mi stanchero' mai di farlo) per la tempestiva soluzione.
Ho provato, ma ho un errore in questa riga:

Sheets("Bf0109").Range(.RowSource).Range("A1").Offset(i, -1).Value = "X"

errore 1004: errore definito dall'applicazione o dall'oggetto.

Inoltre io avevo gia' provato a testare l'elenco selected(), ma avevo il problema che non appena trovava il primo selected=true mi metteva la "X" ma poi usciva dal ciclo .... avevo letto che essendo una multiselect occoreva man mano porre a false il selected processato. Cosi' avevo scritto:

For i = 0 To listbox1.ListCount - 1
If listbox1.Selected(i) = true Then
Sheets("Bf").Range(...).value = "X"
listbox1.selected(X) = false
End If
Next i

ma dopo il primo elemento trovato esce fuori dal ciclo .... chissa' in cosa sbagliavo.
Ciao.
Office 2010
karug64
Utente Senior
 
Post: 746
Iscritto il: 20/11/11 21:22

Re: vba2003: listbox con checkbox

Postdi Anthony47 » 25/12/11 01:16

Ho provato, ma ho un errore in questa riga:
Codice: Seleziona tutto
Sheets("Bf0109").Range(.RowSource).Range("A1").Offset(i, -1).Value = "X"

errore 1004: errore definito dall'applicazione o dall'oggetto.


Secondo me quel "Bf0109" non e' lo stesso foglio da cui e' stato popolato (tramite RowSource) il listbox; pertanto Range(.RowSource) punta a un foglio che conflittua con Sheets("Bf0109").
Se veramente vuoi mettere le X su un foglio diverso da quello del RowSorce dovrai fare un piccolo giro supplementare, cioe' usare
Codice: Seleziona tutto
Sheets("Bf0109").Range(Range(.RowSource).Address).Range("A1").Offset(I, -1).Value = "X"


Fai sapere, ciao.
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea


Torna a Applicazioni Office Windows


Topic correlati a "vba2003: listbox con checkbox":


Chi c’è in linea

Visitano il forum: Ricky0185 e 42 ospiti