Excel VBA error Obejktum levált az ügyfélről. 4 for ciklus egymásban

Excel VBA error Obejktum levált az ügyfélről. 4 for ciklus egymásban
2021-01-15T11:42:35+01:00
2021-01-18T10:56:07+01:00
2022-10-15T21:26:18+02:00
LOKI'ds
Sziasztok!

Lenti 4 for ciklust futtatnám, de valamiért beáll tőle az excel.
Amit kellene csinálnia: 2 munkalap. Elsőből másolja az adatokat a másodikba, ahol a sorban van név és az oszlopban van azonosító egyezés. Szóval először megkerestetem vele a 2 sort a 2 névhez, majd = esetén megkerestetem vele a 2 oszlopot az azonosítóhoz.
Lépésenként haladva (F8) megcsinálja. (persze csak pá ciklust léptettem végig manuálisan, nem mind az x ezret)

For sor = 4 To s_MainLastRow s_MainName = Workbooks(MainWBName).Worksheets(s_wsName).Cells(sor, 2).Value For fteSor = 4 To s_PrevLastRow s_FteName = Workbooks(FteWBName).Worksheets(1).Cells(fteSor, 2).Value If s_MainName = s_FteName Then For oszlop = 6 To s_PrevLastCol s_mainFteNum = Workbooks(MainWBName).Worksheets(s_wsName).Cells(2, oszlop).Value For fteOszlop = 6 To s_wsnameLastCol s_FteNum = Workbooks(MainWBName).Worksheets(s_wsName).Cells(2, fteOszlop).Value If s_mainFteNum = s_FteNum Then Workbooks(MainWBName).Worksheets(s_wsName).Range(Col_Letter(oszlop) & sor).Value = Workbooks(FteWBName).Worksheets(1).Range(Col_Letter(fteOszlop) & fteSor).Value End If Next fteOszlop Next oszlop End If Next fteSor Next sor
Először így volt a másolás:

Workbooks(FteWBName).Worksheets(1).Range(Col_Letter(fteOszlop) & fteSor).Copy _ Destination:=Workbooks(MainWBName).Worksheets(s_wsName).Range(Col_Letter(oszlop) & sor)
De sajnos itt ugyanaz. Ha csak 2 for ciklus van, akkor nem problémázik.

Mi a fenét rontok el?

Vagy lehet ezt valahogy elegánsabban is megoldani?
Mutasd a teljes hozzászólást!
Sziasztok!

Tehát az eddigi üzenet váltásokból végre kiderült, hogy mindkét munkalap azonos logikai szerkezetű. A "B4:B1600" tartományban soronként nevek szerepelnek. A második sorban az "F2:DK2" tartományban pedig a nevekhez tartozó projektek azonosító kódjai olvashatók.
Sajnos a két munkalap adattartalma a nevek és a projekt azonosító kódok sorrendjét tekintve
eltérő.
A program a Második (Fte...) munkalap Cells(Nev.Sorszám, ProjektID.Oszlopszám).Value logikájú értékét adja át az Első (Main...)  munkalap hasonló logikájú cellája számára. A kód lépésenként végrehajtva működőképes, azonban futtatva "beáll".
A feladat tehát a kódoptimalizálása. Javasoltam a mellékelt kódrészlet 11. sorában lévő Col_Letter függvény mellőzését. Range(Col_Letter(oszlop) & sor) helyett Cells(sor, oszlop) használatával.

Várjuk a kérdező Loki'ds válaszát...
Mutasd a teljes hozzászólást!

  • Szia LOKI'ds

    Biztosan mindig az "F2", "G2", "H2", ...  cellák tartalmának egyezőségét kell vizsgálnod a harmadik és negyedik For ciklusban? Csak mert a Cells(2,  oszlop) ezt jelenti.
    Találat esetén szerintem inkább Cells(fteSor, oszlop) jobb lenne.
    Valamint ugyanitt a s_PrevLastCol és a s_wsnameLastCol biztos nem lépi túl a munkalapok oszlopainak felső határát?

    üdvözlettel
    verax
    Mutasd a teljes hozzászólást!
  • Szia!

    Igen, mert a fejléc azon sorába kerülnek bele az azonosító számok.

    Jelenleg mindkét Lastcol 115-t kap, mert egyforma még a fejléc.
    Mutasd a teljes hozzászólást!
  • Szia!

    Veraxnak már megint igaza lehet. Biztos, hogy a 4 ciklusból egyik sem fut túl a sorok számán?
    Javaslom, hogy mind a 4 For ciklusban használt változóra rakjál be ellenőrzést, hogy nem tudjon 1048576 fölé menni (ennyi sor egy munkalap, a régebbi Excel meg 65535 sor).
    Mutasd a teljes hozzászólást!
  • Oké, legyen igaz, de akkor hogy?
    Mindkét lastrow jelenleg 1600-as értéket kap.
    Mutasd a teljes hozzászólást!
  • Sziasztok!

    LOKI'ds!
    Áruld már el, légy szíves, hogy mi van az "F2"..."DK2"  cellákban!
    Szerintem =AB.MEZŐ(...)
    Mutasd a teljes hozzászólást!
  • Azokban a cellákban számok vannak.
    pls: F2: 323999; G2: 323887
    Mutasd a teljes hozzászólást!
  • ... és hogyan kerülnek bele?
    Mert az furcsa, hogy a Második For ciklusban elhelyezett elágazás akármelyik sorokban igazolja vissza a nevek egyezőségét, a harmadik és negyedik ciklus mindig az "F2:DK2" tartományt járja végig.
    Mindenkihez, minden névhez ugyanazok az azonosítók vannak hozzárendelve?
    Mutasd a teljes hozzászólást!
  • Ott kézzel be van írva.
    Ha felkerül valami új, ami kap azonosító számot, vagy törölni kell régit azt kézzel módosítom.
    Így idővel a két fejléc oszlopszáma és emiatt tartalma nem lesz ugyanaz. Viszont ahol van egyezés ott továbbra is szükséges átvinni az adatokat. Függetlenül attól, hogy a korábbi AA oszlop már a BB oszlopban van.
    Mutasd a teljes hozzászólást!
  • Sziasztok!

    Tehát az eddigi üzenet váltásokból végre kiderült, hogy mindkét munkalap azonos logikai szerkezetű. A "B4:B1600" tartományban soronként nevek szerepelnek. A második sorban az "F2:DK2" tartományban pedig a nevekhez tartozó projektek azonosító kódjai olvashatók.
    Sajnos a két munkalap adattartalma a nevek és a projekt azonosító kódok sorrendjét tekintve
    eltérő.
    A program a Második (Fte...) munkalap Cells(Nev.Sorszám, ProjektID.Oszlopszám).Value logikájú értékét adja át az Első (Main...)  munkalap hasonló logikájú cellája számára. A kód lépésenként végrehajtva működőképes, azonban futtatva "beáll".
    A feladat tehát a kódoptimalizálása. Javasoltam a mellékelt kódrészlet 11. sorában lévő Col_Letter függvény mellőzését. Range(Col_Letter(oszlop) & sor) helyett Cells(sor, oszlop) használatával.

    Várjuk a kérdező Loki'ds válaszát...
    Mutasd a teljes hozzászólást!
  • Majd csak vasárnap fogom tudni újra megnézni, vagy hétfőn. :P
    Mutasd a teljes hozzászólást!
  • Lefut.

    Bár nem értem miért lassítja ennyire a Col_Letter futás közben. Az csak ennyiből áll:

    Function Col_Letter(lngCol As Long) As String Dim vArr vArr = Split(Cells(1, lngCol).Address(True, False), "$") Col_Letter = vArr(0) End Function
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd