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

Vraag over oplossing HSV/WHER

Status
Niet open voor verdere reacties.

jansm

Gebruiker
Lid geworden
2 apr 2014
Berichten
421
HSV heeft voor mij ca 10 mnd geleden een code geschreven die zo heftig is dat ik er geen veranderingen/toevoegingen in kan aanbrengen.
De code verzamelt gegevens uit 2 tabbladen (PERSONEN EN FEITEN) en voegt 2 of meerdere regels onder een andere regel. Hij zoekt in tabblad FEITEN naar ALIAS en voegt deze in een nieuwe regel toe aan tabblad verzamel. Nu mis ik het Internnummer (kolom A) dat in FEITEN bij de ALIAS vermeld staat. Ik wil dat graag ook in kolom A van de toegevoegde regel hebben (zie gele cellen kolom A). Kan HSV of iemand anders dat nog fixen voor mij? Het is zo dat het nummer echt uit FEITEN moet komen en niet gekopieerd wordt uit de regel daarboven.
Snap je hem nog?Bekijk bijlage HSV.xlsb
 
Is het zo compleet?
Zie blauwe coderegel.
Code:
Private Sub Commandbutton2_Click()
Dim sn, sp, arr, arr2
Dim i As Long, n As Long, j As Long, jj As Long, jjj As Long, jjjj As Long, a As Long
Dim Dic As Object
Dim id As String
Dim c As Range
Dim t As Single
t = Timer
Application.ScreenUpdating = False
 Set Dic = CreateObject("Scripting.Dictionary")
   sn = Sheets("personen").Cells(1).CurrentRegion
   sp = Sheets("feiten").Cells(1).CurrentRegion
      ReDim arr(1 To UBound(sn) + UBound(sp), 1 To UBound(sn, 2))
       n = UBound(sn) + UBound(sp)
        For i = UBound(sn) To 1 Step -1
         id = sn(i, 1) & "_" & sn(i, 9)
            If Not Dic.Exists(id) Then
                 Dic(id) = 0
                  For jj = UBound(sp) To 2 Step -1
                      If sn(i, 1) = sp(jj, 1) And sp(jj, 18) = "ALIAS" Then
                        n = n - 1
[COLOR=#0000ff]                        arr(n, 1) = sp(jj, 1)[/COLOR]
                        arr(n, 5) = sp(jj, 19)
                      End If
                    Next jj
                  n = n - 1
                 For j = 1 To UBound(arr, 2)
                   arr(n, j) = sn(i, j)
                 Next j
            End If
        Next i
   ReDim arr2(1 To UBound(arr), 1 To UBound(arr, 2))
    aa = UBound(arr) - n
    n = 0
   
  For jjj = UBound(arr) - aa To UBound(arr)
       n = n + 1
        For jjjj = 1 To UBound(arr, 2)
          nn = nn + 1
          arr2(n, nn) = arr(jjj, jjjj)
        Next jjjj
        nn = 0
      Next jjj
   Sheets("test").Cells(1).Resize(UBound(arr2), UBound(arr2, 2)) = arr2
   Debug.Print Format(Timer - t, "0.0000"), "hsv 2"
 Set Odic = Nothing
 Application.ScreenUpdating = True
End Sub
 
YES!
Zou je met een paar woorden aan willen geven wat die coderegel nu eigenlijk doet? Ik heb geprobeerd om er achter te komen door die 1 voor en/of na het = teken in een 2 te veranderen meer zie dan geen verschil in uitvoer. Liefst voor de hele code maar snap het als dat te veel gevraagd is.
Alvast heel erg bedankt Harry
 
Zou je dat geplaatste internnummer in kolom A een blauw kleurtje kunnen geven?
 
Jan,

De 1 in arr(n, 1) staat voor de eerste kolom in de container van de array 'arr', de 1 in sp(jj, 1) staat voor de eerste kolom van tabblad 'Feiten'.

Het is ook geen doorsnee code, als ik me van de week verveel zal ik het weer eens helemaal uit pluizen en de code van commentaar voorzien (maar ik beloof niets).
 
...zou geweldig zijn. Voor de herkenning van ALIAS zou je die nog een kleurtje kunnen geven?
 
Voeg de twee blauwe regels toe.
Code:
Sheets("test").Cells(1).Resize(UBound(arr2), UBound(arr2, 2)) = arr2
[COLOR=#0000ff]    On Error Resume Next[/COLOR]
[COLOR=#0000ff]    Columns(3).SpecialCells(4).Offset(, -2).Font.Color = vbBlue[/COLOR]
   Debug.Print Format(Timer - t, "0.0000"), "hsv 2"
 Set Odic = Nothing
 Application.ScreenUpdating = True
End Sub
 
Jan,

Zet onderstaande code in de module van toepassing en dan zie mijn commentaar in het groen.
Code:
Private Sub Commandbutton2_Click()
Dim sn, sp, arr, arr2 'delareren van alle variabelen
Dim i As Long, n As Long, j As Long, jj As Long, jjj As Long, jjjj As Long, a As Long  'declaratie
Dim Dic As Object 'idem
Dim id As String  'idem
Dim c As Range    'idem
Dim t As Single   'idem
t = Timer  'spreekt voor zich
Application.ScreenUpdating = False  'tegen flikkeren van het scherm
 Set Dic = CreateObject("Scripting.Dictionary")  'dictionary aanmaken om dubbele gegevens tegen te gaan.
   sn = Sheets("personen").Cells(1).CurrentRegion   'gooi alle aaneengesloten gegevens in de array "sn".
   sp = Sheets("feiten").Cells(1).CurrentRegion     ' idem als sn maar dan sp.
      ReDim arr(1 To UBound(sn) + UBound(sp), 1 To UBound(sn, 2)) 'maak een array aan met de grootte van 1 tot de rijen van 'sn' + 'sp', en de breedte van de kolommen van 'sn'.
       n = UBound(sn) + UBound(sp)  'geef 'n' de waarde van de rijen sn+sp.
        For i = UBound(sn) To 1 Step -1  'van onderen naar boven de lus laten lopen.
         id = sn(i, 1) & "_" & sn(i, 9)  'maak een id aan van de de gegevens uit de array (doorsnede kolom A en kolom I met de underscore als acheidingsteken).
            If Not Dic.Exists(id) Then  'als het niet aanwezig is maak het aan in de volgende regel
                 Dic(id) = 0
                  For jj = UBound(sp) To 2 Step -1   'van onderen naar boven de lus laten lopen (laatste cel tot 2)
                      If sn(i, 1) = sp(jj, 1) And sp(jj, 18) = "ALIAS" Then  'als de rij van kolom A van blad 'personen' gelijk is aan de rij van kolom A van blad 'feiten' en de rij op kolom R = "Alias" dan
                        n = n - 1  'verlaag dan n minus 1
                        arr(n, 1) = sp(jj, 1)  'arr(waarde van n,1), wordt de waarde van sp(jj,1)
                        arr(n, 5) = sp(jj, 19)  'arr(waarde van n,5), wordt de waarde van sp(jj,19)
                      End If
                    Next jj
                  n = n - 1
                 For j = 1 To UBound(arr, 2)  'een lus van links naar rechts waarmee j steeds ophoogt met 1
                   arr(n, j) = sn(i, j)       'arr(n,j) krijgt de waarde van sn(i,j)
                 Next j   'volgende j tot einde
            End If
        Next i
   ReDim arr2(1 To UBound(arr), 1 To UBound(arr, 2))  'maak een nieuwe array met arr2
    aa = UBound(arr) - n   'aa krijgt de waarde door getalletjes van elkaar af te trekken
    n = 0
   
  For jjj = UBound(arr) - aa To UBound(arr)  'nieuwe lus jjj
       n = n + 1                             'spreekt voor zich nu (elke keer dat j wordt verhoogt, wordt n een groter getal).
        For jjjj = 1 To UBound(arr, 2)      'moet je nu wel weten
          nn = nn + 1
          arr2(n, nn) = arr(jjj, jjjj)      'arr2(n,nn) krijgt de waarde van arr(jjj,jjjj)
        Next jjjj                           'volgende jjjj
        nn = 0                         'maak n weer nul
      Next jjj                         'volgende jjj
  With Sheets("test")                  'alles met een punt voor elk stukje code heeft betrekking op blad "test".
     .Cells(1).Resize(UBound(arr2), UBound(arr2, 2)) = arr2   'alle gegevens van de array arr2 worden weggeschreven (rijen en kolommen)
    On Error Resume Next    'om geen foutmelding in de code te krijgen in volgende regelcode als er geen lege cellen zijn
     .Columns(3).SpecialCells(4).Offset(, -2).Font.Color = vbBlue  'voor alle lege cellen in kolom C en dan twee kolommen naar links die tekstkleur blauw maken
    End With   'einde met betrekking op tabblad 'test'.
   Debug.Print Format(Timer - t, "0.0000"), "hsv 2"   'ga voor deze coderegel naar Menu Beeld > Venster direct om de snelheid uit te lezen.
 Set Odic = Nothing   'de boel weer opruimen
 Application.ScreenUpdating = True   'mag ook weggelaten worden trouwens (na afloop code keert scherm automatisch terug
End Sub  'einde verhaal
 
Harry, bedankt voor de moeite. Geeft voor mij indicatie welke regel wat doet.
Maar wat doet de 4e coderegel van onder?
Debug.Print Format(Timer - t, "0.0000"), "hsv 2" 'ga voor deze coderegel naar Menu Beeld > Venster direct om de snelheid uit te lezen.
Waar duidt "hsv 2" in deze regel eigenlijk op?

Mvg jansm
 
We hebben destijds de snelheden vergeleken.
Elke code heeft een snelheid, maar als je alleen maar tijden ziet in een rijtje onder elkaar weet je niet meer welke snelheid bij welke code hoort.
Achter de tijd komt dan "hsv2" (de naam van de code) te staan.
Zo konden we mooi zien welke code het snelst was.

In principe kan dat er nu wel uit; net als t = timer en de declaratie van t.
 
Harry, ik heb de code iets aangepast. In plaats van blauwe font (kolom A) heb ik cel van de de alias in kolom E een interior color gegeven.
Sheets("test").Cells(1).Resize(UBound(arr2), UBound(arr2, 2)) = arr2
On Error Resume Next
'.Columns(3).SpecialCells(4).Offset(, -2).Font.Color = vbBlue
.Columns(3).SpecialCells(4).Offset(, 2).Interior.Color = 6750105
End With 'einde met betrekking op tabblad 'test'.
Is opvallender, beter leesbaar. Probleem is dat ook de regels na de laatste regel de achtergrond kleur doorloopt. Is de code zo te maken dat hij niet meer na de laatste regel inkleurd? Ook bij hergebruik (met minder regels) van de code blijft de opmaak bestaan. Is het slim om in het begin van de code een tabblad-schoonmaakactie te plannen?
Bekijk bijlage HSV_2.xlsb

gr jansm
 
Laatst bewerkt:
Het laatste gedeelte van de code.
Code:
For jjj = UBound(arr) - aa To UBound(arr)  'nieuwe lus jjj
       n = n + 1                             'spreekt voor zich nu (elke keer dat j wordt verhoogt, wordt n een groter getal).
        For jjjj = 1 To UBound(arr, 2)      'moet je nu wel weten
          nn = nn + 1
          arr2(n, nn) = arr(jjj, jjjj)      'arr2(n,nn) krijgt de waarde van arr(jjj,jjjj)
        Next jjjj                           'volgende jjjj
        nn = 0                         'maak n weer nul
      Next jjj                         'volgende jjj
  With Sheets("test")                 'alles met een punt voor elk stukje code heeft betrekking op blad "test".
     .Cells(1).CurrentRegion.Clear
     .Cells(1).Resize(UBound(arr2), UBound(arr2, 2)) = arr2   'alle gegevens van de array arr2 worden weggeschreven (rijen en kolommen)
    On Error Resume Next    'om geen foutmelding in de code te krijgen in volgende regelcode als er geen lege cellen zijn
        '.Columns(3).SpecialCells(4).Offset(, -2).Font.Color = vbRed 'voor alle lege cellen in kolom C en dan twee kolommen naar links die tekstkleur blauw maken
        .Columns(3).SpecialCells(4).Offset(, 2).SpecialCells(2).Interior.Color = vbGreen ' 6750105
    End With   'einde met betrekking op tabblad 'test'.
   Debug.Print Format(Timer - t, "0.0000"), "hsv 2"   'ga voor deze coderegel naar Menu Beeld > Venster direct om de snelheid uit te lezen. KAN WEG!!!
 Set Odic = Nothing   'de boel weer opruimen
 Application.ScreenUpdating = True   'mag ook weggelaten worden trouwens (na afloop code keert scherm automatisch terug
End Sub  'einde verhaal
 
Dank!
moet ik de file nu gebruiken/opslaan als xlsm of xlsb?
 
Wat jij wilt.
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan