Salve a tutti.
Sto cercando di creare delle combobox per filtrare dei dati su un file excel. La tabella origine dei dati è su un foglio chiamato "data"; su il secondo foglio "View" dello stesso file ho creato 3 pulsanti con 2 combobox dove filtrare i dati e avere ciò che mi serve.
Premetto che ho APPENA iniziato a vedere il codice VBA di excel e non ho assolutamente competenze in programmazione. Tutto quello che so è perchè dalla scorsa settimana ho trovato un po di esempi di codice su internet e li ho in qualche modo cercati di capire per riprodurli.
Copio qui il codice che ho scritto relativo ai pulsanti "Upload", doce carico i valori nella combobox; e il pulsante "Show data", che mi filtra i dati che cerco. (il terzo tasto è reset ma è inutile che ve lo copio)
codice:
Private Sub cmdShowData_Click()
strSQL = "SELECT * FROM [data$] WHERE"
If cmbStatus.Text <> "" Then
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
If cmbStatus.Text <> "" Or cmbSO.Text <> "" Then
closeRS
OpenDB
rs.Open strSQL, cnn, adOpenKeyset, adLockOptimistic
If rs.RecordCount > 0 Then
Sheets("View").Visible = True
Sheets("View").Select
Range(Selection, Selection.End(xlDown)).ClearContents
ActiveCell.CopyFromRecordset rs
Else
MsgBox "I was not able to find any matching records.", vbExclamation + vbOKOnly
Exit Sub
End If
End If
End Sub
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(0)
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(0)
rs.MoveNext
Loop
Else
MsgBox "I was not able to find any unique Products.", vbCritical + vbOKOnly
Exit Sub
End If
End Sub
La connessione tra la tabella origine dei miei dati e il foglio "View" la faccio in un modulo a parte che copio qui:
codice:
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=" & _
ActiveWorkbook.Path & Application.PathSeparator & ActiveWorkbook.Name
cnn.Open
End Sub
Public Sub closeRS()
If rs.State = adStateOpen Then rs.Close
rs.CursorLocation = adUseClient
End Sub
Ho 2 domande da fare. La prima: Ora le 2 combobox sono tra loro indipendenti, cioè indipendentemente dalla voce che seleziono nella combobox1, mi compaiono nella combobox2 tutte le voci possibili che ci sono nella tabella origine dati. Invece io voglio che nella combobox 2 mi compaia la lista filtrata in base alla selezione della combobox1 e viceversa. Ho letto su altri post che bisogna cambiare la proprietà RowSource dopo che si verifica l'evento "selezione della combobox1". Giusto? Se si come si fa?
Un altro modo è utilizzando "SelectedIndexChanged" ma ancora se giusto non so come farlo.
Posso rompere le scatole a qualcuno e chiedere se me lo spiega in modo telegrafico?
Seconda domanda: Se il foglio "data" (dove c'è la tabella fonte dei miei dati) fosse su un altro file Excel, come dovrei fare?
Grazie in anticipo