Miért nem működik egységesen a makró? (Run time error 424)

Miért nem működik egységesen a makró? (Run time error 424)
2019-05-14T14:37:22+02:00
2019-05-14T16:35:15+02:00
2022-10-15T21:41:40+02:00
rudolphe
Üdvözletem az Olvasóknak!

Ismét belefutottam egy számomra kellemetlen hibába, miközben egy Visual Basic makrót futtattam Excel alatt.

Készítettem néhány monitorképet - informáló célzattal:

Deklaráció
Működik
Nem működik

A tegnap délelőtt még rendeltetésszerűen működő makró tegnap egyszer csak leállt "Run time error 424 - Object required" hibaüzenettel.

Az alábbi dolgok előtt állok értetlenül:
Mitől "gondolta meg magát" az x ideig rendeltetésszerűen működő makró?
Mire vezethető vissza az, hogy a kritikus részt megelőző szakaszon működik egy 'vesszőre pontosan' ugyanolyan programrész?
Milyen objektumot hiányol a kód - annak tükrében, hogy egyetlen Excel fájl egyetlen munkalapján futtatásra készült?

Találtam a Prog.hu -n kettő megoldást, amelyből Micu alábbi megoldását véltem "emészhetőbbnek", de még sem tudok vele mit kezdeni, mert nem tudom, mit és hogyan kell megváltoztatnom a kódon a makró sikeres futtatásának érdekében.

Micu megoldása

És ennyi, - nem tudom kezelni a problémát!
Ehhez szeretnék segítséget kérni!

A hathatós segítséget előre is megköszönöm!
Mutasd a teljes hozzászólást!
Szia!

akkor érdemes minden egyes változó után külön-külön feltüntetni az "As Range" részt

Az a szabványos VBA deklaráció. Továbbá, ahogyan írtam, akkor "segít" az editor.

Láttam a képen egy olyan sort, hogy Range("DO1").Select - majd Selection.Delete Shift:=xlUp
Nos, mivel egy csomó változód a Range("DO1")-re mutat, ez a két sor szépen ki is nyírja ezeket a változókat.
Nézd meg légy szíves, hogyan kerül a vezérlés erre a sorra, nagy eséllyel ezért nem találja a későbbi változó ezt az objektumot.

Üdv.
Mutasd a teljes hozzászólást!

  • Szia!

    Sajnos az információkból nem derül ki, hogy melyik sornál áll meg a makró a hibaüzenettel.
    Másrészt, teljesen helytelen a deklarációd!!!
    Mivel csak a sor végére írtad be az As Range definiálást, csak az utolsó változód lett Range típusú, az összes többi Variant típusú maradt. Igen, mindkét sorban.
    Bár elvileg ez nem okozhat problémát, mivel hozzárendelés után a Variant típusú változó felveszi a hozzárendelt objektum tulajdonságait, mégis nehezíti a vele való munkát, mert a VBA szerkesztő nem tud neked segíteni a program írásakor. (Ha ugyanis explicite tudja a változó típusát, akkor feldobja neked a hozzá kapcsolódó tulajdonságokat.)
    Úgy látom, a DO oszlopban csinálsz törlést is. Ha ez érinti a DO1 cellát, akkor az ahhoz rendelt objektumok "elvesznek". Feltételezhetően ezért írja ki ezt a hibát.
    Kérdés még, milyen Excel verzióval dolgozol.

    Üdv.
    Mutasd a teljes hozzászólást!
  • Szervusz!

    Köszönöm szépen a választ!

    A harmadik képen a belső piros kerettel próbáltam szemléltetni az elakadás helyét.
    - Lényegében ez olyan, mint az első képen sárgával látható sor, - csak más területet érint.

    Válaszoddal összefüggésben merült fel bennem a kérdés, hogy akkor érdemes minden egyes változó után külön-külön feltüntetni az "As Range" részt?
    - Ez nem komoly fáradtság nekem, de szükségesnek véled?
    Mutasd a teljes hozzászólást!
  • Office 16 -ot látok, - úgy vélem, ez arra utal, hogy 2016 -os Excel a hátterem.
    Mutasd a teljes hozzászólást!
  • Menet közben kipróbáltam az egyesével deklarálást, ami NEM oldotta meg a problémát, - de legalább már tudjuk, (hogy nem ott van az eb elásva)!
    Mutasd a teljes hozzászólást!
  • Szia!

    akkor érdemes minden egyes változó után külön-külön feltüntetni az "As Range" részt

    Az a szabványos VBA deklaráció. Továbbá, ahogyan írtam, akkor "segít" az editor.

    Láttam a képen egy olyan sort, hogy Range("DO1").Select - majd Selection.Delete Shift:=xlUp
    Nos, mivel egy csomó változód a Range("DO1")-re mutat, ez a két sor szépen ki is nyírja ezeket a változókat.
    Nézd meg légy szíves, hogyan kerül a vezérlés erre a sorra, nagy eséllyel ezért nem találja a későbbi változó ezt az objektumot.

    Üdv.
    Mutasd a teljes hozzászólást!
  • Szia!

    Bár elvileg ez nem okozhat problémát

    Ezt írtam is a válaszban, hogy ez nem lehet a probléma oka.  :))

    Üdv.
    Mutasd a teljes hozzászólást!
  • Úgy értelmeztem írásodat, hogy ezzel "felszámolom" a DO1 cellát.

    Akkor vélhetően úgy tudom "megtartani" a cellát, hogy amennyiben van a DO1 cella alatt még nem nulla érték, akkor azt nemes egyszerűséggel rámásolva feljebb léptetem az egész oszlopot és legyalulom a legalsó értéket - és akkor megmarad a DO1, mint változó értéket tárolni képes cella.

    Erről van szó?
    Mutasd a teljes hozzászólást!
  • Szia!

    Akkor is "megmarad" a változó, ha a cellának csak az értékét, tartalmát törlöd a ClearContents tulajdonsággal. Nem Delete, hanem ClearContents.

    Üdv.
    Mutasd a teljes hozzászólást!
  • Itt vagyok!

    Nos!

    A "kinyírás" esete állt fent!
    Lecseréltem a felfelé léptetéses törlés kódját egy felülírásos módszerrel "törlő" kódrészletre - úgy, hogy irányított beillesztéssel az értékeket másoltam rá az előzőekre.
    Az általad javasolt részlet javítását követően a kód végrehajtási végeredménye - a programozáselméleti képzetlenségemből adódóan nem szép, de - MŰKÖDIK!

    A lényeg:
    ActiveSheet.Range("$DN$1:$DN$116").AutoFilter Field:=1, Criteria1:=">" & ThisWorkbook.Worksheets(1).Cells(2, 129).Value
        Columns("DN:DN").Select
        Selection.Copy
        Columns("DO:DO").Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False
        Application.CutCopyMode = False
        ActiveSheet.Range("$DN$1:$DN$116").AutoFilter Field:=1
        
        Range("DO2").Select
        Range(Selection, Selection.End(xlDown)).Select
        Selection.Copy
        Range("DO1").Select
        ActiveSheet.PasteSpecial Format:=3, Link:=1, DisplayAsIcon:=False, _
            IconFileName:=False
        Selection.End(xlDown).Select
        Selection.ClearContents
            
        'Range("DO1").Select <--- Már nem játszik
        'Selection.Delete Shift:=xlUp <--- Már nem játszik

    - Értelemszerűen honoráltam a helyi lehetőségekkel élve a szívességedet!

    Nagyon köszönöm a segítségedet!
    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