• Privacywetgeving
    Het is bij Helpmij.nl niet toegestaan om persoonsgegevens in een voorbeeld te plaatsen. Alle voorbeelden die persoonsgegevens bevatten zullen zonder opgaaf van reden verwijderd worden. In de vraag zal specifiek vermeld moeten worden dat het om fictieve namen gaat.

Msgbox alleen toepassen bij

Status
Niet open voor verdere reacties.

Jon12

Gebruiker
Lid geworden
10 apr 2017
Berichten
76
Beste allen,

Sinds kort ben ik bezig met tutorials over VBA omdat ik naast de gewone functies van Excel me ook hier in wil verdiepen. En daarbij niet alles wil hoeven te vragen, en dus toch hier... :eek:

Echter ben ik nu bezig met een code om een tabel te filteren via een inputbox, wat prima lukt, maar ik vastloop op het maken van een msgbox die alleen reageert wanneer de filter geen waarde oplevert. Mogelijk dat jullie mij hier toch mee kunnen helpen.

Ik heb van alles geprobeerd met "if not x then" en "if x is nothing then" en nog enkele statements meer, maar ik krijg slechts twee dingen voor elkaar. Of de msgbox wordt niet getoond. Of de msgbox wordt getoond bij zowel gevonden als niet gevonden waarden.
Uiteraard dient dit niet te gebeuren wanneer er wel waardes worden gevonden.

Wat doe ik fout?
 

Bijlagen

  • Inputbox + msgbox.xlsm
    17,4 KB · Weergaven: 21
Code:
Public Sub Filteren_ref()

    Dim LO As ListObject
    Dim x As Integer: x = Application.InputBox("Vul het ordernummer in", "Order")

    Set LO = Sheets("Blad1").ListObjects("Tabel2")
    LO.AutoFilter.ShowAllData
    With LO.Range
        .AutoFilter Field:=4, Criteria1:=x
    End With

    If Application.WorksheetFunction.Subtotal(3, LO.DataBodyRange) = 0 Then
        LO.Range.AutoFilter
        MsgBox "Waarde niet gevonden", vbOKOnly
    End If

End Sub
 
Code:
Sub M_snb[COLOR=#009]([/COLOR][COLOR=#009])[/COLOR]
  With Blad1[COLOR=#00F].[/COLOR]ListObjects[COLOR=#009]([/COLOR][COLOR=#F00]1[/COLOR][COLOR=#009])[/COLOR][COLOR=#00F].[/COLOR][URL="http://www.php.net/range"][COLOR=#00F]Range[/COLOR][/URL]
    [COLOR=#00F].[/COLOR]AutoFilter [COLOR=#F00]4[/COLOR][COLOR=#00F],[/COLOR] InputBox[COLOR=#009]([/COLOR][COLOR=#C00]"Vul het ordernummer in"[/COLOR][COLOR=#00F],[/COLOR] [COLOR=#C00]"Order"[/COLOR][COLOR=#009])[/COLOR]
    [COLOR=#060]If[/COLOR] [COLOR=#00F].[/COLOR]Columns[COLOR=#009]([/COLOR][COLOR=#F00]4[/COLOR][COLOR=#009])[/COLOR][COLOR=#00F].[/COLOR]SpecialCells[COLOR=#009]([/COLOR][COLOR=#F00]12[/COLOR][COLOR=#009])[/COLOR][COLOR=#00F].[/COLOR][URL="http://www.php.net/count"][COLOR=#00F]Count[/COLOR][/URL] [COLOR=#00F]=[/COLOR] [COLOR=#F00]1[/COLOR] Then MsgBox [COLOR=#C00]"afwezig"[/COLOR][COLOR=#00F],[/COLOR] [COLOR=#00F],[/COLOR] [COLOR=#C00]"snb  "[/COLOR]
  [URL="http://www.php.net/end"][COLOR=#00F]End[/COLOR][/URL] With
[URL="http://www.php.net/end"][COLOR=#00F]End[/COLOR][/URL] Sub
 
Dank jullie beiden voor de oplossingen. Bij de eerste oplossingen heb ik bij een tweede poging wel nog wat hick-ups.

De code van SNB werkt perfect. Maar om het zo eenvoudig te reduceren vereist wel een hele goede beheersing van de taal en zo goed spreek ik deze nog niet. Dus zelf zal ik nog met wat langere codes werken en langzaam moeten leren hoe dit in die verkorte methodes werkt. (nog meer tutorials etc.)

Ik ga de code van SNB wel toepassen.
Nu hoef ik alleen nog toe te voegen dat wanneer er voor annuleren wordt gekozen er gewoon niks gebeurt (dan is de melding niet nodig) en wanneer de melding wel nodig is dat dan alle waarden automatisch weer naar boven komen. (daar moet ik vanavond even voor gaan zitten).

In elk geval super bedankt voor de oplossingen :thumb:
 
Verander dit:
Code:
Dim x As Integer: x = Application.InputBox("Vul het ordernummer in", "Order")
in:
Code:
Dim x As Long
dim Antwoord as variant
Antwoord = Application.InputBox("Vul het ordernummer in", "Order")
If Len(Antwoord) = 0 Then Exit Sub
If Not IsNumeric(Antwoord) Then
    Msgbox "Getal invoeren svp"
    Exit Sub
End If
x = CLng(Antwoord)
 
Volgens mij kun je in de laatste parameter van application.inputbox al aangeven dat je een getal moet invullen
 
Enige wat ik er nog niet in krijg is (zonder andere aanpassingen) exit sub bij annuleren

Ik dacht aan één van deze regels toevoegen, maar geen succes.
If Len(Antwoord) is nothing then exit sub
If Len(Antwoord) = vbCancel then exit sub

Rest werkt perfect, dus nogmaals heel erg bedankt !!

Code:
Dim x As Long
Dim Antwoord As Variant
Antwoord = Application.InputBox("Vul het ordernummer in", "Order")
If Len(Antwoord) = 0 Then Exit Sub
If Not IsNumeric(Antwoord) Then
    MsgBox "Getal invoeren svp"
    Exit Sub
End If
x = CLng(Antwoord)

    Set LO = Sheets("Blad1").ListObjects("Tabel2")
    With LO.Range
        .AutoFilter Field:=4, Criteria1:=x
    End With

    If Application.WorksheetFunction.Subtotal(3, LO.DataBodyRange) = 0 Then
        LO.Range.AutoFilter
        MsgBox "Waarde niet gevonden", vbOKOnly
    End If
 
Zo moet er verplicht een getal ingevuld worden.
Bij annuleren van de inputbox zal de macro ook beëindigd worden. Bij 0 waarde idem dito.

Aanpassing in de macro van snb
Code:
Sub jv_snb()
c00 = Application.InputBox("Vul het ordernummer in", "Order", , , , , , 1)
 With Blad1.ListObjects(1).Range
    If c00 = False Then Exit Sub
      .AutoFilter 4, c00
        If .Columns(4).SpecialCells(12).Count = 1 Then
           MsgBox "Niet gevonden", , "Let op"
          .AutoFilter
        End If
  End With
End Sub
 
Je kunt je afvragen wat de informatieve waarde is van een msgbox waaruit hetzelfde blijkt als wat op het scherm al zichtbaar is: er is niets gefilterd.
Er is bovendien geen verschil in resultaat als in het invoervak een niet-aanwezige waarde wordt ingevuld of op 'cancel woirdt geslagen.
Ook hier brengt een bericht geen extra informatie.
Ik zou zeggen: waarom redundantie programmeren ?

Ik zou het beperken tot:

Code:
Sub M_snb()
  With Blad1.ListObjects(1).Range
       .AutoFilter 4, InputBox("ordernummer in", "Order")
        If .Columns(4).SpecialCells(12).Count = 1 Then .AutoFilter
   End With
End Sub

Maar waarom je de mogeljkheden van de kolomkop van het listobject niet gebruikt is me niet duidelijk.
Strikt genomen is de hele macro daarom overbodig en suboptimaal vergeleken met de listobject-filteropties.
 
Ik zie de toegevoegde waarde van een inputbox ook niet zo. Misschien zijn slicers wat voor je gebruikers?

Maar voor lering en vermaak: je zou de vba code ook zo kunnen schrijven:
Code:
Option Explicit

Public Sub Filteren_ref()

    Dim Ordernr As Long
    
    Ordernr = Application.InputBox(Prompt:="Vul het ordernummer in", Title:="Order", Type:=1)
    With Blad1.ListObjects(1)
        .AutoFilter.ShowAllData
        .Range.AutoFilter Field:=.ListColumns("Order").Index, Criteria1:=Ordernr
        If Application.WorksheetFunction.Subtotal(3, .DataBodyRange) = 0 Then
            .AutoFilter.ShowAllData
            MsgBox "Ordernr niet gevonden: " & Ordernr, vbOKOnly, "Mijn app"
        End If
    End With

End Sub
De laatste oplossing gaat overigens mis als een gebruiker ervoor kiest om de totaalregel aan te zetten. Dan moet de count = 2 zijn. Beter databodyrange gebruiken ipv range.
 

Bijlagen

  • Inputbox + msgbox.xlsm
    22,1 KB · Weergaven: 20
Dank jullie wel voor de antwoorden. Hier kom ik wel mee verder.

Om misschien enige nieuwsgierigheid te beantwoorden:

Slicers gaat niet zijn werk doen. De code is bedoeld voor een tabel met honderden verschillende referenties.
Daarnaast heb ik vier verschillende kolommen die allemaal een vorm van referentie bevatten.
Deze code heb ik dus maal 4.
Dan heb ik een hoofdcode met een inputbox. Voor de gebruikers is het dus een kwestie van op een knop klikken. Dan in de eerste inputbox een keuze van 1 t/m 4 maken om aan te geven wat voor soort referentie ze willen invoeren en dan in het volgende scherm (een van de 4 codes via select case) kunnen ze de daadwerkelijke code invoeren.

Daarnaast is het dus ook een stukje training met VBA. Het valt me wel op dat de verschillende dialecten in de taal grote afwijkingen hebben ;)

Maar nogmaals erg bedankt, hier kan ik echt goed mee vooruit en ik zal de status aanpassen.
 
Laatst bewerkt:
Je kunt het eenvoudig oplossen zonder die getrapte keus.
Je kunt de gebrtuiker het zoekwoord in laten vullen en vervolgens de kolom waarin de waarde gevonden wordt met autofilter filteren op de zoekwaarde.
Een ongeldige/ontbrekende zoekwaarde blijkt uit de ongefilterde tabel.
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan