Telefonszámunk: 1-472-0679

[Resolved] VBA – másolás különböző mappában lévő fájlok között

Kezdőlap Fórumok Excel programozás [Resolved] VBA – másolás különböző mappában lévő fájlok között

Topic Resolution: Resolved
8 bejegyzés megtekintése - 1-8 / 8
  • Szerző
    Bejegyzés
  • #3982
    pexcel
    Felhasználó

      Szia Imre!
      Az alábbiakban szeretném kérni a segítséged.

      Van két mappa, mindegyik 15 Excel fájlt tartalmaz. Az első mappában lévő fájlok egyenként három sheet-et tartalmaznak, a sheet-ek elnevezése azonos. A második mappában lévő fájloknak egyenként négy önálló, szintén azonos elnevezésű sheet-je van. Ezen sheet-ek közül a negyedik – az első mappában szereplő fájlok által nem tartalmazott – sheet-et kellene egyenként belemásolni az első mappában szereplő fájlokba.
      Konkrétabban fogalmazva a makrónak az lenne a feledata, hogy nyissa meg az első mappában szereplő első fájlt, majd a második mappában szereplő első fájlt. Ezután a második mappa első fájljának utolsó (negyedik) sheet-ját másolja át az első mappa első fájlja sheet-jeinek a végére, mentse és zárja be a fájlokat, majd lépjen a mappákban szereplő második fájlokra és hajtsa végre a másolási műveletet. és így tovább egyenként egészen 15-ig.

      Egy mappában szereplő fájlokkal kapcsolatos műveletekre van egy makróm, ez működik. A logikám az lett volna, hogy ha ebbe a makróba meghívok egy másik, hasonló szerkezetű makrót (amely a másik mappában szereplő fájlokból kiválasztja és kijelöli a másolni szükséges sheet-et), akkor az kezelheti a problémát. Teszteltem többször, de sajnos nem a kívánt megoldást eredményezi.
      Csatoltam a rutinokat tartalmazó Excelt.

      Lehet, hogy teljesen rosszul közelítettem meg a problémát, ezért hálás lennék, ha tudnál segíteni.

      Előre is nagyon köszönöm,
      Péter

      #3983
      delila
      Felhasználó

        Míg Imre előkerül, és megmondja, miért nem jó ez:

        Sub Masolasok()
            Dim tomb(2, 15), utvonal As String, FN As String, sorszam As Integer
            Dim WB As Workbook
            
            'első mappa fájlnevek feltöltése a tomb() tömbbe
            utvonal = "F:\első mappa\"
            FN = Dir(utvonal & "*.xlsx", vbNormal)
            Do While FN <> ""
                sorszam = sorszam + 1
                tomb(1, sorszam) = FN
                FN = Dir()
            Loop
            
            'második mappa fájlnevek feltöltése a tomb() tömbbe
            utvonal = "F:\második mappa\": sorszam = 0
            FN = Dir(utvonal & "*.xlsx", vbNormal)
            Do While FN <> ""
                sorszam = sorszam + 1
                tomb(2, sorszam) = FN
                FN = Dir()
            Loop
            
            'másolások
            For sorszam = 1 To 15
                Workbooks.Open "F:\első mappa\" & tomb(1, sorszam)
                Set WB = ActiveWorkbook
                Workbooks.Open "F:\második mappa\" & tomb(2, sorszam)
                Sheets(4).Copy After:=WB.Sheets(3)
                ActiveWorkbook.Save
                ActiveWorkbook.Close
                ActiveWorkbook.Close
            Next
        End Sub

        Esetleg ott lehet majd gond, hogy nem biztos, hogy az 1. mappa 1. fájljához kell a 2. mappa 1. fájl utolsó lapja. Lehet, hogy valami szerint (név, mentési idő) párba kell rendezni a fájlokat a másolások elindítása előtt.
        Az utvonal változók értékét írd át a saját 2 útvonaladra, minden előfordulásukkor a makró futtatása előtt.

        • A hozzászólás módosításra került: 6 years, 5 months telt el-delila.
        #3985
        horvimi
        Adminisztrátor

          Sziasztok!

          Én nem látok csatolmányt. Az lehet?
          Delila bemásolta a kódot, azt látom.

          Elsőre nekem is olyasmi jutott eszembe, mint Delilának, hogy mi alapján történik az összerendelés?
          Az intézőben látott sorrend és a Dir által adott sorrend nem biztos, hogy ugyanaz.
          Másik, hogy egy kicsivel több információ kellene arról, hogy most mi történik?
          Mi az a „nem kívánt működés” ?

          Debug-oltad?

          A tömb két sorának feltöltése után a tartalma rendben van? Jól vannak párban?

          Imre

          #3986
          pexcel
          Felhasználó

            Sziasztok!

            Először is köszönöm szépen a gyors válaszokat.
            Elnézést, tényleg lemaradt a csatolmány, de látva Delila logikáját, úgy gondolom, hogy sokkal célszerűbb ezt a megközelítést követni, mint az enyémet.
            Imre kérdésére válaszolva az összerendelés a mappákban szereplő fájlok ABC sorrendje alapján történik. Megjegyzendő, hogy a két mappában az összerendelendő fájlok nevei kizárólag egy karakterben térnek el, tehát pl. ha az első mappában az első fájl neve ‘Alma’, akkor ennek a párja a második mappában ‘Alma2’.

            Időközben teszteltem Delila rutinját, természetesen a vonatkozó elérési útvonalakkal.
            A rutin a következő sornál fut hibára:
            Workbooks.Open „F:\első mappa\” & tomb(1, sorszam)
            A hibakód Run-time error ‘1004’, a hiba oka pedig, hogy nem találja a mappát, mert azt áthelyezték, átnevezték, vagy törölték.

            Péter

            #3987
            horvimi
            Adminisztrátor

              Hali!

              Tegyél töréspontot ehhez a sorhoz, és amikor megáll, akkor nézd meg, hogy mi van a tömb aktuáls elemében.
              Esetleg tedd előbb az egészet egy változóba, és annak a tartalmát nézd meg, mielőtt az Open lefut.

              Viszont én még továbbra is az összerendeléseken lovagolnék, ugyanis a Dir az oprendszer szerinti un. rendszer sorrendben olvassa a fájlokat. Neked meg szerintem minimum ABC sorrend kellene.

              Lehetséges megoldások:
              1. A két mappa fájljainak a nevét beolvasod két külön tömbbe, majd rendezed őket (A neten van sok Bubble sort vagy Quick sort minta.

              2. A két mappa fájlneveit beolvasod Dir-el két Excel tartományba, és külön-külön az Excellel rendezteted őket.
              Így egymás mellé kerülhetnek a párok.
              Ezután vagy a tömbön, vagy az Excel tartományon lehet ciklus futtatni, és megcsinálni a feldolgozást.

              Imre

              #3988
              delila
              Felhasználó

                Szia Péter!

                Átírtam a tegnapit. A fájlneveket nem tömbben, hanem az AA1:AA15, ill. az AC1:AC15 tartományba viszem be. A bevitel után rendezem a neveket ABC szerint. Ezt egy makrórögzítéssel létrehozott Rendezes makróval végeztetem, amit testre szabtam, és a Masolas makróból hívok meg, átadva a szükséges változók értékeit.
                Ezután a két tartományban lévő fájlokat nyitom meg páronként, és végzem el a lapok másolását.

                Sub Masolasok()
                    Dim utvonal As String, FN As String, sorszam As Integer
                    Dim WB As Workbook, lapnev As String, ter As Range, kulcs As String
                    Dim WBE As Workbook
                    
                    Application.ScreenUpdating = False
                    
                    Set WBE = ActiveWorkbook    'aktív, makrót tartalmazó füzet
                    lapnev = ActiveSheet.Name   'aktív lap
                    
                    'első mappa fájlnevei az AA1:AA15-be
                    utvonal = "F:\első mappa\"
                    FN = Dir(utvonal & "*.xlsx", vbNormal)
                    Do While FN <> ""
                        sorszam = sorszam + 1
                        Range("AA" & sorszam) = FN
                        FN = Dir()
                    Loop
                    
                    Set ter = Range("AA1:AA15")
                    kulcs = "AA1"
                    Rendezes lapnev, ter, kulcs
                    
                
                    'második mappa fájlnevei az AC1:AC15-be
                    utvonal = "F:\második mappa\": sorszam = 0
                    FN = Dir(utvonal & "*.xlsx", vbNormal)
                    Do While FN <> ""
                        sorszam = sorszam + 1
                        Range("AC" & sorszam) = FN
                        FN = Dir()
                    Loop
                    
                    Set ter = Range("AC1:AC15")
                    kulcs = "AC1"
                    Rendezes lapnev, ter, kulcs
                    
                    'másolások
                    For sorszam = 1 To 15
                        Workbooks.Open "F:\első mappa\" & Range("AA" & sorszam)
                        Set WB = ActiveWorkbook
                        Workbooks.Open "F:\második mappa\" & WBE.Sheets(lapnev).Range("AC" & sorszam)
                        Sheets(4).Copy After:=WB.Sheets(3)
                        ActiveWorkbook.Save
                        ActiveWorkbook.Close
                        ActiveWorkbook.Close
                    Next
                    
                    Application.ScreenUpdating = True
                    MsgBox "Kész a másolás", vbInformation
                End Sub
                Sub Rendezes(lapnev, ter, kulcs)
                    ActiveWorkbook.Worksheets(lapnev).Sort.SortFields.Clear
                    ActiveWorkbook.Worksheets(lapnev).Sort.SortFields.Add Key:=Range(kulcs), _
                        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
                        xlSortTextAsNumbers
                    With ActiveWorkbook.Worksheets(lapnev).Sort
                        .SetRange ter
                        .Header = xlNo
                        .MatchCase = False
                        .Orientation = xlTopToBottom
                        .SortMethod = xlPinYin
                        .Apply
                    End With
                End Sub
                
                #3989
                pexcel
                Felhasználó

                  Sziasztok!

                  A sorrendet illetően Imre tanácsát megfogadva én is célszerűbbnek láttam kitenni a fájlneveket Excelbe és ott rendezni.
                  Viszont most néztem csak Delila megoldását, amely tökéletesen működik.

                  Nagyon köszönöm nektek, hogy időt szántatok erre a kérdésre, nagyon sokat segítettetek.

                  Köszönettel,
                  Péter

                  #3991
                  delila
                  Felhasználó

                    Részemről szívesen. 🙂

                  8 bejegyzés megtekintése - 1-8 / 8
                  • Be kell jelentkezni a hozzászóláshoz.