Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2012
    Messaggi
    6

    VBA di Excel: combobox per filtrare dati

    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

  2. #2

    Moderazione

    I linguaggi di famiglia VB vanno nell'apposita sottosezione, sposto.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    A volte è impossibile dare una soluzione perchè c'è spesso differenza tra ciò che si spiega (e quello che legge capisce), il codice che si posta (a volte insufficiente) e quello che servirebbe sapere (ma che non è spiegato).

    A mio avviso, fai prima e meglio a postare direttamente il file Excel.
    Chi vorrà aiutarti potrà testare il tuo codice e fare le prove per trovare il problema e la soluzione.

    Devi renderti conto che in questi casi è molto difficile 'riprodurre' lo scenario su cui lavori tu, spesso è impossibile.


  4. #4
    Utente di HTML.it
    Registrato dal
    Oct 2012
    Messaggi
    6
    faccio un esempio pratico:
    nella tabella origine dei miei dati ho due colonne
    Status SO
    Active 1
    Active 2
    Booked 3
    Booked 4
    Per come è il mio file ora, carico i dati usando la Private subroutine "cmdUpload_Click" (di cui ho copiato l'intero codice) che mi fa comparire come lista di possibilità nella combobox1, Active o Booked.
    Io vorrei che selezionando per esempio "Active", nella combobox 2 le uniche opzioni possibili fossero 1 e 2. Invece ora la lista delle voci che posso selezionare è 1, 2, 3 e 4.
    Ovviamente se per esempio seleziono nella combobox1 "Active" e nella combobox2 "3", mi da il messaggio "I was not able to find any matching record", però io vorrei proprio non avere la possibilità di selezionare 3 e 4 nella combobox2.
    Spero che sia più chiaro.
    Posso caricare anche il mio file excel per intero. Come si fa però?

  5. #5
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    per allegare un file è semplice:

    fai clic sul pulsante Seleziona file sotto la finestra di composizione.


  6. #6
    Utente di HTML.it
    Registrato dal
    Oct 2012
    Messaggi
    6
    ok...grazie
    stasera appena potrò collegarmi da casa e non dall'ufficio vi caricherò il file perchè da qui i settaggi della connessione non me lo permettono


    Vi ringrazio per la pazienza!!

  7. #7
    Utente di HTML.it
    Registrato dal
    Oct 2012
    Messaggi
    6
    Non posso caricare il file Excel perchè il formato xlsm non me lo fa caricare....
    C'è un'altro modo?

    Intanto vi mando il link dove è possibile scaricare una copia...sperando che funzioni
    http://uploading.com/files/get/1f4c7...essModel1.xlsm

    Allora come vi dicevo vorrei fare 2 cose:
    1°: che le due combobox fossero in qualche modo collegate, cioè se nella combo1 scelgo una certa opzione, vorrei che la seconda si autofiltrasse in base appunto alla decisione fatta in combo1... Vorrei però che si verificasse anche il contrario, cioè scelgo prima di mettere la combo2, vorrei che la combo1 a sua volta si filtrasse anchessa.

    2°: La seconda cosa che vorrei fare invece è mettere la tabella origine dei dati, quella nel foglio1 chiamato "data"..... in un file excel completamente esterno, cioè in un altro woorksheet, diverso da quello dove effettivamente applico il filtraggio dei dati.

    Mi sapreste dire i cambiamente da fare sul mio codice?

    Vi ringrazio tantissimo!

    PS: certe volte quando salvo una nuova copia del file excel e la apro mi da un errore del tipo...
    run-error [OBDC Excel driver] Data type mismatch in criteria expression....
    Se vi da questo errore posso provare a caricare un altro file... o magari siete in grado di dirmi perchè certe c'è questo errore.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.