Avatar billede Laugesen1 Mester
24. april 2014 - 01:57 Der er 4 kommentarer og
1 løsning

Definer range til array

Jeg skal lave 31 mindre tabeller fordelt på samme ark. Der skal kopieres data fra de enkelte tabeller til et andet ark, - ud fra enkelte kriterier. Jeg bruger en kode der sætter data ind i et array.
Det kan jeg godt få til at fungere, - når array har udgangspunkt i cellen A1.

Men tabellerne ligger spredt på arket og jeg vil gerne definere hvilket områder de ligger i.
På den måde skal jeg kun lave koden til ét array og kopiere den (30 gange). Og derefter skal jeg kun ændre range for de enkelte array.

Eksempel: Hvis range er defineret til fx P40:S101, så har det pågældende array cellen P40 som "udgangs-celle".

Jeg har prøvet at definere et range for hver af de enkelt arrays ved at bruge "Set Range". Der kommer ikke debug, når jeg sætter det ind i koden, men det har ikke nogen effekt på det array der ligger i området. Selvom jeg fx sætter range til P40:S101, fungerer array stadig ud fra cellen A1.

Koden:

Public Sub TestArrayRange()
Dim Tabel(1 To 61, 1 To 4) As Variant
Dim rRange As Range
Dim I As Integer, j As Integer, k As Integer
   
Set rRange = Sheets("Ark2").Range("P40:S101")

Application.ScreenUpdating = False

        k = 1
        For I = 8 To 61

    ThisWorkbook.Sheets("Ark2").Activate
    'Jeg har prøvet med nedenståen linje, men det fungerer ikke -
    'If rRange.Cells(I, 1).Value > 0 And Cells(I, 2).Value = "" Then
   
    'Med nedenstående linje fungerer det -
    If Sheets("Ark2").Cells(I, 1).Value > 0 And Cells(I, 2).Value = "" Then
            For j = 1 To 2
            Tabel(k, j) = Cells(I, j).Value
            Next j
            k = k + 1
            End If
           
            Next I
           
            Sheets("Ark3").Activate
            Range("M10").Select
           
            For k = 1 To 61
            For j = 1 To 2

  ActiveCell.Cells(k, j).Value = Tabel(k, j)
 
            Next j
            Next k
   
Application.ScreenUpdating = True

End Sub



Er der nogen der har et bud på hvordan man definerer et range til et array ?

Laugesen
Avatar billede Dan Elgaard Ekspert
24. april 2014 - 09:33 #1
Jeg bruger selv denne funktion:

http://www.EXCELGAARD.dk/Bib/Range2CSV/

...når jeg skal omdanne et celle område (range) til en array variabel.

Den virker ganske fortrineligt til formålet, selvom funktionen egentligt er beregnet til at omdanne et celle område til .CSV-data.
Men da data i .CSV-format i princippet blot er en lang streng af data, adskilt med et tegn (;), så kan man hurtigt lave sin array med funktionen Split(der er et eksempel på dette på linket også).

Give it a try :-)
Avatar billede Laugesen1 Mester
24. april 2014 - 17:34 #2
Tak for dit input.

Jeg har kikket på koden du har anbefalet, men kan ikke lige umiddelbart finde løsningen der.
Før jeg skrev mit spørgsmål, har jeg kikket på flere eksempler, for at finde fremgangsmåden til at definere range til et array. Men desværre uden held.

Jeg har nu prøvet at indsætte den fuld sti i "Set Range" i min kode, som ExcelGaard anbefaler i eksemplet. Men det har desværre ikke løst problemet.

Har du et bud på hvordan jeg skriver linjerne til at definere range i min kode,
og hvordan jeg så skriver det ind i følgende linje:

If (Reference til range).Cells(I, 1).Value > 0 And Cells(I, 2).Value = "" Then

Altså referencen til range i stedet for som i eksemplet, - Sheets("ark2")


Laugesen
Avatar billede Dan Elgaard Ekspert
28. april 2014 - 08:53 #3
Så er det fordi, jeg ikke forstår, hvad det er, du forsøger, at opnå???

For Range2CSV() laver uden problemer et område om til en Array variabel...

Er det fordi, du kun vil have nogle bestemte celler i området med?
Det ser ud som om, at du forsøger, at springe celler over, der ikke indeholder noget?

Hvis det er det, du forsøger, vil det så ikke blot være lettere, at indlæse samtlige celle i Array'en, og dernæst lade makro undlade de tomme input i array'en?

Eller, hvad er det præcst, du forsøger, at opnå???
Avatar billede Laugesen1 Mester
01. maj 2014 - 01:21 #4
Endnu engang tak for dit input og undskyld den lange svartid.

Jeg har ikke været i gang med vba så længe, og kan ikke komme videre med den kode jeg har lavet.

Det er helt fint, at du har sendt et eksempel på en kode, der udfører proceduren med en csv-fil.
Men jeg ved ikke hvilke del af koden fra eksemplet som jeg skal bruge i min kode.
Der behøver jeg lidt hjælp !

Det jeg gerne vil indlæse i array, er værdierne fra et bestemt defineret område i arket.
I mit eksempel, - værdierne fra cellerne i range P40:S101.

Derefter skal der så sorters i array som følger:
If ("Det valgte range").Cells(I, 1).Value > 0 And Cells(I, 2).Value = "" Then .....

Hvis kriterierne er opfyldt i kolonne 1 & 2 (i array), så skal "hele" rækken i array (i eksemplet 4 kolonner) kopieres, og sættes ind i den valgte destination.

Jeg har 31 "små" tabeller i arket, så min ide er, at jeg kan bruge samme kode til alle tabellerne, ved kun at skulle ændre range-referencen i hver af koderne.

1. Kan du hjælpe med at skrive linjerne, som sætter værdierne fra det valgte range ind i array.
2. Og linjen hvor der skal sortes efter kriterierne, - hvad skal jeg skrive mellem "If" og "Cells".
    - Altså der hvor der står Sheets("ark2") i eksempler i #1.

Laugesen
Avatar billede Laugesen1 Mester
13. juli 2014 - 00:13 #5
Lukker spørgsmålet.

Information om brugen af array og løsning på problemet med at kopiere et defineret range til et array, har jeg fundet på følgende sider:

http://www.sitestory.dk/excel_vba/arrays-og-rangeformler.htm

http://www.eksperten.dk/guide/522

Laugesen
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester