VBA-ban nevesített tartományra hivatkozás

VBA-ban nevesített tartományra hivatkozás
2020-07-29T18:55:43+02:00
2020-07-31T14:16:41+02:00
2022-10-15T21:25:53+02:00
csborsika
VBA kódban szeretnék hivatkozni egy másik munkalapon lévő nevesített tartományra. A tartomány nevét egy lenyíló listát tartalmazó cella érvényesítési szabályaiból szedem:

Dim hossz As Long Dim nev, adatok As String nev = ActiveCell.Validation.Formula1 hossz = Len(nev) - 1 adatok = Right(nev, hossz)
Viszont ha a kódban hivatkozni szeretnék rá, akkor nem elég a tartomány nevét megadni, kellene a munkalap is, amin található. Hogyan tudom kóddal megkeresni, hogy az adott tartomány melyik munkalapon található, vagy hogy lehet megkerülni, hogy ne kelljen megadni a munkalapot?

Köszönöm a segítséget előre is!
Mutasd a teljes hozzászólást!
Szia!
Ha az adott név munkafüzet érvényességű, akkor nem kell külön a munkalap neve. Ezt láthatod, ha a névkezelőben megnézed a Hatókör-t.
VBA-ban nem úgy lehet a névre hivatkozni, mint a munkalapon.
A tartományát a Names("név").RefersToRange tulajdonság adja vissza.
Üdv.
Mutasd a teljes hozzászólást!

  • Szia!

    Közben addig szenvedtem, hogy meglett
    VBA-ban akkor is kéri a munkalap nevét a tartományhoz, ha munkafüzet érvényességű.
    Megtaláltam közben a RefersTo tulajdonságot, és abból sikerült kivarázsolnom a munkalap nevét

    Dim lista, teljes, lap As String lista = Right(ActiveCell.Validation.Formula1, Len(ActiveCell.Validation.Formula1) - 1) teljes = ActiveWorkbook.Names(lista).RefersTo lap = Mid(teljes, 2, InStr(1, teljes, "!") - 2)
    Köszönöm szépen a gyors választ azért
    Mutasd a teljes hozzászólást!
  • Szia!

    Ha a név hatóköre munkafüzet szintű, akkor legegyszerűbb a range("Elnevezés") formát használni.
    Tehát lehet pl.
    range("adatok").clear

    Ha a hatókör munkalap,
    x=worksheets("Lapneve").range("Elnevezés").value
    Mutasd a teljes hozzászólást!
  • Sajnos nem, hiába munkafüzet szintű a név, nem fogadja el, ha simán a tartományra hivatkozok.
    Így kinyertem a lapnevet is, így már működik:

    Dim lista, teljes, lap As String lista = Right(ActiveCell.Validation.Formula1, Len(ActiveCell.Validation.Formula1) - 1) teljes = ActiveWorkbook.Names(lista).RefersTo lap = Mid(teljes, 2, InStr(1, teljes, "!") - 2)

    Azaz a
    Range(lista).Clear
    hibára fut, de a
    Sheets(lap).Range(lista).Clear
    már jó. Lövésem nincs, hogy miért, én is azt gondoltam, hogy elég a Range... Mindegy, a lényeg, hogy végül sikerült



    Köszönöm neked is a választ!
    Mutasd a teljes hozzászólást!
  • Szia!

    Ez ha megnézed a melléklet munkafüzetet, akkor nagyon meglepő.
    Munkafüzet hatókörű nevek esetén bárhonnan bárhova lehet hivatkozni.

    Mit ad vissza a "lista" változóba?


    ----

    lista = Right(ActiveCell.Validation.Formula1, Len(ActiveCell.Validation.Formula1) - 1) 'helyett lista = mid(ActiveCell.Validation.Formula1, 2)
    Nem egyszerűbb?
    Mutasd a teljes hozzászólást!
    Csatolt állomány
  • lista = Right(ActiveCell.Validation.Formula1, Len(ActiveCell.Validation.Formula1) - 1)<br> 'helyett<br> lista = mid(ActiveCell.Validation.Formula1, 2)
    <br>
    Nem egyszerűbb?

    Ó te jó ég, sírok... Dehogynem egyszerűbb, köszi, ez valószínűleg a korábbi próbálkozásokból maradt, akkor még hosszabb volt a képlet.

    A lista változóba a definiált nevet adja vissza. Ha elérakom a munkalap nevét is, hibátlanul lefut. Ha nem, a mellékelt hibaüzenetet kapom.
    Mutasd a teljes hozzászólást!
    Csatolt állomány
  • Még egy kapcsolódó kérdés: ha definiált névről van szó, annak a pontos helyét így megtalálom:

    teljes = ActiveWorkbook.Names(lista).RefersTo
    Ha viszont táblázatnév, akkor hibára fut. A táblázatnevek helyét hogyan lehet lekérdezni?
    Mutasd a teljes hozzászólást!
  • Amúgy megnéztem, amit küldtél, látom, hogy ott tényleg működik...
    Esetleg nem amiatt lehet, hogy az enyém munkalaphoz rendelt PrivatSub?
    Mutasd a teljes hozzászólást!
  • Ha egy munkalap (vagy a munkafüzet) eseménylapján csinálod, akkor tényleg nem megy (Az egy zárt környezet)

    De ha egy sima modul lapra teszel egy
    Function Terulet(Nev) As Range
    Set Terulet = Range(Nev)
    End Function

    függvényt, akkor szerintem már a
    MsgBox Terulet("munka1_a1") & vbCr & Terulet("munka2_a1") & vbCr & Terulet("munka3_a1")
    is működik


    És utána már ez is megy, ha a "Táblázat1" egy táblázat:

    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    MsgBox Terulet("Táblázat1").Address
    End Sub
    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