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

Fout: Typen komen niet met elkaar overeen

Status
Niet open voor verdere reacties.

sannevanzijl

Gebruiker
Lid geworden
10 dec 2013
Berichten
17
Hallo allemaal

Ik heb een stukje code gemaakt die de generatie van een persoon in een stamboom moet uitrekenen.
Deze sub is gebaseerd op cellen in een sheet.

Cel persoon_aktief1 (begint met de ID van de vader van de actieve persoon)
Cel persoon_aktief2 (bevat een vlookup formule om de ID van de vader van persoon_aktief1)
Cel parent_count moet de waarde krijgen van de VBA teller.

De code bevat een tellertje die begint met waarde 1.
Dan wordt er een Do while benoemd totdat er geen waarde is persoon_aktief1, dan heb je dus de stamvader bereikt en moet de loop stoppen.
Mijn probleem is dat deze waarde "#N/B" is en de foutafhandeling zegt dan dat de typen niet overeen komen.
Ik weet niet hoe ik dit op moet lossen. Ik heb al geprobeerd om de while aan "#N/B" op te hangen maar dat werkt niet.
Wat doe ik verkeerd?

Zie hier de code:
Code:
Sub generatiecode()
'
' generatiecode Macro
'
'   We berekenen het aantal stappen naar de oudste voorvader
    
Dim genCount As Integer
    genCount = 1
    Range("persoon_aktief1").Select
    ActiveCell.FormulaR1C1 = "=vader_id"
    Range("persoon_aktief2").Select
    ActiveCell.FormulaR1C1 = "=VLOOKUP(persoon_aktief1,personen!C[-1]:C[11],13,0)"
    Do Until Range("persoon_aktief1").Value = """"
        genCount = genCount + 1
        Range("persoon_aktief2").Select
        Selection.Copy
        Range("persoon_aktief1").Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
    Loop
    Range("parent_count").Select
    ActiveCell.Value = "genCount"
End Sub
 
Heb de select's uit de code gehaald en verder laat je een teller gencount lopen en als laatste vraag je een tekst op "genCount", dat geeft een conflict.
Maar verder weet ik niet echt waarop de code vastloopt, kun je dat nog even toelichten.
Wat ook helpt is de code via F8 regel per regel te doorlopen en kijken wat er in de verschillende stappen gebeurt.

Code:
Sub generatiecode()
'
' generatiecode Macro
'
'   We berekenen het aantal stappen naar de oudste voorvader
    
Dim genCount As Integer
    genCount = 1
    Range("persoon_aktief1").FormulaR1C1 = "=vader_id"
    Range("persoon_aktief2").FormulaR1C1 = "=VLOOKUP(persoon_aktief1,personen!C[-1]:C[11],13,0)"
    Do Until Range("persoon_aktief1").Value = """"
        genCount = genCount + 1
        Range("persoon_aktief2").Copy
        Range("persoon_aktief1").PasteSpecial Paste:=xlPasteValues
    Loop
    Range("parent_count").Value = genCount
End Sub
 
Hoi Cobbe

Het punt is dat de waarde van persoon_aktief1 uiteindelijk #N/B is en niet leeg.
Nu heb ik dus de """" vervangen door "#N/B" maar dan geeft ie nog steeds dezelfde fout.
Verder lijkt ie, als ik de code met F8 doorloop alles perfect te doen.

dit is nu de code:
(de verkorte paste special werkte niet)
Code:
Dim genCount As Integer
    genCount = 1
    Range("persoon_aktief1").FormulaR1C1 = "=vader_id"
        Range("persoon_aktief2").FormulaR1C1 = "=VLOOKUP(persoon_aktief1,personen!C[-1]:C[11],13,0)"
    Do Until Range("persoon_aktief1").Value = "#N/B"
        genCount = genCount + 1
        Range("persoon_aktief2").Copy
        Range("persoon_aktief1").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Loop
    Range("parent_count").Value = genCount
End Sub
 
Cobbe, bedankt!

Ik heb de code nog iets aangepast:
Code:
Do Until Range("persoon_aktief1").Value = "#N/B"
aangepast naar
Code:
Do Until Range("persoon_aktief2").Value = "0"

En nu doet ie exact wat ie moet doen!
Helemaal blij
En zo snel een oplossing op 2e kerstdag TOP!
 
Als je toch met VBA in de weer bent heb je het werkblad niet nodig.
Zonder Vlookup en zonder kopiëren/plakken kun je hetzelfde resultaat krijgen.
Een vlookup op volledige kolommen werkt meestal niet al te snel.

Code:
sub M_snb()
  sn=sheets("personen").cells(1).currentregion
  for j=1 to ubound(sn)
    c00=c00 & vbcr & sn(j,1) & "_" & sn(j,3)
  next
  sn=filter(split(c00,vbcr),"_")

  c00=activecell.value

  for j=0 to ubound(sn)
     sp=filter(sn,c00 & "_")
     if ubound(sp)=-1 then exit for
     c00=split(sp(0),"_")(1)
  next
  msgbox "aantal generaties = " & j
end sub
 
Hoi snb

Dankjewel, ik ga jouw code zeker proberen.

Ik ben pas net begonnen met VBA, ik heb wel wat ervarig met andere talen.
Maar ik ben echt nog bezig de basisprincipes van VBA onder de knie te krijgen, manipuleer wat celletjes enzo.
Daarna ga ik me eens toeleggen op het schrijven van programmatjes waarmee ik de boel nog sneller en efficienter kan laten werken.
Ik heb de code zo gemaakt omdat ik dan kan zien wat er gebeurd, en omdat ik dan kan checken of dat klopt. Mijn eigen varnamen snap ik en herken ik.

Als ik zo vrij mag zijn:
wat is sn en waar is de current region op gebaseerd?
Waar komen c00 en vbcr vandaan?
Wat is de functie van die underscore die er steeds achter komt?

Misschien kun je per regel code aangeven wat de code doet, dan kan ik zelf bovenstaande vragen wel beantwoorden ;)
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan