Condividi:        

filtrare dati colonna con 2 combobox da file esterno

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

filtrare dati colonna con 2 combobox da file esterno

Postdi maxkoala » 23/09/13 19:36

Salve a tutti,

una richiesta semplice se possibile.

In sintesi ho un codice VBA ,riprodotto da altri , che utilizza due combobox , le quali vengono pololate attraverso un altro codice vba "upload" che estrae i dati di un data base di un file esterno.

il codice funziona bene in tutte le sue parti ma si pone il seguente il problema :

tutte e due le combobox visualizzano tutti i dati delle colonne ad esse associate , mentre vorrei che la combobox "SO"(la 2°) visualizasse solo i dati filtrati dal dato scelto nella combobox "status".

il codice VBA è il seguente

Private Sub cmbStatus_Change()

End Sub

'SE NN FUNZIONA PROVARE A METTERE LA COLONNA SO VICINO A QUELLA STATUS
'questa subroutine cancella e resetta i dati
Private Sub cmdReset_Click()
'cancello le command_box
Sheets("View").Select
Sheets("View").Visible = True
'Sheets("View").Select
cmbStatus.Clear
cmbSO.Clear
'faccio in modo che il codice selezioni la pagina 'View' e le caselle
'dove inserire i dati
Range("E22:K22").Select
'Range("dataSet").Select
'cancella anche i dati che si sono caricati
Range(Selection, Selection.End(xlDown)).ClearContents

End Sub

'questa subroutine definisce cosa accade se clicco il pulsante show data
Private Sub cmdShowData_Click()
'strSQL sta per stringa definita con il Structured Query Language, cioè
'quello che riempirà la mia tabella dei dati
strSQL = "SELECT * FROM [data$] WHERE"
If cmbStatus.Text <> "" Then
'le parentesi quadre dovrebbero dire al computer che 'Status' è una classe
strSQL = strSQL & " [Status]='" & cmbStatus.Text & "'"
End If

If cmbSO.Text <> "" Then
If cmbStatus.Text <> "" Then
strSQL = strSQL & " AND [SO]='" & cmbSO.Text & "'"
Else
strSQL = strSQL & " [SO]='" & cmbSO.Text & "'"
End If
End If

'qui estraggo i dati e voglio specificare che non tutte le comboBox devono essere
'necessariamente piene, basta che una sola sia diversa da 'vuoto'
If cmbStatus.Text <> "" Or cmbSO.Text <> "" Then

'ora estraggo i dati (stringhe più o meno fisse da copiare)
closeRS
OpenDB

rs.Open strSQL, cnn, adOpenKeyset, adLockOptimistic

'ora va a vedere i dati nella pagina 'data'
If rs.RecordCount > 0 Then
'qui ripeto i codici anche se li avevo messi già nella subroutine Reset perchè una
'volta che una subroutine viene chiusa, tutti i codici dentro muoiono per il sistema
Sheets("View").Visible = True
Sheets("View").Select
Range(Selection, Selection.End(xlDown)).ClearContents

'questo è il codice che finalmente mi copia tutti i dati che voglio riportare
ActiveCell.CopyFromRecordset rs

' se nella tabella dati non trova nessun risultato dai un messaggio di errore dove
'compare anche un triangolo giallo e il tasto ok
Else
MsgBox "I was not able to find any matching records.", vbExclamation + vbOKOnly
Exit Sub
End If
End If
End Sub

'subroutine che dice cosa fa il tasto upload
Private Sub cmdUpload_Click()
strSQL = "Select distinct [Status] from [data$] Order by [Status] "
closeRS
OpenDB
cmbStatus.Clear

rs.Open strSQL, cnn, adOpenKeyset, adLockPessimistic
If rs.RecordCount > 0 Then
Do While Not rs.EOF
cmbStatus.AddItem rs.Fields("Status").Value & ""
rs.MoveNext
Loop
Else
MsgBox "I was not able to find any unique Products.", vbCritical + vbOKOnly
Exit Sub
End If
'----------------------------------------------------------------------------------
strSQL = "Select distinct [SO] from [data$] Order by [SO] "
closeRS
OpenDB
cmbSO.Clear

rs.Open strSQL, cnn, adOpenKeyset, adLockPessimistic
If rs.RecordCount > 0 Then
Do While Not rs.EOF

cmbSO.AddItem rs.Fields("SO").Value & ""
rs.MoveNext
Loop
Else
MsgBox "I was not able to find any unique Products.", vbCritical + vbOKOnly
Exit Sub
End If

End Sub

questo invece è il codice che ricerca il file (esterno) nel quale è presente il database

Option Explicit
Public cnn As New ADODB.Connection
Public rs As New ADODB.Recordset
Public strSQL As String

Public Sub OpenDB()
If cnn.State = adStateOpen Then cnn.Close
cnn.ConnectionString = "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=C:\Users\Mas\Desktop\esercizi\MODS.xlsm"

cnn.Open
End Sub

Public Sub closeRS()
If rs.State = adStateOpen Then rs.Close
rs.CursorLocation = adUseClient
End Sub

grazie in anticipo :D
maxkoala
Utente Junior
 
Post: 31
Iscritto il: 09/02/13 18:35

Sponsor
 

Re: filtrare dati colonna con 2 combobox da file esterno

Postdi Anthony47 » 24/09/13 01:45

Per evitare equivoci, parli di Access?

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

Re: filtrare dati colonna con 2 combobox da file esterno

Postdi maxkoala » 24/09/13 07:04

No , io uso questo codice nell'ambito excel su excel , e funziona egregiamente !ora , mi fai venire qualche dubbio , che il codice che ho copiato fosse in realtà un esempio di estrazione dati da Access a excel !
maxkoala
Utente Junior
 
Post: 31
Iscritto il: 09/02/13 18:35

Re: filtrare dati colonna con 2 combobox da file esterno

Postdi maxkoala » 26/09/13 07:29

ciao , non capisco se avete bisogno di altre informazioni ,per andare avanti , perchè , sto provando a modificare il codice ma non ottengo il risultato voluto !
maxkoala
Utente Junior
 
Post: 31
Iscritto il: 09/02/13 18:35

Re: filtrare dati colonna con 2 combobox da file esterno

Postdi Anthony47 » 26/09/13 14:01

E' che per lavorare su quanto hai pubblicato bisogna ricreare un ambiente sconosciuto; e se anche fosse conosciuto richiederebbe tempo, cosa in genere rara.

Comunque, per quello che si riesce a seguire nel codice pubblicato, il caricamento dei due combobox avviene nella stessa "Sub cmdUpload_Click", senza interruzione che consenta una scelta in Status con cui poter condizionare il caricamento di SO.
Potresti immaginare che la Sub cmdUpload_Click invece scarichi i suoi dati su due colonne excel, e usi poi queste colonne per alimentare i due combobox separatamente. Pero' dici che vorresti inserire in SO solo i dati filtrati da quanto scelto in Status, ma la relazione tra Status e SO e' definita altrove, quindi anche scaricare su due colonne Excel non risolve.
A spanne direi che devi lavorare nella strSQL = "Select distinct [SO] from [data$] Order by [SO] ", per fare una estrazione gia' filtrata dalla relazione che hai impostato.
Quindi, sempre a spanne:
-nella Sub cmdUpload_Click caricare solo cmbStatus (basta eliminare tutte le righe da '-------------- in avanti, eccetto End Sub)
-nella Private Sub cmbStatus_Change (ora vuota) inserire la seconda parte del codice rimosso da Sub cmdUpload_Click, MA modificando la "strSQL = etc etc" per inserire la relazione SO inclusa nella corrente scelta in cmbStatus.

Spero che quanto detto ti sia di qualche utilita'.

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

Re: filtrare dati colonna con 2 combobox da file esterno

Postdi maxkoala » 26/09/13 16:55

Ciao , ti ringrazio per il tentativo ,ma mi accorgo ,ora ,che la premessa era sbagliata! per cui non credo di continuare oltre !
la cosa che mi ha tratto in inganno e che ho provato il codice nell'ambito di excel (2007), e la cosa ha funzionato bene ! ; ma nel momento in cui ho riversato il tutto su excel 2003 molte delle funzioni non erano presenti nella libreria e quindi era chiaro che la cosa non avrebbe funzionato!
L'unica cosa che posso chiedervi è : potete darmi indicazione di topic che trattino il problema ! sempre che sia chiaro quello che avevo intenzione di fare ?
Vi ringrazio comunque dell'attenzione
maxkoala
Utente Junior
 
Post: 31
Iscritto il: 09/02/13 18:35

Re: filtrare dati colonna con 2 combobox da file esterno

Postdi Anthony47 » 27/09/13 01:06

Se parli di popolare due combobox, di cui il secondo con valori condizionati dalla selezione fatta nel primo combobox, allora:
-il primo combobox lo popoli con la lista principale usando la sua proprieta' RowSource
-il secondo invece lo popoli usando la macro di evento Combobox1_Change in cui:
-pulisci il contenuto del secondo combobox (Combobox2.Clear)
-usi AddItem per inserire da zero le nuove voci; qualcosa come
If CONDIZIONE=Combobox1.Value then Combobox2.AddItem IlValore

Ad esempio se i dati complessivi sono su Foglio1-A1:B20 del tipo
Codice: Seleziona tutto
Col A----Col B
Alfa      147
Alfa      159
Alfa      MiTo
Alfa      Giulietta
Fiat      Punto
Fiat      Bravo
Fiat      Duna
Lancia    Musa
Lancia    Dedra

allora la tua Sub ComboBox1_Change sara' del tipo
Codice: Seleziona tutto
Private Sub ComboBox1_Change
Combobox2.Clear
LastColonnaB=Sheets("Foglio1").Cells(Rows.count,2).End(xlUp).Row
For I=1 to LastColonnaB
    If Cells(I,1)=Combobox1.Value Or Combobox1.Value="" then Combobox2.AddItem Cells(I,2)
Next I
End Sub

Presuppone che Combobox1 contenga le marche richiamate poi in A1 e sottostanti.

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


Torna a Applicazioni Office Windows


Topic correlati a "filtrare dati colonna con 2 combobox da file esterno":


Chi c’è in linea

Visitano il forum: Nessuno e 54 ospiti