• 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.

Compileerfout: End if zonder blok if

Status
Niet open voor verdere reacties.

WST

Gebruiker
Lid geworden
18 sep 2012
Berichten
27
Goedendag, ik gebruik in een Excel sheet een knop voor het mailen van het formulier. Nu wil is voor het verzenden eerst controleren of bepaalde velden zijn ingevoerd. Deze check kent 2 varianten, dit is afhankelijk van een waarde in (in dit geval NIEUWE MEDEWERKER).

Opzich werkt dit allemaal goed maar als ik de de codes combineer krijg ik onderstaande foutmelding:

Compileerfout:
End if zonder blok if


Ik begrijp de fout niet, ik heb gebprobeerd op er nog een 'end if' bij te plaatsen maar ik krijg het niet werkend.


Onderstaand de code, voor de duidelijkheid heb ik hem ook in bijgaand Word file geplakt. Het gele blok is de code controle op de velden en het opslaan. Het roze blok is de code voor het versturen via de mail.

Wie weet de oplossing voor mijn probleem en kan mij in de goede richting zetten.

Bvd
Sjoerd






Private Sub FORMULIER_VERZENDEN_Click()

'Zet het scherm stil
Application.ScreenUpdating = False

'EERST OPSLAAN IN PERSOONLIJKE MAP MET DE NAAM VAN DE (NIEUWE) MEDEWERKER
'Voor nieuwe medewerkers check op naam en telefoonnummer, voor wijz. en uitdienst alleen op naam.
If Range("SOORT_MUTATIE") = "NIEUWE MEDEWERKER" Then GoTo OPSL_NIEUW Else GoTo OPSL_OVERIG

OPSL_OVERIG:
'Controle op invoer van verplichte velden:
If Worksheets("Registratieformulier").Range("E24") = "" Then
MsgBox "U moet de naam van de medewerker invoeren voordat u op kunt slaan, rij 24.", vbCritical, "Naam ontbreekt!"
Else
ActiveWorkbook.SaveAs Filename:= _
"H:\" & [E22] & " - " & [E24] & ".xlsm"
End If
GoTo EINDE


OPSL_NIEUW:
'Controle op invoer van verplichte velden:
If Worksheets("Registratieformulier").Range("E24") = "" Then
MsgBox "U moet de naam van de medewerker invoeren voordat u op kunt slaan, rij 24.", vbCritical, "Naam ontbreekt!"
ElseIf Worksheets("Registratieformulier").Range("E26") = "" Then
MsgBox "U moet een telefoonnumer invullen voor contact met ICT, rij 26.", vbCritical, "Nummer ontbreekt!"

Else
ActiveWorkbook.SaveAs Filename:= _
"H:\" & [E22] & " - " & [E24] & ".xlsm"
End If

EINDE:


'DEZE CODE VOOR VOOR HET MAKEN VAN DE TESKT WELKE IN DE 'BODY' VAN DE MAIL WORDT GEPLAATST
Bericht = InputBox("voer een tekst in welke wordt weergegeven in het emailbericht.", "mail bericht") 'deze 2 regels boven aan
If StrPtr(Bericht) = 0 Then Exit Sub

'MAILEN VAN HET OPGESLAGEN SHEET NAAR HET BEDRIJFSBUREAU
Dim OutApp As Object
Dim OutMail As Object

Set OutApp = CreateObject("Outlook.Application")
Set OutMail = OutApp.CreateItem(0)

On Error Resume Next
With OutMail
.To = "bedrijfsbureau@xxxxxx.nl "
.CC = ""
.BCC = ""
.Subject = "Registratieformulier"
.Body = Bericht 'deze regel ingeval van 'eigen tekst'
' .Body = "Bijgaand het registratieformulier"
.Attachments.Add ActiveWorkbook.FullName
.Send 'or use .Display
End With
On Error GoTo 0

Set OutMail = Nothing
Set OutApp = Nothing


'TOON MELDING DAT FILE IS OPGESLAGEN EN VERZONDEN
MsgBox "Het document op opgeslagen in uw persoonlijke map en gemaild naar 'bedrijfsbureau@xxxxx.nl.", vbOKOnly

End If


'ZET DE CURSOR IN EEN CEL VAN HET SHEET
Range("A1").Select
Application.Goto Reference:="INGEVULD_DOOR"

End Sub
 

Bijlagen

  • Private Sub FORMULIER.docx
    19 KB · Weergaven: 66
Heb je de code al met F8 doorlopen?

Je moet de code tussen de code tags zetten.
Als je er een bestandje bij doet doe er dan een Excel bestandje bij.
 
Compileerfout:
End if zonder blok if

Dus er staat een End if te veel.
 
Als deze melding komt:
Code:
End if zonder blok if
dan betekent dat niet noodzakelijk dat er een "End if" te veel staat, het is ook mogelijk dat de volgorde van de opdrachten niet juist is.

Ik heb de code niet getest en ook je bijlage niet bekeken, maar wat je in de code (die je voor de leesbaarheid best tussen codehaken kunt plaatsen) al moet wijzigen is dit:

Gebruik in plaats van:
Code:
If Range("SOORT_MUTATIE") = "NIEUWE MEDEWERKER" Then GoTo OPSL_NIEUW Else GoTo OPSL_OVERIG
dit:
Code:
If Range("SOORT_MUTATIE") = "NIEUWE MEDEWERKER" Then
GoTo OPSL_NIEUW
Else 
GoTo OPSL_OVERIG
end if
 
Of nog beter, gebruik helemaal geen GoTo. Als je je If structuur netjes maakt en leesbaar schrijft met de juiste inspringpunten zie je vast direct waar het misgaat en heb je ook die GoTo opdrachten niet nodig. Daarnaast wat zapatr zegt.
 
Laatst bewerkt:
Het gaat nog niet helemaal goed

Ik heb wat zitten prutsen met plek van de "End If" maar ik snap het echt niet. Moet je nu elke If afsluiten met een End If ?

Ik heb een test sheet bijgevoegd maar echt lekker loopt het allemaal niet. Het volgende is de bedoeling:

Cel d12 = NIEUWE MEDEWERKER
dan moet de code controleren of er een waarde is ingevoerd in cel D16 en D17 zo niet stoppen met melding. Zoja sheet opslaan en mailen naar het opgegeven aders

Cel d12 niet gelijk aan NIEUWE MEDEWERKER
dan moet de code controleren of er een waarde is ingevoerd in cel D16 zo niet stoppen met melding. Zoja sheet opslaan en mailen naar het opgegeven aders.

Nu loopt de macro ook gewoon door ook al zijn de cellen leeg.

Ik zie het even niet meer, waar doe ik het fout.
 

Bijlagen

  • Test macro opslaan.xlsm
    26,7 KB · Weergaven: 56
Ik heb wat zitten prutsen met plek van de "End If" maar ik snap het echt niet. Moet je nu elke If afsluiten met een End If ?
Blijkbaar heb je de code van @zapatr niet geprobeerd?

Als je IF gebruikt met achter het THEN gedeelte één opdracht en achter het eventuele ELSE gedeelte ook één opdracht dan moet je géén END IF gebruiken. Het wordt anders als je na een IF meerdere opdrachten wil laten uitvoeren.
Bv.
Code:
If vooowaarde Then
    Opdracht1
    opdracht2
    Else
    Opdracht3
    opdracht4
End If
Waardoor de GOTO onnodig is en je de code waarnaar verwezen wordt net zo goed onder THEN en ELSE kan plaatsen.
 
Ik heb even grote schoonmaak gehouden in het bestand.
Veel code is overbodig.

De mailknop is pas beschikbaar als beide invoervelden zijn ingevuld.

Met vriendelijke groet,


Roncancio
 

Bijlagen

  • Test macro opslaan.xlsm
    26 KB · Weergaven: 91
Nu loopt de macro ook gewoon door ook al zijn de cellen leeg.
Waar doe ik het fout?
Dit deed je fout:
1. Als 1 of beide cellen niet zijn ingevuld laat je wel een messagebox verschijnen om te melden dat er nog wat ingevuld moet worden, maar je geeft de gebruiker daarvoor niet de gelegenheid. Dat kun je wel doen door bv. een inputbox te laten verschijnen of door de macro te stoppen, waardoor de gebruiker de invoer alsnog kan doen. Die laatste methode is in de code hieronder toegepast.

2. Je gebruikte 1 keer een verkeerde naam voor het werkblad.

3. Niet fout, maar wel verstandig is het om dubbele code te voorkomen (reeds opgemerkt door roncancio) en geen afzonderlijke procedures te gebruiken als die niet echt nodig zijn (zie opmerking edmoor).
Veel fout deed je dus niet.

Uitgaande van je eigen code en rekening houdend met punt 3 kun je de gele code uit je Worddocument dan bv. aanpassen als volgt:
Code:
Private Sub FORMULIER_VERZENDEN_Click()
Application.ScreenUpdating = False
With Sheets("TESTBLAD")
If .Range("D16") = "" Then
MsgBox "U moet de naam van de medewerker in B16 invoeren voordat u op kunt slaan.", vbCritical, "Naam ontbreekt!"
Exit Sub
End If
If .Range("D12") = "NIEUWE MEDEWERKER" Then
If .Range("D17") = "" Then
MsgBox "U moet een telefoonnumer opgeven voor contact met ICT.", vbCritical, "Nummer ontbreekt!"
Exit Sub
End If
End If
End With
Application.ScreenUpdating = TRUE
ActiveWorkbook.SaveAs Filename:="D:\" & [D15] & " - " & [D16] & ".xlsm"
Houd er wel rekenig mee dat, als geen voornaam is ingevuld, de naam van het document begint met een liggend streepje, wat waarschijnlijk niet gewenst is. De code is daarvoor eenvoudig aan te passen.

@ronacancio,
alleen bij een nieuwe medewerker moet zowel achternaam als telefoonnummer worden ingevuld, bij anderen alleen de achternaam (wat bij jou niet het geval is). Je kunt je code daarop natuurlijk eenvoudig aanpassen.
 
Laatst bewerkt:
Zonder iets aan de code in je voorbeeld te wijzigen zou ik het toch zo doen:

Code:
Private Sub FORMULIER_VERZENDEN_Click()
    Application.ScreenUpdating = False
    With Sheets("TESTBLAD")
        If .Range("D16") = "" Then
            MsgBox "U moet de naam van de medewerker in B16 invoeren voordat u op kunt slaan.", vbCritical, "Naam ontbreekt!"
            Exit Sub
        End If

        If .Range("D12") = "NIEUWE MEDEWERKER" Then
            If .Range("D17") = "" Then
                MsgBox "U moet een telefoonnumer opgeven voor contact met ICT.", vbCritical, "Nummer ontbreekt!"
                Exit Sub
            End If
        End If
    End With

    Application.ScreenUpdating = False
    ActiveWorkbook.SaveAs Filename:="D:\" & [D15] & " - " & [D16] & ".xlsm"
 
Het was vooral mijn bedoeling om WST duidelijk te maken wat hij fout deed, maar het is natuurlijk duidelijker om aan te geven wat de gebruiker precies moet doen als hij wat fout deed. Onmiddellijk een inputbox aanbieden om de gewenste invoer alsnog te doen (wat ik hierboven al noemde) lijkt mij nóg gebruiksvriendelijker. Aan WST de keuze.
 
En wat ik nu pas zie:
Op het eind van de code moet in plaats van
Code:
Application.ScreenUpdating = FALSE
staan:
Code:
Application.ScreenUpdating = TRUE
 
@#11:
En daar heb je helemaal gelijk in, maar ik vind de inspringpunten altijd erg belangrijk.
 
Die verhogen onmiskenbaar de leesbaarheid, dat is waar.
 
Bedankt

Mannen, hartstikke bedankt. Het werkt allemaal naar volle tevredenheid.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan