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

Hulp met Dim gevraagd

Status
Niet open voor verdere reacties.

tomswaelen

Gebruiker
Lid geworden
8 dec 2004
Berichten
349
Ik zit met een aantal problemen met VBA in mijn Excel:

1. hij geeft een foutmelding wanneer ik een tweede Excel-bestand open (object out of range of zoiets)
2. ik woon in Belgie, dus Excel moet vertaald worden naar het Frans :-)


1. komt volgens mij omdat ik niet gewerkt heb met 'absolute' referenties naar mijn objecten. Excel gaat altijd uit van het actieve workbook, dus als je een nieuwe file opent, is het bestand met de VBA erin, niet meer het actieve bestand. Dus dat valt volgens mij op te lossen met volledige referenties naar mijn objecten
2. mijn code verwijst dus naar Nederlandstalige bestandsnamen en werkbladen, met als resultaat dat die zaken in de code ook in het Frans moeten gezet worden.

Probleem 2 kan volgens mij verkleind worden door vooraf je bestandsnaam en werkbladnamen te declareren en vanaf dan met die 'codenamen' te werken in de code. In de Franse versie zou ik dan alleen maar de eerste declaratie moeten veranderen.

Klopt mijn oplossing hiervoor? Of heeft iemand nog een suggestie?

Ik heb zelf al zitten zoeken hoe dat zit met zo'n Dim statements, maar ben er nog niet helemaal uit. Kan iemand mij op weg helpen met onderstaand stukje code? Zoals je ziet worden de objecten met volledige referenties op de duur erg lang ook...

Code:
Private Sub Worksheet_Calculate()
  
  If Application.Workbooks("Opvragen rekeninginformatie ikv overlijden.xlsm").Worksheets("Stap 1 - Dossiergegevens").Range("A15").Value = "NOK" Then
  Application.Workbooks("Opvragen rekeninginformatie ikv overlijden.xlsm").Worksheets("Stap 2 - Gegevens aanvrager").Visible = xlSheetVeryHidden
  Application.Workbooks("Opvragen rekeninginformatie ikv overlijden.xlsm").Worksheets("Stap 3 - Gegevens opzoeking").Visible = xlSheetVeryHidden
  Application.Workbooks("Opvragen rekeninginformatie ikv overlijden.xlsm").Worksheets("Stap 4 - Validatie en afdrukken").Visible = xlSheetVeryHidden
  Application.Workbooks("Opvragen rekeninginformatie ikv overlijden.xlsm").Worksheets("Opvragen rekeninginformatie").Visible = xlSheetVeryHidden
    
  End If
  
  If Application.Workbooks("Opvragen rekeninginformatie ikv overlijden.xlsm").Worksheets("Stap 2 - Gegevens aanvrager").Visible = True Then Exit Sub
  
  If Application.Workbooks("Opvragen rekeninginformatie ikv overlijden.xlsm").Worksheets("Stap 1 - Dossiergegevens").Range("A15").Value = "OK" Then
    MsgBox "U kan vanaf nu naar tabblad 'Stap 2 - Gegevens aanvrager' gaan."
    Application.Workbooks("Opvragen rekeninginformatie ikv overlijden.xlsm").Worksheets("Stap 2 - Gegevens aanvrager").Visible = xlSheetVisible
  Else
    Application.Workbooks("Opvragen rekeninginformatie ikv overlijden.xlsm").Worksheets("Stap 2 - Gegevens aanvrager").Visible = xlSheetVeryHidden
      
  End If
End Sub
 
De code die je plaatste wordt uitgevoerd op het moment dat je huidig geopende werkboek opnieuw wordt berekend.
Je bedoeling is me daarom niet echt duidelijk.
Is "Opvragen rekeninginformatie ikv overlijden.xlsm" niet je huidige werkboek?
VBA is trouwens altijd Engels.
 
De code moet inderdaad uitgevoerd worden telkens er een berekening is. Cel A15 hangt immers af van verschillende andere berekeningen binnen dat blad. Die 'OK' moet dus telkens opnieuw berekend worden.

"Opvragen rekeninginformatie ikv overlijden.xlsm" is idd de huidige file. Maar daarom gaf hij dus foutmeldingen als ik een andere file opende. Range(A15) bestaat natuurlijk niet in die tweede file, dus gaf hij een foutmelding. Daarom dat ik alle objecten nu volledige referenties heb gegeven. Nu komt dat probleem niet meer voor.

Dat VBA Engels is, wist ik. Maar ik verwijs dus wel naar tabbladen en bestandsnamen die gaan vertaald moeten worden. Vandaar mijn vraag of dit niet efficiënter opgelost kan worden. Ik zou natuurlijk een find and replace kunnen doen over de gehele workbook, en dan hopen op het beste ;-)
 
Laatst bewerkt:
Range("A15") bestaat in ieder werkblad van ieder werkboek.
Ik snap nog de bedoeling niet echt maar voor je huidige werkboek hoef je dat werkboek niet op te geven:
Code:
Private Sub Worksheet_Calculate()
  If Sheets("Stap 1 - Dossiergegevens").Range("A15").Value = "NOK" Then
     Sheets("Stap 2 - Gegevens aanvrager").Visible = xlSheetVeryHidden
     Sheets("Stap 3 - Gegevens opzoeking").Visible = xlSheetVeryHidden
     Sheets("Stap 4 - Validatie en afdrukken").Visible = xlSheetVeryHidden
     Sheets("Opvragen rekeninginformatie").Visible = xlSheetVeryHidden
  End If
  
  If Sheets("Stap 2 - Gegevens aanvrager").Visible Then Exit Sub
  
  If Sheets("Stap 1 - Dossiergegevens").Range("A15").Value = "OK" Then
     MsgBox "U kan vanaf nu naar tabblad 'Stap 2 - Gegevens aanvrager' gaan."
     Sheets("Stap 2 - Gegevens aanvrager").Visible = xlSheetVisible
  Else
     Sheets("Stap 2 - Gegevens aanvrager").Visible = xlSheetVeryHidden
  End If
End Sub
 
Laatst bewerkt:
Ik heb de code nu vervangen, en nu doet hij niets meer... Mijn code daarvoor had die volledige verwijzingen niet, maar dan gaf hij foutmeldingen als ik een ander Excel-bestand opende.

Maar mijn tweede vraag dus. In de Franse versie zal sheet 'Stap 1 - Dossiergegevens' niet meer zo heten, maar iets in de trant van 'Etape 2 - Données du dossier'.

Dat betekent dat ik die verwijzing in de Franse versie overal moet gaan aanpassen. Is er een manier om dit efficienter op te lossen, bv. door eerst de objecten te declareren?
 
Vraag 1 is nog steeds niet duidelijk want wat heeft het met het openen van een ander werkboek te maken? Die code werkt alleen in je huidige werkboek, daar waar die code staat en nergens anders.

Voor vraag 2 kan je gewoon een controle opnemen die bepaalt welke taal moet worden gebruikt.
Bijvoorbeeld met: Application.International(xlCountryCode)
 
Voor vraag 2 kan je gewoon een controle opnemen die bepaalt welke taal moet worden gebruikt.
Bijvoorbeeld met: Application.International(xlCountryCode)

Maar de code gaat dan toch nog steeds verwijzen naar de Nederlandstalige versie van de sheets? In de Franse versie hebben die diezelfde naam niet meer, dus gaat alles toch fout lopen?
 
Je kunt werken met absolute referenties zoals: Sheets(1), sheets(2), etc.

verder is een workbook net zo goed een object. dus:
Code:
set hallo=thisworkbook
set bye=workbooks.open("henkie")

hallo.sheets(1).[a1] = "dit gebeurt in originele workbook"
bye.sheets(1).[a1]= "dit gebeurt in het nieuwe geopende workbook"
 
Laatst bewerkt:
Code:
Private Sub Worksheet_Calculate()
  with Workbooks("Opvragen rekeninginformatie ikv overlijden.xlsm")
     If .sheets("Stap 1 - Dossiergegevens").Range("A15").Value = "NOK" Then
        .sheets("Stap 2 - Gegevens aanvrager").Visible = 2
        .sheets("Stap 3 - Gegevens opzoeking").Visible = 2
        .sheets("Stap 4 - Validatie en afdrukken").Visible = 2
        .sheets("Opvragen rekeninginformatie").Visible = 2
     elseif .sheets("Stap 1 - Dossiergegevens").Range("A15").Value = "OK" then 
       .sheets("Stap 2 - Gegevens aanvrager").Visible = -1
       application.goto .sheets("Stap 2 - Gegevens aanvrager").cells(1)
    End If
  end with
End Sub

Het lijkt me niet handig deze macro bij iedere berekening in het wrkblad te laten uitvoeren, maar à la.

Met het openen van een nieuw werkboek heeft dit niets te maken, want de macro wordt uitgevoerd als er in een exact vooraf bepaald werkblad iets wordt berekend.

Vertel dus eerst maar eens in welk werkblad (naam) van welk werkboek(naam) deze gebeurteniscode staat.
 
Verwijs in je procedure naar de Code Name van de sheet. Dan maakt het helemaal niet meer uit welke naam een gebruiker aan de sheet tab geeft.
 
@snb:

Dit was de oorspronkelijke code:

Code:
Private Sub Worksheet_Calculate()
  
  If Range("A15").Value = "NOK" Then
  Sheets("Stap 2 - Gegevens aanvrager").Visible = xlSheetVeryHidden
  Sheets("Stap 3 - Gegevens opzoeking").Visible = xlSheetVeryHidden
  Sheets("Stap 4 - Validatie en afdrukken").Visible = xlSheetVeryHidden
  Sheets("Opvragen rekeninginformatie").Visible = xlSheetVeryHidden
    
  End If
  
  If Sheets("Stap 2 - Gegevens aanvrager").Visible = True Then Exit Sub
  
  If Range("A15").Value = "OK" Then
    MsgBox "U kan vanaf nu naar tabblad 'Stap 2 - Gegevens aanvrager' gaan."
    Sheets("Stap 2 - Gegevens aanvrager").Visible = xlSheetVisible
  Else
    Sheets("Stap 2 - Gegevens aanvrager").Visible = xlSheetVeryHidden
      
  End If
End Sub

Als ik het tabblad zelf aan het invullen ben, en dan een random tweede Excel-bestand open bij wijze van test, krijg ik bij een volgende berekening deze fout:

Fout 9: het subscript valt buiten het bereik

op deze lijn:

Sheets("Stap 2 - Gegevens aanvrager").Visible = xlSheetVeryHidden

Ligt dit dan aan iets anders? Bovenstaande code staat in de VBA editor op het aparte blad van de worksheet. (dus niet in ThisWorkbook of zo)
 
Fout 9 betekent dat je verwijst naar iets dat niet bestaat.
 
Waarom denk je dat ik in mijn code:

Workbooks("Opvragen rekeninginformatie ikv overlijden.xlsm")
If .sheets(

heb staan ?
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan