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
- This topic has 7 hozzászólás, 3 résztvevő, and was last updated 7 years telt el by delila.
-
SzerzőBejegyzés
-
2017-11-15-14:33 #3982
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éter2017-11-15-16:40 #3983Mí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: 7 years telt el-delila.
2017-11-16-08:57 #3985Sziasztok!
É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
2017-11-16-10:26 #3986Sziasztok!
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
2017-11-16-20:16 #3987Hali!
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
2017-11-17-07:56 #3988Szia 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
2017-11-17-12:25 #3989Sziasztok!
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éter2017-11-17-13:06 #3991Részemről szívesen. 🙂
-
SzerzőBejegyzés
- Be kell jelentkezni a hozzászóláshoz.