1004 code bij opstarten Excelbestand

Status
Niet open voor verdere reacties.

RamV

Gebruiker
Lid geworden
1 dec 2008
Berichten
9
bij het openen van het workbook geeft de macro in Excel 2003 geen foutmelding maar in 2000 wel.

1004 > "Door de toepassing of door object gedefinieerde fout"

Spectaculair is de macro niet. Ik kan niet vinden wat het probleem veroorzaakt.


Code:
Private Sub Workbook_Open()
Application.ScreenUpdating = True
   
   Sheets("Formulier").Select
   ActiveSheet.Unprotect "test"
   
   Range("E3").Select
   If Selection = 0 Then GoTo Line1 Else: GoTo Line100
Line1:
   
   Sheets("Formulier").Select
   Range("D12").Select
   If Selection > 0 Then GoTo Line3 Else GoTo Line8
    
Line3:
    
   Sheets("Formulier").Select
   Range("E5").Select
   If Selection > 0 Then GoTo Line5 Else GoTo Line6
    
Line5:
   
   Sheets("Overhevelen").Visible = True
   Sheets("Overhevelen").Select
   ActiveSheet.Unprotect "werk"
   Sheets("Overhevelen").Select
   Range("D1").Select
   Selection.Copy
   Range("D1").Select
   ' Sheets("Overhevelen").Range("D1").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
   '     :=False, Transpose:=False
   ActiveSheet.Paste
   Application.CutCopyMode = False
   ActiveSheet.Protect "werk"
   Sheets("Overhevelen").Visible = False
     
   'Sheets("Formulier").Select
   'Range("E6:E12").Select
   'Selection.Copy
   'Sheets("Formulier").Range("E6:E12").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
   ':=False, Transpose:=False
   Range("D12").Select
   Application.CutCopyMode = False
   Selection.ClearContents
   Range("D12").Locked = True
   Range("E5:E6").Select
   Selection.Locked = True
   Range("E8:E11").Select
   Selection.Locked = True
   Range("D13").Locked = True
   Range("E3:F13").Select
   Selection.Locked = True
   Selection.FormulaHidden = False
   Range("E7").Select
   Selection.Locked = False
   
Line8:
   Sheets("Formulier").Select
   Range("B18").Select
   If Selection = 0 Then GoTo Line300 Else GoTo Line100


Line6:
   Sheets("Formulier").Select
   Range("B18").Select
   If Selection = 0 Then GoTo Line200 Else GoTo Line100
   
   
Line200:
   Sheets("Formulier").Select
   Filteren_uit
   Sheets("Formulier").Select
   Range("G11").Select
   If Selection <> "" Then GoTo Line100 Else GoTo Line400

Line100:
'  Filteren_aan
  
Line300:
Line400:
  Sheets("Formulier").Select
  Range("B18").Select
  
  ActiveSheet.Protect "test", Contents:=True, Scenarios:= _
  False, AllowFiltering:=True, AllowUsingPivotTables:=True

End Sub


Alvast bedankt voor de medewerking

Ron
 
Laatst bewerkt door een moderator:
Hier op helpmij krijg je ook een foutmelding. Begin eerst je goto's te vervangen door IF THEN ELSE statements. Het zal dan snel een heel stuk makkelijker worden.

Ik heb vroeger een videotheek geprogrammeert in GWBasic. Daar zaten minder goto's in.

Je moet dus een beetje structuur in je code brengen anders is het niet te lezen.

HTH:D
 
Allereerst bedankt voor je snelle reactie!

Helaas begrijp ik niet als er al IF ELSE en THEN staat hoe ik dat kan optimiseren.

Wat mij wel op viel is dit:

If Selection = 0 Then GoTo Line1 Else : GoTo Line100

Graag leer ik hoe ik de GoTo kan/ moet weg laten.

Nogmaals dank.
 
Laatst bewerkt:
RamV,

Met alle respect, maar hier is niet aan uit te komen. Gewoon door die spaghettistructuur. Ik durf er voor wedden dat jij ook niet kan garanderen dat deze code werkt (buiten die eerder gemelde foutmelding dan). En als we nog wat overdrijven: je hebt in de code geen slechte structuur, je hebt helemaal geen structuur...

Nu, ik ben niet enkel pessimist, hier is een mogelijkheid. Heel het laatste stuk code:

Code:
If Selection <> "" Then GoTo Line100 Else GoTo Line400

Line100:
' Filteren_aan

Line300:
Line400:
Sheets("Formulier").Select
Range("B18").Select

ActiveSheet.Protect "test", Contents:=True, Scenarios:= _
False, AllowFiltering:=True, AllowUsingPivotTables:=True

wordt gewoon::

Code:
Sheets("Formulier").Protect "test", Contents:=True, Scenarios:=False, AllowFiltering:=True, AllowUsingPivotTables:=True

Niks Line100 want er gebeurt toch niets van code, de code staat in commentaar. Line300 is hetzelfde als Line400, sheets en cellen selecteren is niet nodig, ...

Uiteraard kan je dit stukje code niet gewoon vervangen in jouw code, want dan valt de rest in duigen. Dat is juist het probleem in jouw code: 1 stukje wegpakken en het ligt op zijn gat.

Ga het maar eens na, op geen enkel Excel VBA forum wordt er gebruik gemaakt van regelnummers en de Goto is ook nogal uit den boze (behalve bij foutafhandeling).

Kortom, jij weet wat doen tijdens de wintermaanden... (goed bedoeld!)

Relatief korte, gerichte, vragen kan je hier op het forum stellen :thumb:

Wigi
 
Aanpassing Italiaans gerecht

Natuurlijk was het voor verbetering vatbaar. Vandaar de vraag aan beter geschoolde.
Dit had ik gisteren naar aanleiding van de opmerkingen zelf al bedacht.

Code:
Private Sub Workbook_Open()

   
   Sheets("Formulier").Select
   ActiveSheet.Unprotect "test"
   Application.ScreenUpdating = True
      
   'RMAnummer al ingevuld?
   Range("E3").Select
   If Selection = 0 Then GoTo Line1 Else GoTo Line6

Line1:
   'Debiteuren gegevens + naam binnendienstmedewerker al omgezet in platte tekst?
   Sheets("Formulier").Select
   Range("D12").Select
   If Selection > 0 Then GoTo Line2 Else GoTo Line6
    
Line2:
   'Debiteurennummer ingevuld dan de betreffende teksten omzetten naar
   'een platte tekst.
   Sheets("Formulier").Select
   Range("E5").Select
   If Selection > 0 Then GoTo Line3 Else GoTo Line6
    
Line3:
   Sheets("Overhevelen").Visible = True
   Sheets("Overhevelen").Select
   ActiveSheet.Unprotect "test"
   Sheets("Overhevelen").Select
   Range("D1").Select
   Selection.Copy
   Range("D1").Select
   Sheets("Overhevelen").Range("D1").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
   ActiveSheet.Paste
   Application.CutCopyMode = False
   ActiveSheet.Protect "werk"
   Sheets("Overhevelen").Visible = False
     
   Sheets("Formulier").Select
   Range("E6:E12").Select
   Selection.Copy
   Sheets("Formulier").Range("E6:E12").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
   :=False, Transpose:=False
   Range("D12").Select
   Application.CutCopyMode = False
   Selection.ClearContents
   Range("D12").Locked = True
   Range("E5:E6").Select
   Selection.Locked = True
   Range("E8:E11").Select
   Selection.Locked = True
   Range("D13").Locked = True
   Range("E3:F13").Select
   Selection.Locked = True
   Selection.FormulaHidden = False
   Range("E7").Select
   Selection.Locked = False
   
Line4:
   Sheets("Formulier").Select
   Range("B18").Select
   If Selection = 0 Then GoTo Line5 Else GoTo Line6
   
Line5:
   Sheets("Formulier").Select
   Filteren_uit
   Sheets("Formulier").Select
   Range("B18").Select

Line6:
  Sheets("Formulier").Select
  Range("B18").Select
  
  ActiveSheet.Protect "test", AllowFiltering:=True

End Sub


De vraag is dat ik in Excel 2003 en 2007 helemaal geen foutmeliding krijg, maar in 2000 wel.

Bvd.
 
Laatst bewerkt door een moderator:
Aanvulling: in antwoord op je vraag het werkt wel degelijk. Kennelijk zijn er meerdere wegen die naar "Rome" leiden. Maar ik begrijp dat ik niet de juiste methodiek heb gebruikt.
En wil hier graag van leren. Wat kan ik anders voor instructies gebruiken om tot hetzelfde resultaat te komen dan de GoTo. Afhankelijk van het wel of niet ingevuld zijn van velden moeten er andere stappen worden doorlopen/ overgeslagen.

Bvd voor je inbreng.
 
je code iets versimpelt

Ik heb de eerste regels van je code een klein beetje herschreven
Het geeft je een indicatie van hoe het er ongeveer uit moet komen te zien.
Je ziet dat er geen Goto's worden gebruikt.

Code:
Private Sub Workbook_Open()

    Sheets("Formulier").Select
    ActiveSheet.Unprotect "test"
    Application.ScreenUpdating = True
    
    'RMAnummer al ingevuld?
    Range("E3").Select
    If Selection = 0 Then
        'Debiteuren gegevens + naam binnendienstmedewerker al omgezet in platte tekst?
        Sheets("Formulier").Select
        Range("D12").Select
        If Selection > 0 Then
            'GoTo Line2 Else GoTo Line6
            'Debiteurennummer ingevuld dan de betreffende teksten omzetten naar
            'een platte tekst.
            Sheets("Formulier").Select
            Range("E5").Select
            If Selection > 0 Then
                'GoTo Line3 Else GoTo Line6
                Sheets("Overhevelen").Visible = True
                Sheets("Overhevelen").Select
                ...
            endif
        End If
    End If

'Hier begint Line6.
...

End Sub
Bovenstaande code zal niet werken vanwege de puntjes e.d.

Als je het snel wil leren mag je NOOIT meer goto's gebruiken. Dan wordt je gedwongen beter te programmeren.

Probeer je code op te hakken in stukjes. Als er bijvoorbeeld veel naar "Line100" wordt gesprongen, maak dan een procedure(sub) of een functie (function) met die functionaliteit.

Tot slot.
Kijk naar hoe anderen het doen want: beter goed gepikt, dan slecht geschreven!

Enjoy!
 
En vermijd select, activate

toegepast op Guus' verbeterde code

Code:
Private Sub Workbook_Open()
    with Sheets("Formulier")
      .Unprotect "test"
      If .[E3] = 0 Then
        If .[D12] > 0 Then
          If .[E5]> 0 Then
            .[D5]=Sheets("Overhevelen").[D5]
                ...
            endif
        End If
    End If
  End With
............
End Sub
 
Laatst bewerkt:
Slotsom

Ik heb de GoTo instrukties vervangen voor Sub Macro's. Bedankt voor de informatie. Helaas bleef de foutmelding hetzelfde. Waar ik uiteindelijk achter ben gekomen is dat het Excel bestand gemaakt in versie 2003 werkt in 2003/ 2007, maar dat het programma vastloopt met het verwerken van makro's " Bladbeveiligen" in een versie van 2000. (Met of zonder specifiek wachtwoord). Alleen als ik er geen beveiligingen opzet loopt alles naar wens, maar dat was natuurlijk niet de bedoeling. Kan het zelf ook niet in 2000 testen. Gebeurd bij de klant. Nogmaals dank voor jullie bijdrage.:thumb:
 
Kan je de code hier nog even posten, lijkt me een goede topic om naar te verwijzen bij soortgelijke topics met Goto statements.
 
Def. uitvoering .... spaghetti?

Info: Teken ***********
geeft aan begin / einde sub_macro_1 t/m 6

Ik heb gewerkt met "Sub_macro's" omdat ik macro's wel of niet moet kunnen
activeren afhankelijk van de waarde van verschillende velden.

Voor mij als leek ging dat met de GoTo functie ook prima, maar zoals Wigi
aangaf is dat kennelijk sterk af te raden.

Code:
Private Sub Workbook_Open()
   
   Sheets("Formulier").Unprotect "werk"
   Application.ScreenUpdating = True
   
' Vragen worden gesteld voor het wel of niet aanspreken van Sub_macro's.
   
   macro_1
***********
Sub macro_1()


' Controleer of het RMA nummer in veld ["E3"] is ingevuld.
' Ingevuld .. dan is de RMA afgewerkt en direct naar einde instructie.
'
   Sheets("Formulier").Select
   Range("E3").Select
   If Selection = 0 Then macro_2 Else

End Sub
***********

Code:
Sub macro_2()

 '  Als de filter voor bepaalde regels op het formulier actief is wordt deze gereset en 
 '  dan naar macro 4 anders direct naar Sub_macro_4
 '
    Sheets("Formulier").Select
    ActiveSheet.Shapes("Button 155").Select
    If Selection.Characters.Text = "Filteren uit" Then macro_3 Else macro_4

End Sub
***********

Code:
Sub macro_3()

'Daar de RMA nog niet is afgewerkt wordt de filter over de materisalen uitgeschakeld
'
  Filteren_uit

  macro_4

End Sub
***********

Code:
Sub macro_4()
   
' Als het Debiteurennummer ["E5"] is ingevuld dan de betreffende vert. zoeken
' teksten omzetten naar een standaard tekst.
'
   Sheets("Formulier").Select
   Range("E5").Select
   If Selection > 0 Then macro_5 Else

End Sub
***********

Code:
Sub macro_5()

' Controle of er nog gewerkt wordt met vert.zoeken van de "Debiteuren gegevens"?
' ["D12"] = code veld welke zolang <> "" is wanneer gewerkt wordt met vert.zoek functie.
'
   Sheets("Formulier").Select
   Range("D12").Select
   If Selection > 0 Then macro_6 Else

End Sub
***********

Code:
Sub macro_6()

' Velden met de functie vertikaalzoeken worden omgezet naar standaard teksten
' of bewust leeg gemaakt.
' Tevens worden velden beveiligd tegen wijzigen.
'
   Sheets("Overhevelen").Visible = True
   Sheets("Overhevelen").Select
   ActiveSheet.Unprotect "werk"
   Sheets("Overhevelen").Select
   Range("D1").Select
   Selection.Copy
   Range("D1").Select
   Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    ActiveSheet.Paste
    Application.CutCopyMode = False
    Range("D4").Select
   ActiveSheet.Protect "werk", DrawingObjects:=True, Contents:=True, Scenarios:=True, AllowFiltering:=True
   Sheets("Overhevelen").Visible = False
     
   Sheets("Formulier").Select
   Range("E6:E12").Select
   Selection.Copy
   Sheets("Formulier").Range("E6:E12").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
   :=False, Transpose:=False
   Range("D12").Select
   Application.CutCopyMode = False
   Selection.ClearContents
   Range("D12").Locked = True
   Range("E5:E6").Select
   Selection.Locked = True
   Range("E8:E11").Select
   Selection.Locked = True
   Range("D13").Locked = True
   Range("E3:F13").Select
   Selection.Locked = True
   Selection.FormulaHidden = False
   Range("E7").Select
   Selection.Locked = False

End Sub
***********

Code:
 Sheets("Formulier").Select
   Range("B18").Select
   ActiveSheet.Protect "werk", DrawingObjects:=True, Contents:=True, Scenarios:=True, AllowFiltering:=True

End Sub
 
Laatst bewerkt door een moderator:
Het ziet er al een stuk beter uit zonder die Goto's. :thumb:Ik ben blij dat niemand je heeft verteld dat je ook nog steeds Gosub's kan gebruiken...:rolleyes:

Moet je trouwens ook niet doen!

HTH:D
 
End If?

Heren wat ik niet begrijp is dat alles nu functioneert, maar dat ik
(waar ik het ook probeer), de End If functie niet ingevoegd krijg.
Ik krijg dan steeds de fout melding dat het programma de If niet ziet. Voorbeeld

Sub macro_1()


' Controleer of het RMA nummer in veld E3 is ingevuld.
' Ingevuld .. dan is de RMA afgewerkt en direct naar einde instructie.
'
Sheets("Formulier").Select
Range("E3").Select
If Selection = 0 Then macro_2 Else

End Sub

Voor de End Sub kan ik niet ongestraft de End If invullen?
Maar ook niet als alle sub macro's zijn afgesloten.

Als ik de wintermaanden nuttig wil besteden. Welke literatuur helpt mij daarbij m.b.t. VBA?

Bvd voor de reactie
 
Het IF THEN ELSE ENDIF statement kan als

Code:
If conditie then statement
worden geschreven
Echter als ook de else tak wordt gebruikt dan is doorgaans de notatie als volgt:
Code:
If conditie then
   statement
else
   statement
endif
Het zal je opvallen dat je geen spatie tussen de End en de If hoeft te tikken, dat doet Access voor je.

HTH:D
 
End If

Bedankt wederom voor de snelle reactie.

Dat het voorbeeld Sub macro_1 zonder End If geschreven mag worden weet ik dan nu.

Maar onder mijn voorbeeld Sub macro_2:


Code:
Sub macro_2()

' Als de filter voor bepaalde regels op het formulier actief is wordt deze gereset en 
' dan naar macro 4 anders direct naar Sub_macro_4
'
Sheets("Formulier").Select
ActiveSheet.Shapes("Button 155").Select
If Selection.Characters.Text = "Filteren uit" Then macro_3 Else macro_4
>>>>> End If
End Sub

Zou je toch verwachten dat je daar dus End If kan/moet zetten.
Maar hij geeft dan wederom de foutmelding
Compileerfout:

End If zonder blok If ??

Nogmaals het werkt, maar .........
 
Laatst bewerkt door een moderator:
@RamV voordat je hier verder een woud aan VBA code gaat plaatsen, zorg dat het leesbaar blijft. Post dus je code tussen de codetags, plak je code, selecteer deze en klik op #. Op deze manier wordt je code tussen de codetags geplaatst en blijft het overzichtelijk voor de helpers.
 
Leerproces

:eek: 2 Keer wat geleerd.

Ook de oplossing gevonden: voorbeeld


Code:
Sub Macro1()

Range("B3").Select
If Selection = 1 Then
macro_2
Else
macro_3
End If

End Sub


ipv

If Selection = 1 Then macro_2 Else macro_3 End If   >> Geeft eerder genoemde foutcode

Je moet dus kennelijk een harde return geven achter ieder statement (i.p.v. alles achter elkaar op één regel) ???
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan