"Windows.activate" nem működik, ha a formra kattintok

"Windows.activate" nem működik, ha a formra kattintok
2019-05-29T15:52:50+02:00
2019-05-30T11:48:08+02:00
2022-10-15T21:35:57+02:00
Bpetrus
Kedves Professzorok!

Előre bocsátom, hogy amolyan botcsinálta VBA alkalmazó vagyok.

Tehát: Készítettem egy formot Excel 2013 alatt, amely megnyit egy másik Excel táblázatot.
A formon egy rendezéshez lehet megnyitni a rendezendő fájlt, valamint beállítani kezdő és befejező dátumot.
Mármost, ha a másik tábla megnyitása után egyből a "Rendez"-re kattintok, akkor lefut minden hiba nélkül, ha azonban előtte beállítok bármilyen dátumot, akkor nem.

Annyit látok, hogy ha a formon rákattintok a textboxokra, akkor nem hajtódik végre a rendező eljárás elején található Windows(filenev).Activate.

A kérdéses rész így néz ki:

Private Sub Rendezes_Click()
filenev = Workbooks(ThisWorkbook.Name).Worksheets("Adatok").Cells(9, 1)
Windows(filenev).Activate
Worksheets("JAROK_hist").Select
usor = Range("A65536").End(xlUp).Row

Ha tehát csak szimplán a formon található "rendezés" gomba kattintok, akkor hiba nélkül fut le ez az eljárás, más esetben a "Windows(filenev).Activate" nem hajtódik végre, ezért a következő sornál (Worksheets("JAROK_hist").Select) Run-time error '9': Subscript out of range hibával megáll'

Ilyenkor aktív munkalapnak a formot tartalmazót írja.
Miért nem hajtja végre a Windows(filenev).Activate parancsot?

Előre is köszönöm az elnéző türelmeteket: Bpetrus
Mutasd a teljes hozzászólást!
Szia!

Akkor mégiscsak a dátumérvényesítés - dátummegadás körül van a hiba.
Hol található a datumvizsgalat függvényed?
Úgy tűnik, valahol máshol, mert "külső" hivatkozással használod a textbox nevét.
Tedd át a függvényt a Userform kódlapjára és próbáld meg úgy a dolgot.

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

  • Szia!



    Windows(filenev).Activate

    csak akkor működik, ha a munkafüzet nyitva van, ez a metódus a meg nem nyitott munkafüzetet nem nyitja meg. 
    A dátum beállító textboxokhoz rendeltél valamilyen eseményt?

    Üdv.
    Mutasd a teljes hozzászólást!
  • Tehát a folyamat a következő:

    1: elindítom az excel fájlt (xlsm).
    2: megjelenik a form, amellyel először megnyitom a rendezendő fájlt
    3: opcionálisan be lehet állítani a rendezés paramétereit a formon
    4: szintén a formon elindítom a rendezést. Minden rutin az első excel része.

    Ha az opcionális részhez nem nyúlok, akkor rendben lefut a rendező algoritmus, de ha beírok valamilyen dátumot (a focus visszakerül a formra(?)), akkor a fent jelzett hibára fut....
    Mutasd a teljes hozzászólást!
  • Szia!

    A filenev értéke mit tartalmaz: benne van az elérési út is? Mert ha igen, ez okozza a problémát. Mind a munkafüzet, mind az ablak neve a file elérési út nélküli neve amikor meg van nyitva a fájl.

    Esetleg próbáld meg a Workbooks(filenev).Activate formát.

    Amikor nem állítod be a dátum feltételt, akkor az éppen megnyitott munkafüzet az aktív. Amikor a formon dolgozol, akkor viszont már ismét az eredeti lesz. Viszont rossz név miatt nem tudja aktíválni.

    Szerintem ez lehet a probléma.
    Ha nem boldogulsz, tegyél fel egy mintát légy szíves.

    Üdv.
    Mutasd a teljes hozzászólást!
  • A Workbooks(filenev).Activate formát próbáltam, sajnos nem változik tőle a helyzet.
    A "filenev" egy szabványos név például "20190529_JAROK_szures.xls". Egyébként ugyanaz a pár sor fut le mindkét esetben:
    Windows(filenev).Activate
    Worksheets("JAROK_hist").Select

    Nyilván az történik, hogy mivel a módosított esetben nem hajtja végre a Windows(filenev).Activate sort, a következőben nem találja a "JAROK_hist" munkalapot, hisz az első munkafüzet aktív.

    No, de hogyan tudom aktívvá tenni a második lapot, ha valamiért nem műxik a Windows(filenev).Activate?
    Mutasd a teljes hozzászólást!
  • Szia!
    Sajnos innen így nem tudom megmondani. Tegyél fel egy kényes adatokat nem tartalmazó változatot, hogy megnézhessük.

    Üdv.
    Mutasd a teljes hozzászólást!
  • Azért nem akartam az egészet feltenni, mert igen hosszú.

    De feltöltöttem a formot.

    Ez a rutin nyitja meg a másik excelt:

    Private Sub megnyitas_gomb_Click()
    Application.Dialogs(xlDialogOpen).Show
    hely = Application.ActiveWorkbook.Path
    filenev = Application.ActiveWorkbook.Name
    Workbooks(ThisWorkbook.Name).Worksheets("Adatok").Cells(8, 1) = hely
    Workbooks(ThisWorkbook.Name).Worksheets("Adatok").Cells(9, 1) = filenev
    End Sub


    Ez pedig kezeli a textboxot:

    Private Sub datum_1_Change()
    hanyadiksor = 1
    Workbooks(ThisWorkbook.Name).Worksheets("Adatok").Cells(10, 1) = "datum_1"
    tartalom = Me.Controls("datum_1").Value
    Call datumvizsgalat(tartalom)
    End Sub

    A dátumvizsgálat rutin folyamatosan figyeli a leütött karaktereket, és ha hibás a formátum, azt nem jeleníti meg.
    Mutasd a teljes hozzászólást!
    Csatolt állomány
  • Szia!
    Megmutatnád a dátumvizsgáló rutint is?

    Üdv.
    Mutasd a teljes hozzászólást!
  • Szívesen, de "nem ér" azt mondani, hogy nem így kellett volna... 



    Sub datumvizsgalat(nyersdatum) 'a "nyersdatum" az aktuális beviteli mező tartalma
    datumhossz = Len(nyersdatum)
    szamsor = "0123456789."
    '------------------------csak akkor kell vizsgálni a dátumot, ha már be van írva valami----------------
    If datumhossz > 0 Then
        betu = Mid(nyersdatum, datumhossz, 1)
        ezszam = 0      'az "ezszam" változó akkor NEM 0, ha a nyersdatumban csak szám vagy pont van
        For n = 1 To 11
            If betu = Mid(szamsor, n, 1) Then ezszam = ezszam + 1
        Next n
        If ezszam = 0 Then      'ez azt jelenti, hogy az utolsó karakter nem szám, ezért....
            If datumhossz > 1 Then
                JOKER_rendezo.datum_1.Value = Mid(nyersdatum, 1, datumhossz - 1) '....egy betűt törlünk....
                datumhossz = datumhossz - 1
                nyersdatum = JOKER_rendezo.datum_1.Value
            Else
                JOKER_rendezo.datum_1.Value = ""  '... vagy ha csak egy betű van, akkor kiürítjük a sort
                datumhossz = 0
                nyersdatum = ""
            End If
        End If
    End If
    '------------ Ha legalább négy szám szerepel akkor érdemes megvizsgálni, hogy jó-e az év --------------
    If datumhossz > 3 Then
        ev = Val(Mid(nyersdatum, 1, 4))
        aktualisev = Val(Mid(Now, 1, 4))   'a "Now" függvény az adott pillanat dátumát és idejét adja vissza
        If ev < 1900 Or ev > aktualisev Then ' itt ellenőrizzük, hogy az év megfelelő-e?
        uzenet = "a dátum 1900 és " + Str(aktualisev) + " között kell legyen!"
            MsgBox (uzenet)
            JOKER_rendezo.datum_1.Value = "" 'mivel hibás, újra be kell írni, ezért töröljük a sort
            datumhossz = 0
        End If
    End If
    '------------ Ha beírtuk az évet akkor kitehetjük utána a pontot
    If datumhossz = 4 And pontjelzo = 0 Then
        JOKER_rendezo.datum_1.Value = nyersdatum & "."
        pontjelzo = 1 'a pontjelző akkor 1 ha már egyszer kikerült, ezért ismét nem kell kiírni
    End If
    '----------- a pontjelzo akkor lehet 0, ha korábban még nem volt pont
    If datumhossz < 4 Then pontjelzo = 0
    If datumhossz > 6 Then
    If Mid(nyersdatum, 7, 1) = "." Then
    nyersdatum = Mid(nyersdatum, 1, 5) + "0" + Mid(nyersdatum, 6, 1)
    JOKER_rendezo.datum_1.Value = nyersdatum
    End If
        ho = Val(Mid(nyersdatum, 6, 2))
        If ho < 1 Or ho > 12 Then
            MsgBox ("a hónap 1 és 12 közé esik!")
            'MsgBox (tbox(hanyadiksor))
            JOKER_rendezo.datum_1.Value = Mid(nyersdatum, 1, 5)
            datumhossz = 5
            'End
        End If
    End If
    If datumhossz = 7 And pontjelzo2 = 0 Then
        JOKER_rendezo.datum_1.Value = nyersdatum & "."
        pontjelzo2 = 1  'a pontjelző akkor 1 ha már egyszer kikerült, ezért ismét nem kell kiírni
    End If
    '----------- a pontjelzo akkor lehet 0, ha korábban még nem volt pont
    If datumhossz < 7 Then pontjelzo2 = 0
    If datumhossz > 9 Then
    If Mid(nyersdatum, 10, 1) = "." Then
    nyersdatum = Mid(nyersdatum, 1, 8) + "0" + Mid(nyersdatum, 9, 1)
    JOKER_rendezo.datum_1.Value = nyersdatum
    End If
        nap = Val(Mid(nyersdatum, 9, 2))
        If nap < 1 Or nap > 31 Then
            MsgBox ("a nap 1 és 31 közé esik!")
            'MsgBox (tbox(hanyadiksor))
            JOKER_rendezo.datum_1.Value = Mid(nyersdatum, 1, 8)
            datumhossz = 8
            'End

        End If

    End If

     

    If datumhossz = 10 And pontjelzo3 = 0 Then

        JOKER_rendezo.datum_1.Value = nyersdatum & "."

        pontjelzo3 = 1 'a pontjelző akkor 1 ha már egyszer kikerült, ezért ismét nem kell kiírni

    End If

    '----------- a pontjelzo akkor lehet 0, ha korábban még nem volt pont

    If datumhossz < 10 Then pontjelzo3 = 0

     

     

    End Sub
    Mutasd a teljes hozzászólást!
  • Szia!

    Erre azért volt szükségem, hogy megpróbáljam megnézni, nem ott kavarodik el valami.
    Sajnos úgy tűnik, még ez is kevés. Nálam nem tudom az eddig ismertek alapján rekonstruálni a hibát.
    Így arra kell kérjelek, mégiscsak tedd fel az egész munkafüzetet, a megnyitni szánt fájl természetesen nem szükséges.

    Üdv.
    Mutasd a teljes hozzászólást!
  • Sajnos igen körülményes belülről fájlt kinyerni.... (fő a biztonság!)

    Viszont azt tapasztaltam, hogy ha előbb állítom be dátumot és csak utána nyitom meg a rendezendő fájlt, akkor működik....
    Mutasd a teljes hozzászólást!
  • "Mármost, ha a másik tábla megnyitása után egyből a "Rendez"-re kattintok, akkor lefut minden hiba nélkül, ha azonban előtte beállítok bármilyen dátumot, akkor nem."

    Private Sub Rendezes_Click()

    'És ha ide beírsz egy Windows(xmls-es fájlnév).activate prancsot?

    filenev = Workbooks(ThisWorkbook.Name).Worksheets("Adatok").Cells(9, 1)
    Windows(filenev).Activate
    Worksheets("JAROK_hist").Select
    Mutasd a teljes hozzászólást!
  • Szia!

    Akkor mégiscsak a dátumérvényesítés - dátummegadás körül van a hiba.
    Hol található a datumvizsgalat függvényed?
    Úgy tűnik, valahol máshol, mert "külső" hivatkozással használod a textbox nevét.
    Tedd át a függvényt a Userform kódlapjára és próbáld meg úgy a dolgot.

    Üdv.
    Mutasd a teljes hozzászólást!
  • Tudtam én, hogy nálatok (Nálad) az igazság!
    A dátumvizsgálat rutinja a Modul1-ben volt.
    Most, hogy áttettem a form kódjai közé, már megy!!!  

    Had tanuljak! Miből látszik, hogy külső hivatkozásként használom a Textbox nevét?
    Mutasd a teljes hozzászólást!
  • Szia!

    Miből látszik, hogy külső hivatkozásként használom a Textbox nevét

    JOKER_rendezo.datum_1.Value= ....
    Ha a formon lenne a függvény, akkor elég lenne a Me.datum_1 név.
    (JOKER_rendezo a userform neve.)
    Üdv.
    Mutasd a teljes hozzászólást!
  • Köszönöm a türelmedet és a segítséget!

    Üdv: Péter
    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