VBA -apua: tiedon kopiointi ja toistaminen

Varmaan simppeli juttu, mutta pitäisi tehdä seuraavanlainen koodi:
Taulukon 1 A-sarakkeessa on tekstitietoa, B-sarakkeessa on kokonaislukuarvo.

Saman työkirjan tyhjään/uuteen taulukkoon 2 ja sen A-sarakkeeseen pitäisi generoida Taulukko 1:n A-sarakkeen tekstiä niin monta kertaa kuin Taul1:n B -sarakkeen arvo osoittaa.

Esim.
Taul 1:
Kissa 5
Marsu 1
Koira 3
jne.

Ja näistä tiedoista kakkostaulukkoon pitäisi syntyä (A-sarakkeeseen):
Kissa
Kissa
Kissa
Kissa
Kissa
Marsu
Koira
Koira
Koira
jne.
6517
Äänestä

Muut lukivat myös

Vastaukset 6

Vanhimmat

Tekisin while-silmukalla. Eli kun b-sarakkeessa on lukema, niin kopoidaan saman kohdan a-arvoa b-sarakkeen luvun verran uuteen tauluun, ja sen jälkeen siirryttäisiin seuraavalle riville, kunnes b:ssä ei ole enää mitään.

Äänestä
  • Sub Kopioi()
    Dim Vika As Long
    Dim Vika2 As Long
    Dim orig As Worksheet
    Dim kopio As Worksheet

    Set orig = Worksheets("Sheet1")
    Set kopio = Worksheets("Sheet2")
    Worksheets("Sheet2").Range("A:A") = ""

    Vika = orig.Range("A65536").End(xlUp).Row
    For i = 1 To Vika
    Vika2 = kopio.Range("A65536").End(xlUp).Row
    If Not Vika2 = 1 Then Vika2 = Vika2 1
    orig.Range("A" & i).Copy kopio.Range("A" & Vika2, kopio.Range("A" & Vika2 orig.Range("B" & i).Value - 1))
    Next
    End Sub

    Keep EXCELing
    @Kunde

    Äänestä

  • Kundepuu kirjoitti:

    Sub Kopioi()
    Dim Vika As Long
    Dim Vika2 As Long
    Dim orig As Worksheet
    Dim kopio As Worksheet

    Set orig = Worksheets("Sheet1")
    Set kopio = Worksheets("Sheet2")
    Worksheets("Sheet2").Range("A:A") = ""

    Vika = orig.Range("A65536").End(xlUp).Row
    For i = 1 To Vika
    Vika2 = kopio.Range("A65536").End(xlUp).Row
    If Not Vika2 = 1 Then Vika2 = Vika2 1
    orig.Range("A" & i).Copy kopio.Range("A" & Vika2, kopio.Range("A" & Vika2 orig.Range("B" & i).Value - 1))
    Next
    End Sub

    Keep EXCELing
    @Kunde

    "Vika = orig.Range("A65536").End(xlUp).Row"

    Mistä tuo A65536 tulee?

    Äänestä

  • 65536 on maksimi rivimäärä yksittäisessä taulukossa EXCEl versioissa 97-2003 ja 2007-2013 vastaavasti rivien maksimimäärä 1048576.

    eli suomennettuna
    "Vika = orig.Range("A65536").End(xlUp).Row"
    hae viimeinen ei tyhjä rivi sarakkeesta A alkaen riviltä 65536 ylöspäin ja aseta se muuttujan vika arvoksi.
    Vastaavasti voidaan hakea alaspäin, vasemmalle ja oikealle ...

    jos varma, että käytössä versio 2007 tai uudempi voi silloin käyttää
    "Vika = orig.Range("1048576").End(xlUp).Row"

    Keep EXCELing
    @Kunde

    Äänestä

  • Voisiko hyödyntää pelkkää saraketietoa, esim:

    LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row

    Äänestä

  • aivan toimiva toikin...

    Äänestä

Kommentoi aloitusta


Ingentingör kirjoitti:

Varmaan simppeli juttu, mutta pitäisi tehdä seuraavanlainen koodi:
Taulukon 1 A-sarakkeessa on tekstitietoa, B-sarakkeessa on kokonaislukuarvo.

Saman työkirjan tyhjään/uuteen taulukkoon 2 ja sen A-sarakkeeseen pitäisi generoida Taulukko 1:n A-sarakkeen tekstiä niin monta kertaa kuin Taul1:n B -sarakkeen arvo osoittaa.

Esim.
Taul 1:
Kissa 5
Marsu 1
Koira 3
jne.

Ja näistä tiedoista kakkostaulukkoon pitäisi syntyä (A-sarakkeeseen):
Kissa
Kissa
Kissa
Kissa
Kissa
Marsu
Koira
Koira
Koira
jne.

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu