Help!

PC-Problemen?
De vrijwilligers van Oplossing.be zoeken gratis met u mee!

Hulp bij posten

Recente topics

Auteur Topic: VBA gegevens wegschrijven in bepaalde richting volgens aantal  (gelezen 4665 keer)

0 leden en 1 gast bekijken dit topic.

Offline BlackDevil

  • Ambassadeur
  • *****
  • Berichten: 1.029
  • Geslacht: Vrouw
  • veni vidi vici
VBA gegevens wegschrijven in bepaalde richting volgens aantal
« Gepost op: 24 april 2021, 11:27:08 »
Hallokes iedereen,

Als bijkomend onderdeel van één van mijn vorige projectjes ben ik alweer op een hindernis gestoten.

Ik heb dus enerzijds een werkblad (data) met een tabel gegevens en anderzijds een werkblad (print) waarop ik in een bepaalde
structuur de gegevens uit het werkblad "data" wil wegschrijven.

Wat de structuur betreft lukt het mij om het gewenste resultaat te krijgen maar de gegevens zelf worden verkeerdelijk weergegeven.
De bedoeling is dat elke rij gegevens word weggeschreven in een kolom met telkens 2 gegevensrijen per kolom. Dus de gegevensrijen 1 & 2 in de eerst bepaalde kolom, 3 & 4 in de tweede bepaalde kolom, 5 & 6 in de derde bepaalde kolom, enz...

Het resultaat dat ik nu met mijn code krijg is dat elke gegevensrij 2x in dezelfde kolom word weggeschreven. dus gegevensrij 1 2x in de eerst bepaalde kolom, gegevensrij 2 2x in de tweede bepaalde kolom, enz...

Dus ofwel ontbreekt er iets in de structuur van de code ofwel is de structuur verkeerd opgebouwd maar ik raak er echt niet uit (kennis is nog net iets te beperkt).

Mijn origineel bestand is veel uitgebreider en complexer dan mijn bestandje dat ik hier bijvoeg. Het bijgevoegde bestand is dus gewoon een klein voorbeeld van wat het moet worden. De latere aanpassingen aan de code voor het uitgebreidere bestand zouden met mijn huidige kennis  in principe niet al te problematisch zijn.

Alvast dank op voorhand.

groetjes,
BlackDevil
1) HP ProDesk (Windows 10 Pro Edu / Intel(R) Core(TM) i5-7500 CPU@ 3.40Ghz 3.41Ghz)
2) Laptop ASUS (Windows 10 Home / Intel(R) Core(TM) i3-3110M CPU@ 2.40GHz 2.40GHz)
Beide (RAM : 8,00 GB / 64-bits besturingssysteem, x64-processor)
Extern (Seagate Backup+ Hub 6TB / Seagate BUP Slim 2TB / Seagate Expansion Desk 5TB / HP ENVY 6030e)
Bullguard Premium Protection / Office Pro Plus 2016 NL

Offline Ntr

  • Lid
  • *
  • Berichten: 20
  • Geslacht: Man
  • Oplossing.be
Re: VBA gegevens wegschrijven in bepaalde richting volgens aantal
« Reactie #1 Gepost op: 24 april 2021, 17:03:10 »
Zou dit in de richting komen?
Sub test()
Dim rij As Long, kol As Long
  rij = 1
  kol = 2
 
  With Sheets("data")
    For i = 2 To .Cells(Rows.Count, 1).End(xlUp).Row
      Sheets("print").Cells(rij, kol).Resize(4) = Application.Transpose(.Cells(i, 1).Resize(, 4))
     
      If kol = 10 Then
        kol = 2
        rij = rij + 6
      Else
        kol = kol + 2
      End If
     
    Next
  End With
End Sub

Offline BlackDevil

  • Ambassadeur
  • *****
  • Berichten: 1.029
  • Geslacht: Vrouw
  • veni vidi vici
Re: VBA gegevens wegschrijven in bepaalde richting volgens aantal
« Reactie #2 Gepost op: 24 april 2021, 19:24:04 »
Hallo Ntr,

Alvast enorm bedankt voor je bijdrage.
Helaas is dit niet wat ik zoek.
In het originele bestand zijn veel meer gegevens aanwezig dus de gegevenstabel moet effectief ingelezen worden en vervolgens moeten enkel de gewenste gegevens weggeschreven worden. Gewoon transpose is dus niet geschikt voor de werking in mijn bestand.
Ook dient het in een specifieke volgorde te worden weggeschreven.
Met jouw code krijg ik in de eerst bepaalde kolom (kolom 2) de gegevens uit de rijen 1 en 6 terwijl dit de gegevens uit de rijen 1 en 2 moet zijn.
Nogmaals bedankt voor je bijdrage, misschien komt deze wel eens van pas bij een ander project.

groetjes,
BlackDevil
1) HP ProDesk (Windows 10 Pro Edu / Intel(R) Core(TM) i5-7500 CPU@ 3.40Ghz 3.41Ghz)
2) Laptop ASUS (Windows 10 Home / Intel(R) Core(TM) i3-3110M CPU@ 2.40GHz 2.40GHz)
Beide (RAM : 8,00 GB / 64-bits besturingssysteem, x64-processor)
Extern (Seagate Backup+ Hub 6TB / Seagate BUP Slim 2TB / Seagate Expansion Desk 5TB / HP ENVY 6030e)
Bullguard Premium Protection / Office Pro Plus 2016 NL

Offline JEC

  • Excel-Expert
  • Ervaren lid
  • *****
  • Berichten: 422
Re: VBA gegevens wegschrijven in bepaalde richting volgens aantal
« Reactie #3 Gepost op: 24 april 2021, 20:09:07 »
Misschien dat dit je helpt.

Je hoeft ook niet van tevoren de datum, naam, ouders, doopsel.. in te voeren.
Runnen en gaan

Sub jvee()
jv = Sheets(1).Cells(1).CurrentRegion.Resize(, 6)
  ReDim ar(11, UBound(jv))
      For i = 1 To UBound(jv) Step 2
         For ii = 1 To UBound(jv, 2)
            On Error Resume Next
             ar(j, jj) = jv(1, ii)
             ar(j + 6, jj) = jv(1, ii)
             ar(j, jj + 1) = jv(i + 1, ii)
             ar(j + 6, jj + 1) = jv(i + 2, ii)
             j = j + 1
        Next
       jj = jj + 2
       j = 0
     Next
 Sheets("print").Cells(1, 1).Resize(UBound(ar) + 1, UBound(ar, 2)) = ar
End Sub

Offline BlackDevil

  • Ambassadeur
  • *****
  • Berichten: 1.029
  • Geslacht: Vrouw
  • veni vidi vici
Re: VBA gegevens wegschrijven in bepaalde richting volgens aantal
« Reactie #4 Gepost op: 25 april 2021, 09:17:34 »
@Veerj,

Ook mijn oprechte dank voor jouw bijdrage.
Je hoeft ook niet van tevoren de datum, naam, ouders, doopsel.. in te voeren.
Hiervoor heb ik een aparte code geschreven gezien het een specifieke layout met specifieke tekst-opmaak moet zijn incl paginatitels ed.

@allen,

Omdat ik mijn oorspronkelijk bestand te uitgebreid vond om hier te plaatsen had ik dus een simpel test-bestandje gemaakt met minimale
inhoud, net voldoende om het gevraagde te kunnen aantonen.
Echter, uit de bijdragen die ik tot nog toe heb mogen ontvangen blijkt dat ik mijn test-bestand iets té simpel had gemaakt waardoor het doel onvoldoende
duidelijk blijkt te zijn.
Daarom hang ik nu een iets uitgebreidere versie van het test-bestand aan.

Bedoeling van het "print"-werkblad is dat hier in een bepaalde layout de gewenste gegevens uit het "data"-werkblad worden geplaatst zodat dit netjes kan worden uitgeprint.
En dit telkens per 10 groepjes (1 groep op "print" = 1 gegevensrij uit "data") met bovenaan een paginatitel over 2 kolommen.
Voor de paginatitels en de vaste weerkerende tekst in elke 1e kolom heb ik een aparte code geschreven (mod_layout).
Elke 2 kolommen zijn dus telkens 1 pagina om uit te printen.

Uiteindelijk moeten dus de eerste 10 gegevensrijen op de 1e pagina, de 10 volgende gegevensrijen op de 2e pagina, enz... komen te staan. (in het test-bestand zijn momenteel maar 15 gegevensrijen opgenomen maar in het oorspronkelijk bestand zijn het er dus wel veel meer)

Met mijn code (mod_dataprint) lukt het om de gegevens-groepjes telkens per 10 groepjes weg te schrijven per pagina maar het probleem is dat er ergens
iets ontbreekt in mijn code aangezien hij in elk groepje over elke pagina enkel de laatste gegevensrij plaatst.

Ik moet dus gewoon die kleine aanpassing in de code vinden zodat elk groepje in volgorde overeenstemt met elke aanwezige gegevensrij.

Alvast nogmaals mijn oprechte dank.

groetjes,
BlackDevil

1) HP ProDesk (Windows 10 Pro Edu / Intel(R) Core(TM) i5-7500 CPU@ 3.40Ghz 3.41Ghz)
2) Laptop ASUS (Windows 10 Home / Intel(R) Core(TM) i3-3110M CPU@ 2.40GHz 2.40GHz)
Beide (RAM : 8,00 GB / 64-bits besturingssysteem, x64-processor)
Extern (Seagate Backup+ Hub 6TB / Seagate BUP Slim 2TB / Seagate Expansion Desk 5TB / HP ENVY 6030e)
Bullguard Premium Protection / Office Pro Plus 2016 NL

Offline Ntr

  • Lid
  • *
  • Berichten: 20
  • Geslacht: Man
  • Oplossing.be
Re: VBA gegevens wegschrijven in bepaalde richting volgens aantal
« Reactie #5 Gepost op: 25 april 2021, 11:13:51 »
Op deze manier?
Sub dataprint()
Dim rij As Long, kol As Long
    rij = 6
    kol = 2
With Sheets("data")
pr = .Cells(Rows.Count, 1).End(xlUp).Row
For t = 2 To pr

    plaats = .Cells(t, 8)
    naam = .Cells(t, 3)
    vrnm = .Cells(t, 4)
    datum = .Cells(t, 5) & "-" & .Cells(t, 6) & "-" & .Cells(t, 7)
    vader = naam & " " & .Cells(t, 9)
    moeder = .Cells(t, 10) & " " & .Cells(t, 11)
    ouders = vader & " " & moeder
    If .Cells(t, 9) = "onwettig" Then ouders = moeder
    peter = .Cells(t, 12)
    meter = .Cells(t, 13)
   
    With Sheets("print")
        .Cells(rij, kol) = datum & "          " & plaats
        .Cells(rij + 1, kol) = naam & " " & vrnm
        .Cells(rij + 2, kol) = ouders
        .Cells(rij + 3, kol) = peter & " & " & meter
   
        If rij = 60 Then
            rij = 6
            kol = kol + 2
          Else
            rij = rij + 6
          End If
    End With
Next t
End With
End Sub

Offline BlackDevil

  • Ambassadeur
  • *****
  • Berichten: 1.029
  • Geslacht: Vrouw
  • veni vidi vici
Re: VBA gegevens wegschrijven in bepaalde richting volgens aantal
« Reactie #6 Gepost op: 25 april 2021, 11:47:43 »
Hey Ntr,

Hartelijk dank voor deze bijdrage, deze werkt (bijna) correct.  :thumbsup:
Het enige wat ik er nog ergens moet tussen zetten is een stukje code dat hij na de laatste gevulde gegevens-rij moet stoppen.
Nu word die laatste gegevens-rij herhaald tot op het einde van de laatste pagina.

Ik ga eventjes uitzoeken hoe ik dat voor elkaar kan krijgen.

groetjes,
BlackDevil
1) HP ProDesk (Windows 10 Pro Edu / Intel(R) Core(TM) i5-7500 CPU@ 3.40Ghz 3.41Ghz)
2) Laptop ASUS (Windows 10 Home / Intel(R) Core(TM) i3-3110M CPU@ 2.40GHz 2.40GHz)
Beide (RAM : 8,00 GB / 64-bits besturingssysteem, x64-processor)
Extern (Seagate Backup+ Hub 6TB / Seagate BUP Slim 2TB / Seagate Expansion Desk 5TB / HP ENVY 6030e)
Bullguard Premium Protection / Office Pro Plus 2016 NL

Offline JEC

  • Excel-Expert
  • Ervaren lid
  • *****
  • Berichten: 422
Re: VBA gegevens wegschrijven in bepaalde richting volgens aantal
« Reactie #7 Gepost op: 25 april 2021, 11:52:24 »
Ook nog een vb. Verwijder eerst alle data die je als voorbeeld had weergegeven op tabblad "print".
Als je daarna de macro runt, zul je zien dat de laatste rij niet wordt herhaald t/m de laatste pagina.

Sub jvvv()
 With Sheets(1).Cells(1).CurrentRegion
   For i = 2 To .Rows.Count
      Datum = .Cells(i, 5) & "-" & .Cells(i, 6) & "-" & .Cells(i, 7)
      Dopeling = .Cells(i, 3) & " " & .Cells(i, 4)
      Ouders = .Cells(i, 3) & " " & .Cells(i, 9) & " " & .Cells(i, 10) & " " & .Cells(i, 11)
      Doopgetuigen = .Cells(i, 12) & " & " & .Cells(i, 13)
         
      If j = 60 Then j = 0: jj = jj + 2
      Sheets("print").Cells(j + 6, jj + 2).Resize(4) = Application.Transpose(Array(Datum, Dopeling, Ouders, Doopgetuigen))
      j = j + 6
   Next
 End With
End Sub

Offline BlackDevil

  • Ambassadeur
  • *****
  • Berichten: 1.029
  • Geslacht: Vrouw
  • veni vidi vici
Re: VBA gegevens wegschrijven in bepaalde richting volgens aantal
« Reactie #8 Gepost op: 25 april 2021, 12:00:28 »
@Veerj,

Héhé, ik wou net mijn bericht aanpassen omdat ik net gemerkt had dat mijn kolommen nog gevuld waren met mijn eerdere probeersels
toen ik jouw laatste berichtje zag.  ;D

De laatste code van Ntr werkt dus volledig correct  ;) :thumbsup:

groetjes,
BlackDevil

1) HP ProDesk (Windows 10 Pro Edu / Intel(R) Core(TM) i5-7500 CPU@ 3.40Ghz 3.41Ghz)
2) Laptop ASUS (Windows 10 Home / Intel(R) Core(TM) i3-3110M CPU@ 2.40GHz 2.40GHz)
Beide (RAM : 8,00 GB / 64-bits besturingssysteem, x64-processor)
Extern (Seagate Backup+ Hub 6TB / Seagate BUP Slim 2TB / Seagate Expansion Desk 5TB / HP ENVY 6030e)
Bullguard Premium Protection / Office Pro Plus 2016 NL

Offline JEC

  • Excel-Expert
  • Ervaren lid
  • *****
  • Berichten: 422
Re: VBA gegevens wegschrijven in bepaalde richting volgens aantal
« Reactie #9 Gepost op: 25 april 2021, 12:09:26 »
Mooi zo :)
Als je echt heel veel data hebt zal de laatste code de snelste zijn om dat de array in een keer wordt weggeschreven. ;)

Offline BlackDevil

  • Ambassadeur
  • *****
  • Berichten: 1.029
  • Geslacht: Vrouw
  • veni vidi vici
Re: VBA gegevens wegschrijven in bepaalde richting volgens aantal
« Reactie #10 Gepost op: 25 april 2021, 12:36:40 »
@Veerj,

Ja, momenteel heb ik in mijn origineel bestand maar 194 gegevensrijen maar uiteindelijk gaan dat er wel duizenden worden dus dan zal mbt snelheid jouw laatste code misschien toch beter zijn... ;)

Bedankt nog voor die laatste bijdrage  :thumbsup:


groetjes,
BlackDevil
1) HP ProDesk (Windows 10 Pro Edu / Intel(R) Core(TM) i5-7500 CPU@ 3.40Ghz 3.41Ghz)
2) Laptop ASUS (Windows 10 Home / Intel(R) Core(TM) i3-3110M CPU@ 2.40GHz 2.40GHz)
Beide (RAM : 8,00 GB / 64-bits besturingssysteem, x64-processor)
Extern (Seagate Backup+ Hub 6TB / Seagate BUP Slim 2TB / Seagate Expansion Desk 5TB / HP ENVY 6030e)
Bullguard Premium Protection / Office Pro Plus 2016 NL

Offline BlackDevil

  • Ambassadeur
  • *****
  • Berichten: 1.029
  • Geslacht: Vrouw
  • veni vidi vici
Re: VBA gegevens wegschrijven in bepaalde richting volgens aantal
« Reactie #11 Gepost op: 25 april 2021, 14:57:35 »
@Veerj,

Graag zou ik nog eventjes beroep doen op jouw expertise inzake sneller werkende code.

Ik heb me net nog wat beziggehouden met het uitbreiden van mijn layout-code zoals uitbreiding naar 50 pagina's, cellen voor de titels samenvoegen, lettergrootte en cel-uitlijning voor de titels, uitlijning, kleur en lettertype van de kolommen, enz...
Dit werkt allemaal naar behoren maar omwille van die 'merge'-code voor het samenvoegen van die titel-cellen duurt het vrij lang om die layout te verwerken.
Weet jij misschien een manier om die 'merge'-code sneller te laten werken? Als er geen snellere manier zou zijn dan moet het maar telkens met wat extra tijd...

Ik hang even het bijgewerkte bestandje nog eens aan.
Alvast mijn oprechte dank.

groetjes,
BlackDevil
1) HP ProDesk (Windows 10 Pro Edu / Intel(R) Core(TM) i5-7500 CPU@ 3.40Ghz 3.41Ghz)
2) Laptop ASUS (Windows 10 Home / Intel(R) Core(TM) i3-3110M CPU@ 2.40GHz 2.40GHz)
Beide (RAM : 8,00 GB / 64-bits besturingssysteem, x64-processor)
Extern (Seagate Backup+ Hub 6TB / Seagate BUP Slim 2TB / Seagate Expansion Desk 5TB / HP ENVY 6030e)
Bullguard Premium Protection / Office Pro Plus 2016 NL

Offline JEC

  • Excel-Expert
  • Ervaren lid
  • *****
  • Berichten: 422
Re: VBA gegevens wegschrijven in bepaalde richting volgens aantal
« Reactie #12 Gepost op: 26 april 2021, 09:20:26 »
Zo is hij al een stuk sneller (Gemiddeld 8x sneller ;))

Sub layout()
Application.ScreenUpdating = False
Application.DisplayAlerts = False
 With Sheets("print")
  For i = 1 To 100
    If i Mod 2 <> 0 Then
         For j = 6 To 60 Step 6
            .Cells(j, i).Resize(4) = Application.Transpose(Array("Datum :", "Dopeling :", "Ouders :", "Doopgetuigen :"))
            .Cells(j, i).Offset(4).Resize(2, 2).Borders(xlEdgeBottom).LineStyle = 1
            .Cells(j, i).Offset(4).Resize(2).RowHeight = 5
         Next
           With .Columns(i)
              With Sheets("print").Cells(1, i)
                .Value = "Dopen/Geboorten"
                .Resize(, 2).Merge
                .Font.Size = 16
                .HorizontalAlignment = xlCenter
                .Offset(2) = "Stamnaam 'Bockstaele'"
                .Offset(2).Resize(, 2).Merge
                .Offset(2).Font.Size = 14
                .Offset(2).HorizontalAlignment = xlCenter
              End With
                .ColumnWidth = 23
                .Font.ColorIndex = 56
                .Font.Bold = True
                .HorizontalAlignment = xlRight
           End With
    Else
          With .Columns(i)
                .ColumnWidth = 50
                .Font.Color = vbBlue
                .Font.Bold = True
                .HorizontalAlignment = xlRight
                .Font.Name = "Monotype Corsiva"
          End With
    End If
  Next
 End With
Application.DisplayAlerts = True
End Sub

Offline BlackDevil

  • Ambassadeur
  • *****
  • Berichten: 1.029
  • Geslacht: Vrouw
  • veni vidi vici
Re: VBA gegevens wegschrijven in bepaalde richting volgens aantal
« Reactie #13 Gepost op: 26 april 2021, 10:10:05 »
Hey Veerj,

 :thumbsup: :thumbsup: Inderdaad een pak sneller  ;D ;)

Heb wel één klein dingetje moeten aanpassen :

van .Cells(j, i).Offset(4).Resize(2, 2).Borders(xlEdgeBottom).LineStyle = 1heb ik het volgende moeten maken
.Cells(j, i).Offset(4).Resize(1, 2).Borders(xlEdgeBottom).LineStyle = 1
Maar echt wel super deze oplossing mbt de snelheid. Bedankt!  _/-\o_

groetjes,
BlackDevil
1) HP ProDesk (Windows 10 Pro Edu / Intel(R) Core(TM) i5-7500 CPU@ 3.40Ghz 3.41Ghz)
2) Laptop ASUS (Windows 10 Home / Intel(R) Core(TM) i3-3110M CPU@ 2.40GHz 2.40GHz)
Beide (RAM : 8,00 GB / 64-bits besturingssysteem, x64-processor)
Extern (Seagate Backup+ Hub 6TB / Seagate BUP Slim 2TB / Seagate Expansion Desk 5TB / HP ENVY 6030e)
Bullguard Premium Protection / Office Pro Plus 2016 NL

Offline JEC

  • Excel-Expert
  • Ervaren lid
  • *****
  • Berichten: 422
Re: VBA gegevens wegschrijven in bepaalde richting volgens aantal
« Reactie #14 Gepost op: 26 april 2021, 10:14:44 »
Graag gedaan! ;D

 


www.combell.com