Kolommen worden zichtbaar bij kopiëren

Status
Niet open voor verdere reacties.

Klungeltje

Gebruiker
Lid geworden
11 dec 2013
Berichten
7
Hallo allemaal,
ik zit met een probleem:
Elke dag worden er labowaarden in een kolom ingevuld (1 kolom = 1 dag).
Om het document overzichtelijk te houden, zijn alleen de kolommen zichtbaar waarin reeds gewerkt is.
Met andere woorden, bij het invullen van de waarden via een Userform wordt de betrokken kolom (dag) zichtbaar.
Tot dusver geen probleem.
Maar, op het einde van elke dag moeten deze waarden naar een ander exceldocument gekopieerd worden.
Dit nieuwe Exceldocument vormt dan het dagdossier voor morgen van deze patiënt.
En hier gaat het mis. In het nieuwe dagdossier is er geen enkele kolom meer verborgen.
Hoe kan ik mijn code aanpassen zodat de verborgen kolommen van het oude dossier ook in het nieuwe dossier verborgen zijn?

In het voorbeeld heb ik het aantal kolommen beperkt gehouden, in werkelijkheid gaat het over een 150-tal dagen en worden er heel wat meer gegevens geregistreerd.

Alvast bedankt om hier samen met mij over na te denken!

Code:
Range("D5:I7").Select
    Selection.Copy
    Workbooks.Add
    Range("D5").Select
    ActiveSheet.Past
 

Bijlagen

't Is niet netjes geprogrammeerd (ben doorgegaan op jullie code) maar het werkt wel, en het gaat ook meer om het idee:

Code:
Sub NaarVolgendeDossier()
Dim rng As Range
Dim iB() As Variant
Dim i As Integer, x As Integer
' De macro is opgenomen op 11/12/2013 door Danny en Anja.
    Set rng = Range("D5:I7")
    i = rng.Columns.Count
    ReDim iB(i)
    For x = 1 To i
        iB(x) = rng.Cells(1, x).ColumnWidth
    Next x
    rng.Select
    Selection.Copy
    Workbooks.Add
    Range("C4").Select
    ActiveSheet.Paste
    For x = 1 To UBound(iB)
        ActiveCell.Offset(0, x - 1).ColumnWidth = iB(x)
    Next x
End Sub
Een range kopieëren en plakken kan namelijk een heel stuk slimmer. Vraag maar aan snb :)
 
Beste OctaFish,
Bedankt voor je antwoord! Het doet het, prachtig!
Alleen begrijp ik niet alles van de code.

Vooral de 'iB'.
Heb ik het juist dat de 'i' het aantal kolommen is?

En dat 'iB(x) = rng.Cells(1,x).ColumnWidth' er voor zorgt dat de verborgen kolommen ook verborgen blijven? Met andere woorden dat deze er voor zorgt dat de breedte van de kolom behouden wordt? en dus ook als de breedte 0 is (dus verborgen)?

Maar wat doet dit stukje: ' ReDim iB(i)' ?

Maar nog eens, alvast bedankt! Eén ding weet ik zeker, ik heb nog een hele weg te gaan.

Groetjes
 
Om met het laatste te beginnen (want daar draait het idee om): met ReDim iB(i) wordt een matrixvariabele ingesteld op het juiste aantal elementen. En inderdaad, je eerste vraag heeft daar weer mee te maken: dat aantal bepaal je door het aantal kolommen te tellen in de geselecteerde reeks. Deze opdracht doet dus eigenlijk hetzelfde: ReDim iB(rng.Columns.Count). Ik gebruik graag variabelen, zodat ik in de stapmodus de waarde van de gegevens kan controleren. Vandaar de variabele i.
Wat er dus gebeurt, is eigenlijk simpel: om de kolommen van het geplakte blok juist in te kunnen stellen, moet je weten hoe breed de oorspronkelijke kolommen zijn. Die waarden worden in iB opgeslagen. Om de code variabel te houden, en je van te voren wellicht niet altijd weet hoeveel kolommen je wilt aanpassen, tel ik de kolommen in de selectie (de rng variabele). Op basis van dat aantal kolommen stel je de array variabele in op het juiste aantal elementen; voor elke kolom sla je één breedte op. Als je die waarden hebt ingelezen, kun je het blok plakken in het nieuwe werkblad. Vervolgens ga je elke kolombreedte instellen op basis van de eerder ingelezen waarden, die in iB staan.
Eigenlijk simpel dus. Ik heb vanmiddag de kopieer code nog wat gefatsoeneerd, dus die kan ik je morgen ook nog wel geven.
 
Hallo OctaFish,
bedankt voor de uitleg. Zo wordt het meteen wat duidelijker.
Ik ga me er de volgende dagen (weken) wat in verdiepen.
Ik ben alvast benieuwd naar je volgende code, ook al werkt deze ook perfect!

Bedankt!
 
Zo?

Code:
Sub M_snb()
    Set sn = sheets("Blad1").Range("D5:I7")
    
    With Workbooks.Add.Sheets(1)
        .Range("C4").Resize(sn.Rows.Count, sn.Columns.Count) = sn.Value
        For Each cl In sn.Columns
            .Columns(cl.Column - 1).Hidden = cl.Hidden
        Next
    End With
End Sub
 
Laatst bewerkt:
Hallo OctaFish,
ik heb geprobeerd om je code te implementeren in het document waarin ik aan het werken ben.
Maar wanneer ik de macro start, geeft hij een foutmelding bij: "ActiveSheet.Paste"
Ziehier de code die ik gebruik:

Code:
Sheets("ReFiz").Select

   
    
    	Dim rng As Range
	Dim iB() As Variant
	Dim i As Integer, x As Integer

    Set rng = Range("F4:GX235")
    i = rng.Columns.Count
    ReDim iB(i)
    For x = 1 To i
        iB(x) = rng.Cells(1, x).ColumnWidth
    Next x
    rng.Select
    Selection.Copy

	

Application.Workbooks.Open ActiveWorkbook.Path & "\VoBiz 3.0.xls"
	

    
    	
    With Sheets("ReFiz")
    Range("F4").Select
    ActiveSheet.Paste
    For x = 1 To UBound(iB)
        ActiveCell.Offset(0, x - 1).ColumnWidth = iB(x)
    Next x
End With

Door wat moet ik "ActiveSheet.Paste" vervangen om het te laten werken?

Alvast bedankt!
 
Hallo snb,

ook jij ontzettend bedankt voor je antwoord!
Ik heb het ook geprobeerd en op het bestandje dat ik als voorbeeld doorgemaild heb, gaat het perfect.
Maar in het document waarin ik aan het werken ben, weer niet.
Ziehier de code die ik ervan gemaakt heb:
Code:
Set sn = Range("F4:GX235")


Application.Workbooks.Open ActiveWorkbook.Path & "\VoBiz 30.xls"


With Sheets("ReFiz").Select

'Range("F4").Select
   
        .Range("F4").Resize(sn.Rows.Count, sn.Columns.Count) = sn.Value
        For Each cl In sn.Columns
            .Columns(cl.Column - 1).Hidden = cl.Hidden
        Next
    End With
Bij " .Range("F4").Resize(sn.Rows.Count, sn.Columns.Count) = sn.Value" geeft hij een foutmelding.
Weet u raad?

Alvast bedankt!
 
Doe om te beginnen die .Select achter With Sheets("ReFiz") al eens weg.
 
Probeer eerst de code te begrijpen voordat je hem gaat aanpassen:
Vul eerst nog even de ... in.

Code:
Sub M_snb()
   Set sn = thisworkbook.sheets("..").Range("F4:GX235")

   with workbooks.Open(thisWorkbook.Path & "\VoBiz 30.xls")
     With .Sheets("ReFiz")   
        .Range("F4").Resize(sn.Rows.Count, sn.Columns.Count) = sn.Value
        For Each cl In sn.Columns
            .Columns(cl.Column).Hidden = cl.Hidden
        Next
    End With
  end with
End Sub
 
Laatst bewerkt:
Dank u wel Warme bakkertje, nu voert hij wel de hele opdracht uit!

Hallo snb, ook jij bedankt voor je antwoord. Ik heb je laatste code ingevoegd.
Soms gaat er nog wel iets fout, maar niet altijd.
Wanneer ik enkele kolommen heb open staan (zichtbaar), dan wijzigen deze soms na het uitvoeren van de opdracht.
Maar aangezien het niet altijd gebeurt, ga ik eens kijken welke fout ik maak in de rest van de code.

Mag ik deze vraagstelling nog enkele dagen 'open' laten om nog eventuele vragen te stellen?
 
Bedankt snb, Warme bakkertje en OctaFish voor jullie hulp!
Alles werkt zoals ik het graag zou hebben. Daar ben ik zeer blij om!

Alvast prettige feestdagen en een fantastisch 2014!
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan