Excel VBA Do Loop

AMHeikki

Nyt kaivattaisiin apua loopin teossa.

Yritän rakentaa makroa, joka tekee samat muutokset excelissä eri välilehdille. Välilehtien määrä saattaa vaihdella.

Voiko Do Loopille jotenkin kertoa, että kun komento ActiveSheet.Next.Select ei enää löydä välilehteä se osaisi siirtyä eteenpäin?

Yritin tällästä, mutta ei toimi..

Do Until ActiveSheet.Value = ""

Toinen kyssäri olisi, että onko olemassa komentoa jolla pääsee siirtymään excelin ensimmäiseen taulukkoon niin ettei tarvitse tietää taulukon nimeä?

Etukäteen kiittäen =)

7

784

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • tätä

      Sub Macro1()
      Dim maara, i As Integer
      maara = Sheets.Count
      For i = 1 To maara

      Next
      End Sub

      • toi sheet.count, sillä se laskee mukaan myös kaaviosivut- parempi olisi käyttää WorkSheets.Count

        vaihtoehtoisesti

        Sub a()
        Dim ws As Worksheet
        For Each ws In ThisWorkbook.Worksheets
        ws.Range("A1") = 100
        Next
        End Sub

        looppi ongelma
        Sub b()
        On Error GoTo virhe
        Sheets(1).Select
        Do Until ActiveSheet.Name = ""
        ActiveSheet.Range("B1") = 100
        ActiveSheet.Next.Select
        Loop
        virhe:
        End Sub

        ja kakkoskyssäriin
        kuten edellä jo mainitsin kandee olla tarkkana Sheet/WorkSheet kanssa. Voit testata asian tekemällä kaavion ja siirtämällä sen ensimmäiseksi taulukonvalitsimessa ja sitten muutat kaavion vaikka viimeiseksi ja testaa uudelleen...

        Sub ValitseEkataulukkoTaiKaavio()
        ' valitsee kaavion tai taulukon eli aina ensimmäisen
        Sheets(1).Select
        'valitsee ekan taulukon voi olla toinen, kolmas jne
        Worksheets(1).Select
        'valitsee ekan kaavion voi olla toinen, kolmas jne
        Charts(1).Select
        End Sub


      • AMHeikki
        kunde kirjoitti:

        toi sheet.count, sillä se laskee mukaan myös kaaviosivut- parempi olisi käyttää WorkSheets.Count

        vaihtoehtoisesti

        Sub a()
        Dim ws As Worksheet
        For Each ws In ThisWorkbook.Worksheets
        ws.Range("A1") = 100
        Next
        End Sub

        looppi ongelma
        Sub b()
        On Error GoTo virhe
        Sheets(1).Select
        Do Until ActiveSheet.Name = ""
        ActiveSheet.Range("B1") = 100
        ActiveSheet.Next.Select
        Loop
        virhe:
        End Sub

        ja kakkoskyssäriin
        kuten edellä jo mainitsin kandee olla tarkkana Sheet/WorkSheet kanssa. Voit testata asian tekemällä kaavion ja siirtämällä sen ensimmäiseksi taulukonvalitsimessa ja sitten muutat kaavion vaikka viimeiseksi ja testaa uudelleen...

        Sub ValitseEkataulukkoTaiKaavio()
        ' valitsee kaavion tai taulukon eli aina ensimmäisen
        Sheets(1).Select
        'valitsee ekan taulukon voi olla toinen, kolmas jne
        Worksheets(1).Select
        'valitsee ekan kaavion voi olla toinen, kolmas jne
        Charts(1).Select
        End Sub

        Vastaan tuli ongelma, että toiminnot täytyykin tehdä yhden kerran vähemmän mitä välilehtiä on, koska viimeinen komento on ActiveSheet.Next.Select ja tämän voi toteuttaa viimeisen kerran toiseksi viimeisessä taulukossa.

        Sain kuitenkin teidän avustuksella näin toimimaan:

        Sub Muutokset2()
        Dim maara, i As Integer
        maara = Worksheets.Count - 1
        Worksheets(1).Select
        For i = 1 To maara
        ' Tässä komennot mitä välilehdillä tehdään
        ActiveSheet.Next.Select
        Next
        ' Tässä uudestaan komennot välilehdille, jotta makro tekee ne viimeisellekin välilehdelle
        Worksheets(1).Select
        End Sub

        En saanut Kunden versioon laitettua tuota -1:stä mitenkään, olisiko se ollut mahdollista?


      • AMHeikki kirjoitti:

        Vastaan tuli ongelma, että toiminnot täytyykin tehdä yhden kerran vähemmän mitä välilehtiä on, koska viimeinen komento on ActiveSheet.Next.Select ja tämän voi toteuttaa viimeisen kerran toiseksi viimeisessä taulukossa.

        Sain kuitenkin teidän avustuksella näin toimimaan:

        Sub Muutokset2()
        Dim maara, i As Integer
        maara = Worksheets.Count - 1
        Worksheets(1).Select
        For i = 1 To maara
        ' Tässä komennot mitä välilehdillä tehdään
        ActiveSheet.Next.Select
        Next
        ' Tässä uudestaan komennot välilehdille, jotta makro tekee ne viimeisellekin välilehdelle
        Worksheets(1).Select
        End Sub

        En saanut Kunden versioon laitettua tuota -1:stä mitenkään, olisiko se ollut mahdollista?

        en nyt ymmrärrä kysymystä. Jos haluat kaikkiin taulukoihin niin allaoleva tekee sen. Toi sun ActiveSheet.Next.Select jutska on ihan hanurista...


        Sub a()
        Dim ws As Worksheet
        For Each ws In ThisWorkbook.Worksheets
        ws.Range("A1") = 100
        Next
        End Sub

        jos taas haluata muutokset kaikkiin muihin kuin johonkin tiettyyn tauluun niin allaolevilla onnistuu
        ekassa nimellä muihin ja nimettyy taulukkoon ja jälkimmäisessä numeroinnillamuihin ja indeksin mukaan, jos ei tiedetä nimeä

        Sub b()
        Dim ws As Worksheet
        For Each ws In ThisWorkbook.Worksheets
        'kaikki muut paitsi yhteenveto taulukko
        If Not ws.Name = "yhteenveto" Then
        ws.Range("A1") = 100
        'yhteenveto taulukko
        Else
        ws.Range("B1") = 100
        End If
        Next
        End Sub

        Sub c()
        Dim ws As Worksheet
        For Each ws In ThisWorkbook.Worksheets
        'kaikki muut paitsi viimeinen taulukko- esim. kun ei tiedetä nimeä
        If Not ws.Name = Worksheets(Worksheets.Count).Name Then
        ws.Range("A1") = 100
        'viimeinen taulukko
        Else
        ws.Range("B1") = 100
        End If
        Next
        End Sub


      • AMHeikki
        kunde kirjoitti:

        en nyt ymmrärrä kysymystä. Jos haluat kaikkiin taulukoihin niin allaoleva tekee sen. Toi sun ActiveSheet.Next.Select jutska on ihan hanurista...


        Sub a()
        Dim ws As Worksheet
        For Each ws In ThisWorkbook.Worksheets
        ws.Range("A1") = 100
        Next
        End Sub

        jos taas haluata muutokset kaikkiin muihin kuin johonkin tiettyyn tauluun niin allaolevilla onnistuu
        ekassa nimellä muihin ja nimettyy taulukkoon ja jälkimmäisessä numeroinnillamuihin ja indeksin mukaan, jos ei tiedetä nimeä

        Sub b()
        Dim ws As Worksheet
        For Each ws In ThisWorkbook.Worksheets
        'kaikki muut paitsi yhteenveto taulukko
        If Not ws.Name = "yhteenveto" Then
        ws.Range("A1") = 100
        'yhteenveto taulukko
        Else
        ws.Range("B1") = 100
        End If
        Next
        End Sub

        Sub c()
        Dim ws As Worksheet
        For Each ws In ThisWorkbook.Worksheets
        'kaikki muut paitsi viimeinen taulukko- esim. kun ei tiedetä nimeä
        If Not ws.Name = Worksheets(Worksheets.Count).Name Then
        ws.Range("A1") = 100
        'viimeinen taulukko
        Else
        ws.Range("B1") = 100
        End If
        Next
        End Sub

        Heh... yritän päästä tuosta "hanurista" eroon. ;-)

        Mulla ei sitten oikein toimi (johtunee osaamisestani, aloittelija meinaan), mutta....

        Kun laitan:

        Sub Muutokset3()
        Dim ws As Worksheet
        For Each ws In ThisWorkbook.Worksheets
        ws.Range("A1") = 100
        ' tähän väliin muutokset, jotka haluan välilehdille tehdä
        Next
        End Sub

        Niin makro tekee ensimmäiselle välilehdelle muutokset niin monta kertaa kuin taulukossa on välilehtiä, eikä muutoksia jokaiselle välilehdelle. Siksi yritin tunkea sitä komentoa ActiveSheet.Next.Select väliin. Olisiko mitään vinkkiä mitä teen yhä väärin, kun en saa toimimaan tällä keinolla?


      • AMHeikki kirjoitti:

        Heh... yritän päästä tuosta "hanurista" eroon. ;-)

        Mulla ei sitten oikein toimi (johtunee osaamisestani, aloittelija meinaan), mutta....

        Kun laitan:

        Sub Muutokset3()
        Dim ws As Worksheet
        For Each ws In ThisWorkbook.Worksheets
        ws.Range("A1") = 100
        ' tähän väliin muutokset, jotka haluan välilehdille tehdä
        Next
        End Sub

        Niin makro tekee ensimmäiselle välilehdelle muutokset niin monta kertaa kuin taulukossa on välilehtiä, eikä muutoksia jokaiselle välilehdelle. Siksi yritin tunkea sitä komentoa ActiveSheet.Next.Select väliin. Olisiko mitään vinkkiä mitä teen yhä väärin, kun en saa toimimaan tällä keinolla?

        Sub Muutokset3()
        Dim ws As Worksheet
        For Each ws In ThisWorkbook.Worksheets
        ws.Range("A1") = 100
        ' tähän väliin muutokset, jotka haluan välilehdille tehdä
        Next
        End Sub

        koodissa olen viitannut aktiiviseen taulukkoon ws. yhtähyvin sen voi tehdä näin
        ws.activate
        Range("A1") = 100

        tosin aktivointi laukaisee muita tapahtumia ja laskentoja joten toi eka tapa on fiksumpi

        sulla on aktiivisena taulukko1 ja et ole koodissa siten mitenkään muuttanut eli loopissa muutokset kohdistuvat vain taulukko 1:seen
        laita range objektiin eteen viittaus aktiiviseen taulukkoon ws. tai käytä tota jälkimmäistä tapaa mikä lienee aloittelijalle helpompi ymmärtää...

        keep excelling
        @Kunde


      • AMHeikki
        kunde kirjoitti:

        Sub Muutokset3()
        Dim ws As Worksheet
        For Each ws In ThisWorkbook.Worksheets
        ws.Range("A1") = 100
        ' tähän väliin muutokset, jotka haluan välilehdille tehdä
        Next
        End Sub

        koodissa olen viitannut aktiiviseen taulukkoon ws. yhtähyvin sen voi tehdä näin
        ws.activate
        Range("A1") = 100

        tosin aktivointi laukaisee muita tapahtumia ja laskentoja joten toi eka tapa on fiksumpi

        sulla on aktiivisena taulukko1 ja et ole koodissa siten mitenkään muuttanut eli loopissa muutokset kohdistuvat vain taulukko 1:seen
        laita range objektiin eteen viittaus aktiiviseen taulukkoon ws. tai käytä tota jälkimmäistä tapaa mikä lienee aloittelijalle helpompi ymmärtää...

        keep excelling
        @Kunde

        Vau.... ja sehän toimii.

        Olit oikeassa toi jälkimmäinen versio oli helpompi keltanokalle. =)

        Onnistumisen ilo on mukavaa. Kiitos oikein paljon, että jaksoit minun kanssa vääntää tätä. =)


    Ketjusta on poistettu 0 sääntöjenvastaista viestiä.

    Luetuimmat keskustelut

    1. Laitetaas nyt kirjaimet tänne

      kuka kaipaa ja ketä ?
      Ikävä
      180
      11289
    2. Pieni häivähdys sinusta

      Olet niin totinen
      Ikävä
      56
      5371
    3. Taas ryssittiin oikein kunnolla

      r….ä hyökkäsi Viroon sikaili taas ajattelematta yhtään mitään https://www.is.fi/ulkomaat/art-2000011347289.html
      NATO
      45
      2620
    4. Missä olet ollut tänään kaivattuni?

      Ikävä sai yliotteen ❤️ En nähnyt sua tänään söpö mies
      Ikävä
      37
      2296
    5. Vanha Suola janottaa Iivarilla

      Vanha suola janottaa Siikalatvan kunnanjohtaja Pekka Iivaria. Mies kiertää Kemijärven kyläjuhlia ja kulttuuritapahtumia
      Kemijärvi
      13
      1811
    6. Valtimon Haapajärvellä paatti mäni nurin

      Ikävä onnettomuus Haapajärvellä. Vene hörpppi vettä matkalla saaren. Veneessä ol 5 henkilöä, kolme uiskenteli rantaan,
      Nurmes
      44
      1725
    7. Tiedän kuka sinä noista olet

      Lucky for you, olen rakastunut sinuun joten en reagoi negatiivisesti. Voit kertoa kavereillesi että kyl vaan, rakkautta
      Ikävä
      38
      1383
    8. Känniläiset veneessä?

      Siinä taas päästiin näyttämään miten tyhmiä känniläiset on. Heh heh "Kaikki osalliset ovat täysi-ikäisiä ja alkoholin v
      Nurmes
      37
      1309
    9. Tulemmeko hyvin

      Toimeen ja juttuun keskenämme? Luulen, että sopisit hyvin siihen ☀️ympäristöön, paljon kaikkea erilaista.♥️mietin tätä s
      Ikävä
      6
      1216
    10. Otavassa tapahtuu!

      Rakennuspalo, yläkerta tulessa. Henkirikosta epäillään. Tiettyä henkilöautoa etsitään, minkä mahdollinen epäilty ottanut
      Mikkeli
      26
      1129
    Aihe