Sorteren met een knop en een macro

Status
Niet open voor verdere reacties.

popmarter

Gebruiker
Lid geworden
3 jan 2008
Berichten
51
Hallo, ik heb een knop waarmee ik een bepaalde tabel wil sorteren van A-Z.

Ik dacht bij On Click event een macro te koppelen met in de macro bij Action 'apply filter' te doen. Bij de Where condition zet ik dan de tabelnaam tussen [ ]. Maar wat moet ik waar zetten om het van A-Z (of Z-A) te sorteren?
 
Met een functie kun je vrij simpel en flexibel sorteren. De functie zet je in een willekeurige Module.

Code:
Function fSort(frmName As String, fldName As String)
Dim sTmp() As String, i As Integer, sSort As String
sSort = ""
If Forms(frmName).OrderBy = fldName Then
    Forms(frmName).OrderByOn = True
    If InStr(1, fldName, ",") > 0 Then
        sTmp = Split(fldName, ",")
        For i = 0 To UBound(sTmp)
            sTmp(i) = Trim(sTmp(i))
            If i = 0 Then
                sSort = sSort & sTmp(i) & " DESC"
            Else
                sSort = sSort & sTmp(i) & " ASC"
            End If
            If i < UBound(sTmp) Then sSort = sSort & ", "
        Next i
        Forms(frmName).OrderBy = sSort
    Else
        Forms(frmName).OrderBy = fldName & " DESC"
    End If
Else
    Forms(frmName).OrderByOn = True
    Forms(frmName).OrderBy = fldName
End If
End Function
Je gebruikt de code als volgt, bijvoorbeeld door een Click gebeurtenis aan een label te hangen.
Code:
Private Sub lblVoornaam_Click()
    
    fSort Me.Form.Name, "Voornaam"
End Sub
Private Sub lblAchternaam_Click()
    
    fSort Me.Form.Name, "Voornaam"
End Sub
 
Ok, hier mijn poging beschreven.

Ik heb in de bovenste code alle 'frmName' vervangen door de naam van mijn form waar de sortering plaats moet vinden.
Tevens heb ik in de code alle 'fldName' vervangen door de naam van de tabel waar ik van A-Z wil sorteren.
Deze aangepaste code heb ik in een nieuwe module geplakt. de module heet module1.

Is dit goed?
Wat moet ik hierna doen?
 
Ik vermoed dat je een beetje te enthousiast bent geweest, en iets teveel hebt gedaan ;)

De functie zoals ik 'm heb gepost is prima, en daar hoef je geen letter aan te veranderen. Da's wel zo makkelijk :) Wat je wel moet doen: op de plek waar je de code wilt gebruiken, een <Bij klikken> gebeurtenis maken. Daarvoor heb ik twee voorbeeldjes gegeven, namelijk een veld [Voornaam] met in de koptekst een label [lblVoornaam], en een veld [Achternaam], waarvan het label [lblAchternaam] heet. Deze labels hebben een gebeurtenis gekregen, zodat, als je er op klikt, een actie wordt uitgevoerd. Namelijk:
fSort Me.Form.Name, "Voornaam" dan wel fSort Me.Form.Name, "Achternaam".
Zoals je ziet, bestaat de actieregel uit twee elementen. Je roept de Functie aan (met fSort) en je geeft twee parameters mee: de naam van het huidige formulier (met Me.Form.Name) en de naam van het tabelveld waarop je wilt sorteren. Bij voornaam sorteer je op het veld Voornaam, bij Achternaam uiteraard op Achternaam.

In de functie worden formuliernaam en veldnaam vervolgens weer benoemd:
Function fSort(frmName As String, fldName As String)
De eerste waarde wordt toegewezen aan de variabele frmName (en is dus de formuliernaam die je met Me.Form.Name hebt meegegeven); de tweede variabele heet fldName, en bevat de veldnaam die je mee hebt gegeven ("Voornaam" of "Achternaam")

Kortom: probeer het nog een keer, maar laat nu de functie in tact, en verander alleen de actie fSort [Formuliernaam], [Veldnaam] naar je eigen situatie. En kies de juiste plek waar je de actie wilt laten uitvoeren. Dat kan <Bij klikken> zijn, of <Bij Dubbelklikken>.
 
Ik heb nu de code ongewijzigd in de module1 geplakt en opgeslagen.

Vervolgens een commandbutton gemaakt en bij On Click de code ingevoerd van boven, enigzins aangepast:

Code:
Private Sub Command179_Click()
     fSort Me.Patiënten, "Teammanager"
End Sub

Patiënten = naam van het formulier dat open staat en waar de knop zich bevindt.
Teammanager = naam van de kolom die ik graag AZ/ZA wil sorteren.

Ik krijg een foutmelding:

"runtime error 2450. [Naamdatabase] can't find the form 'Patient 2" referred to in a macro expression or Visual Basic Code."

Debug levert een gele balk op in de module bij de regel: If Forms(frmName).OrderBy = fldName Then

Nu staat 'Patient 2' als eerste vermeld in een tabel met naam Patiënten. Dus ik dacht die dan te vervangen door Teammanager. Dat levert een min of meer zelfde foutmelding op. Alleen wordt dan niet Patient 2 niet gevonden maar de naam van de teammanager die als eerste genoemd staat in de tabel.

Nogmaals :) Wat doe ik fout? Voor de duidelijkheid. De naam van de teammanager in dit formulier komt er via een keuze (dropdown) in een ander formulier wat dus hangt aan een tabel met namen van managers. Ik weet niet of dit uitmaakt?

Edit:
Hmmm....zou dat 'Name' misschien moeten blijven staan in: fSort Me.Patiënten.Name, "Teammanager" ?

Edit: volgens mij werkt het .....mijn database is half gevuld, wat mij even doet twijfelen. Even verder proberen...

Edit:
HET WERKT!! Echt superbedankt!! Handig die module, want nu kan ik overal knoppen maken met On Click events, vervolgens een kleine aanpassing in de code en klaar! Gaat weer een stukje ACCESS-wereld open :)
 
Laatst bewerkt:
Je oorspronkelijke fout werd veroorzaakt doordat je de aanroep verkeerd deed:
Code:
Private Sub Command179_Click()
     fSort Me.Patiënten, "Teammanager"
End Sub
Me.Patiënten is namelijk niks.... Ofwel je roept hem zo aan:
Code:
     fSort "Patiënten", "Teammanager"
Waabij je de formuliernaam LETTERLIJK intypt, ofwel je gebruikt een functie om de formuliernaam automatisch uit te lezen:
Code:
     fSort Me.Form.Name, "Teammanager"
Waarbij je met Me.Form.Name dus de naam van het huidige formulier gebruikt.
Jouw oplossing: fSort Me.Patiënten is eigenlijk van alles niks, want je haalt de formuliernaam niet automatisch op, maar je moet hem alsnog zelf typen. Ik zou dus mijn methodiek gebruiken, al was het maar omdat je die blindelings, zonder hem veel aan te passen (alleen de naam van het sorteerveld) kunt gebruiken.
 
Inderdaad, ik zie het nu, met : fSort Me.Form.Name, "Teammanager" werkt het al :cool:
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan