[VBA / Excel 2013] Copy/paste verschillende named ranges

Pagina: 1
Acties:

Vraag


  • Stitch!
  • Registratie: Juli 2011
  • Laatst online: 13-11 22:12
Mijn vraag:

Hoe kan ik de inhoud van één gedefinieerde naam (named range) naar een andere gedefineerde naam kopieren, wanneer deze uit verschillende selecties bestaan.

Wat ik al gevonden of geprobeerd heb:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Sub KoffiePasta()

Dim Sheet1 As Range
Dim Sheet2 As Range
Dim C As Range

Set Sheet1 = Range("Bereik1") 'named range
Set Sheet2 = Range("Bereik2") 'named range 2

For Each C In Sheet1

'msgbox(C.value)

Next

End Sub


Met het bovenste stukje vba los ik het eerste stukje van het probleem op, namelijk; door alle waarden in het bereik loopen.

Nu moet ik in de zelfde volgorde deze waarden weer terug schrijven naar de tweede named range: Bereik2, maar dat lukt nog niet goed.

Wat ik heb ik nog meer geprobeerd:
- Data uit Bereik1 in een array knallen en deze terug schrijven naar Bereik2
- Count functie met teller in de for each loop
- offset meenemen en bij de waarde knallen

Zoals jullie waarschijnlijk kunnen zien ben ik duidelijk geen programmeur, maar meestal kom ik met een beetje google/stackoverflow er wel uit. Deze keer helaas niet, maar wellicht heeft iemand hier de oplossing.

Alvast bedankt voor de moeite!

Edit: Geen vraag in titel, excuses, kan deze echter niet meer aanpassen.

[ Voor 3% gewijzigd door Stitch! op 06-01-2017 16:20 . Reden: geen vraag in titel ]

Beste antwoord (via Stitch! op 07-01-2017 10:50)


  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Zo dan? In twee varianten:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
Sub CopyByRange()
    ' kopieer gebied voor gebied; aantal gebieden moet gelijk zijn, maar gebieden mogen van vorm verschil
    Dim bronnen As Areas
    Dim doelen As Areas
    Dim i As Integer
    
    Set bronnen = Range("bron").Areas
    Set doelen = Range("doel").Areas
    
    If (bronnen.Count = doelen.Count) Then
        For i = 1 To bronnen.Count
            bronnen(i).Copy Destination:=doelen(i)
        Next i
    Else
        MsgBox bronnen.Count & " is ongelijk aan " & doelen.Count
    End If
End Sub

Sub CopyWithArray()
    'kopieer met buffer, totaal aantal cellen moet voor doel en bron named range gelijk zijn.
    Dim bronnen As Range
    Dim doelen As Range
    Dim buffer() As Variant
    Dim c As Range
    Dim i As Integer
    
    Set bronnen = Range("bron")
    Set doelen = Range("doel")
    ReDim buffer(bronnen.Count)
    
    If (bronnen.Count = doelen.Count) Then
        For Each c In bronnen
            i = i + 1
            buffer(i) = c.Value
        Next c
        i = 0
        For Each c In doelen
            i = i + 1
            c.Value = buffer(i)
        Next c
    Else
        MsgBox bronnen.Count & " is ongelijk aan " & doelen.Count
    End If
End Sub

[ Voor 9% gewijzigd door Lustucru op 07-01-2017 09:47 ]

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

Alle reacties


  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Stitch! schreef op vrijdag 6 januari 2017 @ 16:17:

Hoe kan ik de inhoud van één gedefinieerde naam (named range) naar een andere gedefineerde naam kopieren, wanneer deze uit verschillende selecties bestaan.
Hebben de selecties wel hetzelfde aantal rijen en kolommen? Evenveel selecties? Licht even toe hoe de verschillende ranges opgebouwd zijn?
- Data uit Bereik1 in een array knallen en deze terug schrijven naar Bereik2
Da's op zich wel een manier die altijd moet werken. Wat lukt er niet, krijg je foutmeldingen oid?
Edit: Geen vraag in titel, excuses, kan deze echter niet meer aanpassen.
Een topicreport (met de gewenste titel) is sneller en makkelijker :)

[ Voor 19% gewijzigd door Lustucru op 06-01-2017 20:49 ]

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


  • Stitch!
  • Registratie: Juli 2011
  • Laatst online: 13-11 22:12
Lustucru schreef op vrijdag 6 januari 2017 @ 17:35:
[...]

Hebben de selecties wel hetzelfde aantal rijen en kolommen? Evenveel selecties? Licht even toe hoe de verschillende ranges opgebouwd zijn?
Bedankt voor je antwoord. Beide selecties hebben zijn identiek, behalve dat er een offset in de kolommen zit.
Omdat de offset(kolommen) niet altijd het zelfde is wil ik het met name ranges doen. De rijen blijven wel altijd gelijk.

De voorbeeld van een deel van de named ranges is:
C26:C29;D37:G41;D44:G51

Over de array methode: Wegschrijven naar een array werkt wel, terug naar meerdere selecties netjes op volgorde werkt niet. Ik krijg de locatie binnen de named range niet bepaald. Range.Item() werkt ook niet omdat deze geen rekening houdt met de juiste kolom.

Acties:
  • Beste antwoord

  • Lustucru
  • Registratie: Januari 2004
  • Niet online

Lustucru

26 03 2016

Zo dan? In twee varianten:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
Sub CopyByRange()
    ' kopieer gebied voor gebied; aantal gebieden moet gelijk zijn, maar gebieden mogen van vorm verschil
    Dim bronnen As Areas
    Dim doelen As Areas
    Dim i As Integer
    
    Set bronnen = Range("bron").Areas
    Set doelen = Range("doel").Areas
    
    If (bronnen.Count = doelen.Count) Then
        For i = 1 To bronnen.Count
            bronnen(i).Copy Destination:=doelen(i)
        Next i
    Else
        MsgBox bronnen.Count & " is ongelijk aan " & doelen.Count
    End If
End Sub

Sub CopyWithArray()
    'kopieer met buffer, totaal aantal cellen moet voor doel en bron named range gelijk zijn.
    Dim bronnen As Range
    Dim doelen As Range
    Dim buffer() As Variant
    Dim c As Range
    Dim i As Integer
    
    Set bronnen = Range("bron")
    Set doelen = Range("doel")
    ReDim buffer(bronnen.Count)
    
    If (bronnen.Count = doelen.Count) Then
        For Each c In bronnen
            i = i + 1
            buffer(i) = c.Value
        Next c
        i = 0
        For Each c In doelen
            i = i + 1
            c.Value = buffer(i)
        Next c
    Else
        MsgBox bronnen.Count & " is ongelijk aan " & doelen.Count
    End If
End Sub

[ Voor 9% gewijzigd door Lustucru op 07-01-2017 09:47 ]

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


  • Stitch!
  • Registratie: Juli 2011
  • Laatst online: 13-11 22:12
Ja, precies waar ik naar op zoek was! Enorm bedankt!