Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[VBA/Excel] backwards compatible met forms?

Pagina: 1
Acties:

  • hamsteg
  • Registratie: Mei 2003
  • Laatst online: 22:23

hamsteg

Species 5618

Topicstarter
In een grijs verleden heb ik eens een factuur opgezet voor een vriend met BTW 0, en 19%. Door de jaren heen is de factuur wat complexer geworden en werden de files steeds groter. Uiteindelijk heb ik alle modules die ik had ontwikkeld eenmalig ge-exporteert, daarna bij opstarten van de factuur laten importeren en bij afsluiten van de factuur weer laten removen. Dit werkt goed en als oude facturen bekeken worden gebruiken ze altijd de laatste modules. 300kb files gingen terug naar 40kb.

In de factuur zit een userform. Vele velden maar degene die voor mijn vraag van belang zijn zijn de volgende:
BTW19 en BTW0 (option button). Dit userform is niet geïmporteerd maar gewoon onderdeel van de excel sheet en dit is bewust maar dit zorgt nu even voor een probleempje. Ik heb kortgeleden BTW6 toegevoegd. Niets aan de hand voor nieuwe facturen en hier komt het ... wel voor de oude facturen die nu worden geopend want een bekende fout treedt op: Method or Data Member not found". Dat klop, oude facturen hebben de option button BTW6 niet (maar ze krijgen wel de nieuwste modulen ingelinked die wel er vanuit gaan dat BTW6 bestaat).


De eenvoudige vraag is nu, hoe kan ik dit backwards compatible houden?


In de factuur sla ik de BTW code op als getal en bij het activeren van de form wordt deze gebruikt om de juiste BTWX Data Member of True te zetten zodat getoond wordt met welke BTW er is gerekend.


Dingen waar ik aan heb zitten denken:
Ik dacht dat er een eval functie bestond (VB EXCEL 2002)? Maar deze eenvoudige oplossing krijg ik helaas niet werkend, iemand?
Visual Basic:
1
Eval("FactuurStandard.BTW" + 6 +".Value = True")


Dus ben ik iets moeilijker gaan zoeken maar hier ontbreekt het mij duidelijk aan kennis. Is er een manier om run-time alle Data Members uit een form krijgen (van het type Option Button) en deze als string te benaderen? Hiermee kan ik vanuit de module kijken welke BTW codes er in de form worden ondersteund. In pseudo
code:
1
2
3
4
resultaten = geef_alle_BTW_option_button_strings
voor elk resultaat
    als BTWcode in factuur ook in resultaat te destileren is
        zet Toggle Button voor resultaat op True

... gecensureerd ...


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Waar hoort mijn topic?
PRG > OFF

Het gaat hier niet om "VB 2002" (wat niet eens bestaat maar VB.Net impliceert) maar om VBA. Da's nogal een verschil. En bij mijn weten bestaat er ook geen Excel 2002; My bad; die stond bij mij bekend als Excel "XP".

[VB2002] backwards compatible met forms? >> [VBA/Excel] backwards compatible met forms?

[ Voor 48% gewijzigd door RobIII op 27-12-2010 23:34 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Code waarin hard verwezen (early binding, bv me!btw_button_6) wordt naar een control dat niet bestaat zal sowieso niet compileren.

Je hebt dus late binding nodig: me.controls(controlnaam). Dat geeft alleen nog een fout bij runtime als je control niet bestaat.

Last but not least controleer je dus voor je aanroep of het control wel bestaat en dat kan op twee manieren:

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
'quick 'nd dirty
Private Function FindControl(controlnaam As String) As Boolean
    On Error Resume Next
    Dim c As Object
    Set c = Me.Controls(controlnaam)
    FindControl = (Err = 0)
End Function

'iets netter...
Private Function FindControl(controlnaam As String) As Boolean
    Dim c As Object
    For Each c In Me.Controls
        If c.Name = controlnaam Then
            FindControl = True
            Exit Function
        End If
    Next c
        FindControl = False
End Function

De oever waar we niet zijn noemen wij de overkant / Die wordt dan deze kant zodra we daar zijn aangeland


  • hamsteg
  • Registratie: Mei 2003
  • Laatst online: 22:23

hamsteg

Species 5618

Topicstarter
RobIII schreef op maandag 27 december 2010 @ 23:29:
Waar hoort mijn topic?
PRG > OFF

Het gaat hier niet om "VB 2002" (wat niet eens bestaat maar VB.Net impliceert) maar om VBA. Da's nogal een verschil. En bij mijn weten bestaat er ook geen Excel 2002; My bad; die stond bij mij bekend als Excel "XP".

[VB2002] backwards compatible met forms? >> [VBA/Excel] backwards compatible met forms?
Ik heb echt mijn best gedaan in Excel en VBA beiden de about geopend om de goede info te laten zien. Twee keer de FAQ gelezen en dacht hier goed te zitten. Bedankt.

... gecensureerd ...


  • hamsteg
  • Registratie: Mei 2003
  • Laatst online: 22:23

hamsteg

Species 5618

Topicstarter
Lustucru schreef op dinsdag 28 december 2010 @ 11:57:
Code waarin hard verwezen (early binding, bv me!btw_button_6) wordt naar een control dat niet bestaat zal sowieso niet compileren.
'k weet het, dat was de oorzaak dat ik opzoek moest naar een nette oplossing omdat als men een oude factuur opende er "debug windows" naar boven kwamen. Bedankt voor de oplossingen! Ze hebben mij op de goede weg gezet. Waar ik van baal is dat ik de on error resume next niet eens in ogenschouw heb genomen. Dit was inderdaad een niet elegante maar voor diegene die de facturen gebruikt zeer functionele oplossing geweest.

Ik ben de early binding methode feitelijk helemaal niet nodig en die heb ik dan ook volledig verwijderd. Het gaat mij om de gezette BTW code.

code:
1
Option Explicit                        ' maw, de DIMs bestaan wel maar laat ik even weg

Om de form te activeren:
code:
1
2
3
4
5
6
7
8
  ' BTW
  BTWCode = Range("FactuurBtwCode").Value
  BTWControllName = "BTW" & BTWCode
  For Each FormControll In FactuurStandard.Controls
    If FormControll.Name = BTWControllName Then
      FormControll.Value = True
    End If
  Next FormControll


De code die wordt aangeroepen als de form zijn werk gedaan heeft en dus de BTW code moet worden opgeslagen in de factuur:
code:
1
2
3
4
5
6
7
8
9
10
  ' BTW
  For Each FormControll In FactuurStandard.Controls
    If (Left(FormControll.Name, 3) = "BTW") Then
      If (FormControll.Value = True) Then
        BTWCode = Int(Val(Right(FormControll.Name, Len(FormControll.Name) - 3)))
      End If
    End If
  Next FormControll

  Range("FactuurBtwCode").Value = BTWCode

De For loop zou ik nog explicieter kunnen afbreken zodra het criterium bereikt is. Dat zou inderdaad iets performance winst geven maar voor die totaal 30 controls zou de leesbaarheid naar de toekomst moeilijk zijn dus dat laat ik maar mooi even. Heb bij het steppen so-wie-so gezien dat meer als de helft eerst komt.

Al met al, missie geslaagd in de hoek waar ik gehoopt had de oplossing te kunnen vinden. Controls is hier het magic word.

Dank! _/-\o_ _/-\o_ _/-\o_

edit:
Zit nog even te kijken naar het setten. Moet ik de nadere BTW's niet expliciet op false zetten? Default staan ze op false, na zetten wordt het form gehide ... nee gaat goed want het veld waar de BTW code in wordt opgeslagen is protected dus ze lopen altijd in sync.

[ Voor 6% gewijzigd door hamsteg op 28-12-2010 18:23 . Reden: Expliciet false-en? ]

... gecensureerd ...