Kopiointi muista työkirjoista

laakavaaka

Moi

Kansiossa on samanlaisella rakenteella useita kymmeniä työkirjoja, joista olisi tarkoitus päivittää uusi työkirja, eli vanha työkirja/uusi välilehti. Sitä varten pitäisi kopioida kustakin työkirjasta solualueita uuteen työkirjaan omille välilehdilleen.

Kopioitavat solualueet
C20
B23:I26
B29:I34
B37:I42
B45:I48
B51:I54
B57:I60
B63:I66
B69:I72
B75:I80
B83:I86
B89:I92
B95:I100

Kopioidaan uuteen työkirjaan
- välilehden nimi tulee solusta (C20)
- solualueet alekkain yhteenpötköön alkaen B5:I5 (B23:I26)

Kiitti

19

618

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • Tämmöinen

      Tämä moduliin siinä uudessa Excel-tiedostossa. Voi viedä aikaa, jos tiedostoja on kymmeniä.

      Sub Työkirjat_yhteen()

      Dim tämä, wb As Workbook
      Dim ws As Worksheet
      Dim Löytö, nn, e As String
      Dim kopioitava As Range
      Dim i, r, n As Integer
      Dim alue As Variant
      alue = Array("B23:I26", "B29:I34", "B37:I42", "B45:I48", "B51:I54", "B57:I60", _
                   "B63:I66", "B69:I72", "B75:I80", "B83:I86", "B89:I92", "B95:I100")

      Const polku = "C:/temp/temp/"       ' Tähän oikea hakemisto
      Const Haettavat = polku & "*.xlsx"  ' .. ja tiedostotunnus

          Application.ScreenUpdating = False
          Application.EnableEvents = False
          Application.Calculation = xlCalculationManual

          Set tämä = ActiveWorkbook
          Löytö = Dir(Haettavat) ' Ensimmäinen
          Do Until Löytö = ""
              
              Set wb = Workbooks.Open(polku & Löytö)
              Set ws = wb.Worksheets(1)
              DoEvents
              n = 0
              nn = ws.Range("C20")
              
      On Error GoTo err:
      Yritys:
              tämä.Sheets(1).Name = nn
          
              r = 5
              For i = 0 To UBound(alue)
                  ws.Activate
                  Range(alue(i)).Select
                  Selection.Copy
                  tämä.Activate
                  Cells(r, 2).Select
                  ActiveSheet.Paste
                  
                  r = Cells(Rows.Count, "B").End(xlUp).Row 1
              Next i
                  
              wb.Close
              Löytö = Dir ' Seuraava
              If Löytö <> "" Then tämä.Sheets.Add
          Loop
          
          Application.EnableEvents = True
          Application.Calculation = xlCalculationAutomatic
          Application.ScreenUpdating = True
      Exit Sub

      err:
          If err.Number = 1004 Then
              n = n 1
              nn = ws.Range("C20") & "(" & n & ")"
              MsgBox ("tuplanimi")
              Resume Yritys
          Else
              MsgBox (err.Number & " " & err.Description)
          End If
      End Sub

    • laakavaaka

      Moikka

      Fiksaisitko vielä muutaman kohan. Eka alue pitäs tulostuu riveille 5-8 ja toka jatketaan sen perään riviltä 9 lähtien. Nyt tulostaa tokan alueen riviltä 6 alkaen, eli uus alue aina yhden rivin alempaa kuin edellisen eka rivi.

      Entä saaks helposti niin, että kopioitavien alueiden muotoilu säilys kohteen mukaan. Toimiiko muuten fiksaamatta, jos noitten alueiden rivi- ja sarakemäärää tai ryhmien määrää tarttee muuttaa, eli onko muunneltavissa.

      No nii, eipä tässä ite voi muuta kuin toivoo ja kiitellä, joten kiitti taas.

    • laakavaaka

      Nyt tulostaa rivit oikein. Syy oli tos vikarivin määrittelyssä B-sarakkeesta. Se on pvm-sarake ja siin ei ole merkintää joka rivillä. Kun ottaa sen C-sarakkeesta niin johan pelittää. Nyt näyttää ainakin tällä hetkellä kaikin puolin hyvälle

    • laakavaaka

      Moikka taas

      Saisko tota muutettuu silleen, et se avais vaikka piiilotetun välilehen lomakkeeks ennen kopsauksii. Sit jos viilaisit tuota tuplanimi ilmoitusta siten, että mahollisen ilmotuksen jälkeen vaikka hyppäis yli. Nyt jää juntturaan pyörii.

      Kiitti

      • Tämmöinen

        Onko siellä kenties erikoismerkkejä? Ainakaan [ ] * / \ ? : Eivät kelpaa. Silloin versionumeron lisääminen ei ratkaise ongelmaa, ja tyhmä virherutiini jää luuppiin. Nuo merkit pitää poistaa tai korvata toisilla. Lisäsin funktion, jolla luetellut merkit voi muuttaa mieleisiksi.

        Toinen muutos on sen takia, että muun virheen kuin 1004 jälkeen Excel jäi avuttomaan tilaan, koska alussa blokatut toiminnot jäivät palauttamatta. Nyt ne palautetaan.


        Function Siivoa(Orig As String, pois As String, tilalle As String) As String
            Dim i As Integer
            For i = 1 To Len(pois)
                Orig = Replace(Orig, Mid(pois, i, 1), Mid(tilalle, i, 1))
            Next i
            Siivoa = Orig
        End Function

        Sub Työkirjat_yhteen()

            Dim tämä, wb As Workbook
            Dim ws As Worksheet
            Dim Löytö, Nimiehdotus, nn, e As String
            Dim kopioitava As Range
            Dim i, r, n As Integer
            Dim alue As Variant
            alue = Array("B23:I26", "B29:I34", "B37:I42", "B45:I48", "B51:I54", "B57:I60", _
                         "B63:I66", "B69:I72", "B75:I80", "B83:I86", "B89:I92", "B95:I100")
            Const polku = "C:/temp/temp/"
            Const Haettavat = polku & "*.xlsx"

            Application.ScreenUpdating = False
            Application.EnableEvents = False
            Application.Calculation = xlCalculationManual
          
            Set tämä = ActiveWorkbook
            Löytö = Dir(Haettavat) ' Ensimmäinen
            Do Until Löytö = ""
                
                Set wb = Workbooks.Open(polku & Löytö)
                Set ws = wb.Worksheets(1)
                DoEvents
                n = 0
                Nimiehdotus = Siivoa(ws.Range("C20"), "[]*/\?:", "()×....")
                nn = Nimiehdotus
                
        On Error GoTo err:
        Yritys:
                tämä.Sheets(1).Name = nn
              
                r = 5
                For i = 0 To UBound(alue)
                    ws.Activate
                    Range(alue(i)).Select
                    Selection.Copy
                    tämä.Activate
                    Cells(r, 2).Select
                    ActiveSheet.Paste
                      
                    r = Cells(Rows.Count, "B").End(xlUp).Row 1
                Next i
                    
                wb.Close
                Löytö = Dir ' Seuraava
                If Löytö <> "" Then tämä.Sheets.Add
            Loop
            
        Loppu:
            Application.EnableEvents = True
            Application.Calculation = xlCalculationAutomatic
            Application.ScreenUpdating = True
        Exit Sub

        err:
            If err.Number = 1004 Then
                n = n 1
                nn = Nimiehdotus & "(" & n & ")"
                MsgBox (ws.Name & ": C20 = " & Nimiehdotus)
                Resume Yritys
            Else
                MsgBox (err.Number & " " & err.Description)
                GoTo Loppu:
            End If
        End Sub


    • laakavaaka

      Moikka taasen

      Välilehdelle tehty taulukko haettavia tietoja varten ja laitettu nappi, joka hakee ne toisilta työkirjoilta, siis työkirja per välilehti. Kun haussa on yksi työkirja, niin kaikki pelaa hyvin. Sivun asetukset toimii, sarakeleveydet, fontit yms. pysyy.

      Mutta jos hakuun laittaa useamman työkirjan kerralla, niin alkaa tökkii. Välilehdelle tulee haetut tiedot oikeisiin soluihin, mutta taulukko puuttuu, joten sarakeleveydet eivät ole enää haluttuja.

      Mul olis Malli -välilehdellä ko. sivuille tehty taulukko. Oisko tos ajatusta, että uusi välilehti luotas, tosta Malli -välilehdestä ja hakis tiedot sille. Näin pysys sivun asetukset kohillaan. Laittsitko vielä ton kondikseen. Kiitti

      • Tämmöinen

        Sarakeleveydet kopioituvat vain kopioitaessa kokonaisia sarakkeita.
        Seuraava makro kopioi aktiivisen sivun muotoilun saman tiedoston kaikille sivuille.

        Sub KopioiMuotoilut()
            Dim sivu As Worksheet
            Cells.Copy
            For Each sivu In Worksheets
                 sivu.Cells.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone
            Next sivu
            Application.CutCopyMode = False
        End Sub


    • Kundepuu

      Referenssit
      Microsoft Ado ja VBscripting pitää lisätä
      Kokeilin 50 tiedostolla ja solussa C20 osassa samoja nimiä ja muutaman sekunnin kesti ajaa läpi.
      Malli taukossa pitää olla muotoilut


      Option Explicit
      Function OnkoTaulukkoOlemassa(TaulukonNimi As String) As Boolean
      Dim sht As Worksheet
      On Error Resume Next
      Set sht = Worksheets(TaulukonNimi)
      On Error GoTo 0
      OnkoTaulukkoOlemassa = Not sht Is Nothing
      End Function
      Function Putsaa(Nimi As String) As String
      Dim objRegExp
      Dim Siivottu
      Set objRegExp = New Regexp

      objRegExp.IgnoreCase = True
      objRegExp.Global = True
      objRegExp.Pattern = "[(?*"",\\<>&#~%{} _.@:\/!;] "
      Siivottu = objRegExp.Replace(Nimi, "_")
      Putsaa = Siivottu
      End Function
      Sub PoistaVanhat()
      Dim Ws As Worksheet
      On Error Resume Next
      Application.DisplayAlerts = False
      For Each Ws In Worksheets
      If Not Ws.Name = "Malli" Then Ws.Delete
      Next
      Application.DisplayAlerts = False
      End Sub

      Sub HaeSuljetuista()
      Dim Polku As String
      Dim Tiedostot As String
      Dim sh As Worksheet
      Dim Löydetyt() As String
      Dim Fnum As Long
      Dim rsCon As Object
      Dim rsData As Object
      Dim KundeConnect As String
      Dim KundeSQL As String
      Dim Lähdetiedosto As Variant
      Dim Lähdealue As String
      Dim Kohdealue As Range
      Dim Alue As Variant
      Dim i As Long
      Dim Solu As Range
      Dim Siirtymä As Long
      Dim TaulukonNimi As String
      Dim Ws As Worksheet
      Dim PutsattuNimi As String

      ' Muuta sopivaksi
      Alue = Array("C20:I126", "B23:I26", "B29:I34", "B37:I42", "B45:I48", "B51:I54", "B57:I60", "B63:I66", "B69:I72", "B75:I80", "B83:I86", "B89:I92", "B95:I100")
      ' Muuta sopivaksi
      Polku = "C:/testi/"
      ' Muuta sopivaksi
      Tiedostot = Dir(Polku & "*.xl*")
      If Tiedostot = "" Then
      MsgBox "Ei löytynyt tiedostoja"
      Exit Sub
      End If

      On Error GoTo Loppu
      Application.ScreenUpdating = False


      'Lisätään löydetyt tiedostot arrayhin
      Fnum = 0
      Do While Tiedostot <> ""
      Fnum = Fnum 1
      ReDim Preserve Löydetyt(1 To Fnum)
      Löydetyt(Fnum) = Tiedostot
      Tiedostot = Dir()
      Loop

      'Loopataan tiedostot läpi ja tallennetaan tiedot
      If Fnum > 0 Then

      Set rsCon = CreateObject("ADODB.Connection")
      Set rsData = CreateObject("ADODB.Recordset")

      For Fnum = LBound(Löydetyt) To UBound(Löydetyt)
      Siirtymä = 0
      KundeConnect = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & Polku & Löydetyt(Fnum) & ";" & "Extended Properties=""Excel 8.0;HDR=No"";"
      rsCon.Open KundeConnect
      For i = 0 To UBound(Alue)
      KundeSQL = "SELECT * FROM " & Alue(i) & ";"
      rsData.Open KundeSQL, rsCon, 0, 1, 1
      If Not rsData.EOF Then
      If i = 0 Then
      Worksheets("Malli").Range("A66536").CopyFromRecordset rsData
      PutsattuNimi = Putsaa(Worksheets(1).Range("A66536"))
      If Not OnkoTaulukkoOlemassa(Worksheets(1).Range("A66536")) Then
      Worksheets("Malli").Copy After:=Worksheets("Malli")
      Worksheets(Worksheets("Malli").Index 1).Name = Worksheets("Malli").Range("A66536")
      DoEvents
      Else
      Worksheets("Malli").Copy After:=Worksheets("Malli")

      Worksheets(Worksheets("Malli").Index 1).Name = Worksheets("Malli").Range("A66536") & Worksheets.Count

      End If
      Else
      If i = 1 Then
      Worksheets(Worksheets("Malli").Index 1).Range("B5").CopyFromRecordset rsData
      Else
      Worksheets(Worksheets("Malli").Index 1).Range("B5").Offset(Siirtymä, 0).CopyFromRecordset rsData
      End If
      Siirtymä = Siirtymä Range(Alue(i)).Rows.Count

      End If
      End If
      rsData.Close

      Next
      rsCon.Close

      Next
      End If
      Set rsData = Nothing
      Set rsCon = Nothing
      Loppu:
      On Error GoTo 0
      Application.ScreenUpdating = True
      End Sub

      Keep EXCELIng
      @Kunde

    • Kundepuu

      jos tiedostot on .xlsx päätteisiä, niin vaiha koodiin. Tää toimii myös vanhemmilla .xls päätteillä...
      KundeConnect = "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=" & Polku & Löydetyt(Fnum) & ";" & "Extended Properties=""Excel 12.0;HDR=NO"";"

    • laakavaaka

      Moikka

      No niin yritetääs saaha muutama rivi asiasta, josta ei oikein kässää mitään.

      Työkirja, siinä oli ne kaks välilehtee, joissa molemmissa samanlaiset taulukot.
      Taul1, sisältää sen painonapin ja Malli sitä kopsausta varten.
      Käyttääkö Kunden versio vain Malli -välilehtee. Se on ainut nimi joka siellä vilahtaa.

      Onkohan nää oikeet referenssit
      Microsoft ADO Ext. 2.8 for DDL and Security
      Microsoft VBScript Regular Expressions 5.5
      Microsoft Scripting Runtime

      Kaikki tiedostot se löys, mutta sit se jymähtää riville (menee tausta keltaseks)
      Worksheets("Malli").Range("A66536").CopyFromRecordset rsData

      ja antaa ilmotuksen
      Run-time error '-2147467259 (80004005)':
      Method 'CopyFromRecordset' of object 'Range' failed

      No miltäs toi vaikuttaa. Loksahtaako sormia napauttamalla kohalleen

    • Kundepuu

      Microsoft ADO Ext. 2.8 for DDL and Security vaikuttaa aika vanhalta...
      Mulla EXCEL 2013 ja Microsoft ADO Ext. 6.0 for DDL and Security

      tuolta voit kopioida ton mun käytössä olevan
      https://www.dropbox.com/s/70bdqgb4t5ffzhb/msadox.rar?dl=0

      olikos sulla tää käytössä?
      Tää toimii uusilla ja vanhoilla tiedostopäätteillä.
      KundeConnect = "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=" & Polku & Löydetyt(Fnum) & ";" & "Extended Properties=""Excel 12.0;HDR=NO"";"

      Luultavasti toi sun vanha ADO ei toimi tolla vaan vaatii tämän
      KundeConnect = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & Polku & Löydetyt(Fnum) & ";" & "Extended Properties=""Excel 8.0;HDR=No"";"

      vai toimisiko tällä?
      KundeConnect = "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=" & Polku & Löydetyt(Fnum) & ";" & "Extended Properties=""Excel 8.0;HDR=NO"";"

      ja tiedostopäätteet pitää olla sitten .xls...
      Jos sulla on päätteenä .xlsx, nii kokeile tallentaa se vanhempaa muotoon ja aja makro sitten, mutta helpointa lisätä toi linkin ADO ;-)

      Keep EXCELing
      @Kunde

    • laakavaaka

      Tsekkasin noi maholliset erilaisuudet ja toi ADOkin oli siellä pitkässä listassa. Tullu valittuu nähtävästi väärä versio siitä. Samoin noi koodirivit, niistäkin oli toi uudempi käytössä ja kotimaisella Office 365:llä mennään ja päätteenä on .xlsx, mutta kokeilin kyllä .xls päätteelläkin.

      Mut tosta koodista. Siihen samaan riviin se tööttää, eikä mulla oo hajuukaan mitä pitäs tehä tai koittaa. Uuttahan tää mulle on ja tällästä koodii tainnu ennen nähäkkää, on ollu vaan niitä perinteisempii.

      Mietiskelin kun tässä toi tiedoston luku tökkii, niin onkohan mulla niis aiemmin tallennetuissa tiedostoissa jotain sellasta, mistä toi koodi ei tykkää. Tulee ajatus kun aiemmin laitoit viestiin, et testasit 50:llä tiedostolla ja hyvin meni. Et laittasitko dropboxiin sen testipaketin kopsattavaks. No jospa se olis vaan tosta rivistä kiinni, toivotaan niin.

    • Kundepuu
    • Kundepuu
    • Kundepuu

      Hieman tsekkasin , eroaako 365 versio jotenkin v2010 ja silmääni pistikin heti bugi...
      excel 365 database only returns 65K rows... ;-)
      eli tossapa se syy sitten taitaakin olla, vaikka pitäisi palauttaa sen rapiat miljoona riviä.
      eli koodissa pitää fiksata juurikin stoppirivin solun arvoa. Muuttaa se joksikin sopivaksi vaikka A1 ( koodi käyttää sitä väliaikaisesti ja se arvo poistetaan)
      eli muuta Worksheets("Malli").Range("A66536").CopyFromRecordset rsData ja muutamat alemmalla rivillä olevat soluarvot sopivaksi esim.
      Worksheets("Malli").Range("A1).CopyFromRecordset rsData ...

      Keep EXCELing
      @Kunde

    • laakavaaka

      No nii, näin siin kävi. Lähettämäs ohjelma ja data toimii ilman muutoksia Ok.

      Vaihdoin mun datan sun datan tilalle.
      - Tökkäs samalle riville kuin ennenkin (.xlsx)
      - Vaihdoin tiedostomuotoa ja .xls toimi
      - Muita muutoksia en tehnyt

      Sit seuraavaks vein sun datan (mun) ohjelmaan ja aina tökkäs sille samalle riville, teki mitä teki.
      En löytäny koodista mitään eroavaisuutta, mutta siitä en päätä pantiks laita. No nyt mulla on kuitenkin toimiva juttu, ja jatkan sen virittämistä. Saanen varmaan palata asiaan, jos tulevat yöt koneella tuo mutkia matkaan.

      Kiitti

    • laakavaaka

      Toi prosessi kääntää noi välilehet laskevaan järjestykseen. Jotenkin silmä tottunu hahmottaa nousevan listauksen helpommin. Saisko sellasen nousevan järjestyksen tekevän koodinpätkän. Jälleen kiittelen

    • laakavaaka

      Se problem ratkes. Kääntelin ekaks väärän for..nextin parametrei ennenkuin hönäsin

    • Kundepuu

      Lähetä mulle .bugi xlsx ja toimiva .xls tiedostot, niin tsekkaan
      hmetso(at) hotmail.com

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

    Luetuimmat keskustelut

    1. Nurmossa kuoli 2 Lasta..

      Autokolarissa. Näin kertovat iltapäivälehdet juuri nyt. 22.11. Ja aina ennen Joulua näitä tulee. . .
      Seinäjoki
      144
      8339
    2. Joel Harkimo seuraa Martina Aitolehden jalanjälkiä!

      Oho, aikamoinen yllätys, että Joel Jolle Harkimo on lähtenyt Iholla-ohjelmaan. Tässähän hän seuraa mm. Martina Aitolehde
      Suomalaiset julkkikset
      46
      2288
    3. Kaksi lasta kuoli kolarissa Seinäjoella. Tutkitaan rikoksena

      Henkilöautossa matkustaneet kaksi lasta ovat kuolleet kolarissa Seinäjoella. Kolmas lapsi on vakasti loukkaantunut ja
      Maailman menoa
      26
      2142
    4. Miten meinasit

      Suhtautua minuun kun taas kohdataan?
      Ikävä
      95
      1738
    5. Miksi pankkitunnuksilla kaikkialle

      Miksi rahaliikenteen palveluiden tunnukset vaaditaan miltei kaikkeen yleiseen asiointiin Suomessa? Kenen etu on se, että
      Maailman menoa
      181
      1677
    6. Et olisi piilossa enää

      Vaan tulisit esiin.
      Ikävä
      32
      1497
    7. Tunnekylmä olet

      En ole tyytyväinen käytökseesi et osannut kommunikoida. Se on huono piirre ihmisessä että ei osaa katua aiheuttamaansa p
      Ikävä
      108
      1103
    8. Taisit sä sit kuiteski

      Vihjata hieman ettei se kaikki ollutkaan totta ❤️ mutta silti sanoit kyllä vielä uudelleen sen myöhemmin 😔 ei tässä oik
      Ikävä
      5
      1019
    9. Oletko miten

      Valmis läheisyyteen?
      Ikävä
      53
      1005
    10. Odotathan nainen jälleenkohtaamistamme

      Tiedät tunteeni, ne eivät sammu johtuen ihanuudestasi. Haluan tuntea ihanan kehosi kosketuksen ja sen aikaansaamaan väri
      Ikävä
      28
      870
    Aihe