Az alábbi problémával keresett meg Károly:
Adott két munkafüzet (hívjuk „A” és „B”-nek). Mindkettő nyitva van. „B” munkafüzetben szeretnénk tartományokat elnevezni, viszont fontos, hogy az „A” munkafüzetből indított makróval legyen megoldható.
Csapjunk is bele! Én az alábbi módon oldottam meg a feladatot: „A” munkafüzetben van a kezelőpanelünk, ahol a következő adatokra van szükségünk: „B” munkafüzet elérési útjára (és fájl nevére); a „B” munkafüzetben szereplő munkalap nevére, ahol a tartományt akarjuk elnevezni; a kívánt tartomány névre; a kívánt névtartomány meghatározására, azaz a kezdő és a záró cellákra.
Így néz ki az „A” Excel-emen a kezelő panel:
B6, B8, B10 és C11 cellákat nekünk kell előre kitölteni értelemszerűen.
Ha az „Elnevezés” gombra kattintunk, akkor ki tudjuk tallózni a kívánt munkafüzetet, jelen esetben a „B munkafuzet.xlsm”-et, ami ezáltal B4 cellába beleírja a „B” munkafüzet elérési útvonalát.
A makrónk lefutásával pedig a „B” munkafüzet Munka2 munkalapjának A1:B2 tartományának „teszt” lesz a neve.
Megjegyzem, hogy akár nyitva van a „B” munkafüzet, akár zárva van, sikeresen elnevezzük benne a kívánt tartományt.
És most lássuk a kódot, amit kommentekkel láttam el az érthetőség kedvéért:
'Ezzel a funkcióval ellennőrizzük, hogy meg van e nyitva már a "B" Excel fájl, vagy sem. 'Az egyszerűség kedvéért erre kerestem egy már kész funkciót. 'Forrás: https://www.mrexcel.com/board/threads/vba-code-to-open-an-excel-file-only-if-not-already-open.431458/ Function CheckFileIsOpen(chkSumfile As String) As Boolean On Error Resume Next CheckFileIsOpen = (Workbooks(chkSumfile).Name = chkSumfile) On Error GoTo 0 End Function Sub Elnevezes() '1. Meghatározzuk a változóinkat Dim wsA As Worksheet Dim wsB As Worksheet Dim wsBPath As Variant Dim fileName As String Dim munkalapneve As String Dim tartomanynev As String Dim tartomany1 As String Dim tartomany2 As String Dim i As String '2. Elmentjük egy változóba a "B" Excelünk elérési útját, amit aztán ki is íratunk a B4 cellába, hogy lássuk. wsBPath = Application.GetOpenFilename("Text Files (*.xlsm),*.xlsm", , "Please select text file...") fileName = Dir(wsBPath) 'MsgBox fileName 'Ha a megnyitásnál a mégsére kattint If wsBPath = False Then MsgBox "Nem nyitottál meg egy fájlt sem, így nem tudjuk folytatni" Exit Sub 'Ha megnyitja a fájlt Else Range("B4") = wsBPath End If '3. Ellenőrizzük, hogy a szükséges mezők ki vannak e töltve. 'A "B" Excel melyik munkalapján akarunk elnevezni egy tartományt? If Range("B6").Value = "" Then MsgBox "üres" Else munkalapneve = Range("B6") End If 'Mi legyen a tartomány neve? If Range("B8").Value = "" Then MsgBox "üres" Else tartomanynev = Range("B8") End If 'Az új tartomány területének nyitó cellája If Range("B10") = "" Then MsgBox "üres" Else tartomany1 = Range("B10").Value End If 'Az új tartomány területének záró cellája If Range("C10") = "" Then MsgBox "üres" Else tartomany2 = Range("C10").Value End If '4. "i" nevű változóba meghatározzuk a teljes tartományt, hogy egyszerűbben tudjuk majd hivatkozni rá i = "=" & munkalapneve & "!" & tartomany1 & ":" & tartomany2 'Azaz kvázi egy képletet ollóztunk össze: 'MsgBox tartomanynev & vbNewLine & tartomany1 & vbNewLine & tartomany2 & vbNewLine & i '5. Most kezdünk el dolgozni a "B" Excel munkafüzettel If CheckFileIsOpen(fileName) = False Then 'Ha a kívánt "B" Excel nincs megnyitva, akkor megnyitjuk Workbooks.Open (wsBPath) Else 'Ha nyitva van már, akkor azt tesszük aktívvá Workbooks(fileName).Activate End If 'A kívánt tartomány elnevezése a "B" Excelben, ez a lényeg, és itt használjuk fel az "i" változónkat. ActiveWorkbook.Names.Add Name:=tartomanynev, RefersTo:=i '"B" Excel mentése és bezárása. Itt szabadon játszhatsz vele, hogy be akarod e zárni,vagy maradjon nyitva a "B" munkafüzet. 'ActiveWorkbook.Close SaveChanges:=True End Sub
„A” Excel letöltése: ITT