Az „Excel” fórum célja, hogy keretet adjon az Excel felhasználók széles táborának tapasztalataik megosztására, és lehetőséget a segítséget kérőknek. Az alábbi összefoglaló azért készült, hogy segítse a helyes kérdésfeltevést.
– Írd le szabatosan a problémát. Úgy fogalmazz, hogy ne csak te magad, de a szakértő is megértse, mire szeretnél választ kapni.
– Írd le, hogy milyen verziójú Excellel dolgozol. (Vagy ha nem – ill. nem csak – Excel, akkor micsoda?)
– Írd le, hogy milyen úton indultál el, és hol akadtál el rajta.
– A kérdés megértése szempontjából sokat segíthet, ha feltölteszt egy képet, amin látszik, hogy mit szeretnél, vagy illusztrálja azt.
– Még jobb, ha feltöltesz egy minta munkafüzetet valahová (pl. data.hu). Feltöltés előtt távolítsd el belőle a nem publikus adatokat.
– Ha a feladat jellege olyan, célszerű az "előtte" és "utána" állapotokat bemutatni. (Miből kellene csinálni mit?)
– Ha VBA kódon kell javítani, másold be a releváns kódrészt. Rövid kód mehet hozzászólásba, hosszú kód inkább ide: http://pastebin.com/
– Ha valami nem úgy működik, ahogy kellene, add meg a rendellenes viselkedés jellemzőit, a hibaüzenetet, és a hibát okozó programsort.
A Sheet2 az adott munkalap kódneve, ami nem változik bárhanyadik lesz is a munkalap a workbookon belül illetve bármire is változtatják a nevét.
Szerintem hasznos dolog ezt használni, egyetlen általam ismert korlátozása van: csak a makrót tartalmazó workbookon belül működik. Szóval másik workbook munkalapjára így már nem tudsz hivatkozni.
Utánakerestem én is, és egybehangzóan állítják mindenütt, hogy a VBA project védelme kódból nem érhető el, nem módosítható. Amit belinkeltél, az a SendKeys művelettel operál, ami tulajdonképpen, szimulálni próbálja a billentyűleütéseket, mintha manuálisan csinálnád a védelem beállítását. A SendKeys nagyon megbízhatatlan dolog, aki szakértőket én ismerek, mindenki fújol rá. Bármi történhet a billentyűkódok elküldése közben, ami megváltoztatja az aktív ablakot, vagy ilyesmi, és máris hibás eredményt kapsz. Vagy pl. ha az első x darab billentyűkód feldolgozásához kell egy kis idő, mielőtt következőt is fogadni tudja az alkalmazás, a SendKeys meg nyomatja a kódokat rendületlenül...
Szóval a SendKeys semmiképpen nem ajánlott olyan kényes műveletek elvégzésére, mint pl. egy jelszó beállítása. Ha valami hiba csúszik a műveletbe, megeshet, hogy ott állsz egy levédett projekttel, és nem tudod a jelszót.
A másik dolog, hogy úgy hírlik, egyes makrók nem is futnak le, ha a VBA projekt le van védve.
Sub teszt() Dim FPath As String, FName As String Dim wb As Workbook, LineCount As Long Dim WBModule As VBIDE.CodeModule
FPath = "D:\" FName = Dir(FPath & "\*.xls", vbNormal) While Not FName = "" Set wb = Workbooks.Open(FPath & "" & FName) Set WBModule = wb.VBProject.VBComponents("ThisWorkbook").CodeModule With WBModule LineCount = .CountOfLines + 1 .InsertLines LineCount, "Private Sub Workbook_BeforePrint(Cancel As Boolean)" LineCount = LineCount + 1 .InsertLines LineCount, " Cancel = True" LineCount = LineCount + 1 .InsertLines LineCount, " MsgBox (""Nem nyomtatható dokumentum!"")" LineCount = LineCount + 1 .InsertLines LineCount, "End Sub" End With wb.Close savechanges:=True FName = Dir() Wend End Sub
Pár dolog kiegészítésképpen:
1. A "kezelendő" fájlokat gyűjtsd egy mappába, és azt a mappát add meg FPath változó értékeként.
2. A Tools->References menüben kapcsold be a hivatkozást a Microsoft Visual Basic for Applications Extensibility komponensre.
3. Az Excel Eszközök->Beállítások->Biztonság->Makróvédelem->Megbízható közzétevők lapon tedd be a pipát a "Visual Basic Projekthez való hozzáférés megbízható" beállítás elé.
Van nagyon sok excel file-om (kb. 500 db), ezeket kell megnyitnom, és minden egyes file VBA-ja belemásolni a következő kódot:
Private Sub Workbook_BeforePrint(Cancel As Boolean) Cancel = True MsgBox ("Nem nyomtatható dokumentum!") End Sub
Az a kérdés, hogy hogyan lehet ezt egyszerűen megcsinálni, hogy ne kelljen manuálisan egyesével megnyitni a file-t, aztán VBA felület, This workbook, ctrl+v, ... stb.
A munkafüzetben definiált namerange-et szeretnék használni VBA-ban.
Pl. B2 = "year" name range
Aztán a VBA-ban erre a name rangere szeretnék hivatkozni.
Így próbálkoztam vele. Van ennek így értelme?
Köszi a segítséget :-)!!!
-------
Dim Year As Variant Dim BusinessType As Variant Dim Country As Variant
Year = ThisWorkbook.Names("year").RefersTo BusinessType = ThisWorkbook.Names("business").RefersTo Country = ThisWorkbook.Names("country").RefersTo
With Sheet2 .AutoFilterMode = False With .Range("A1:G1") .AutoFilter .AutoFilter Field:=1, Criteria1:= Country .AutoFilter Field:=6, Criteria1:= BusinessType .AutoFilter Field:=7, Criteria1:= Year End With End With
With Sheet3 .AutoFilterMode = False With .Range("A3:E3") .AutoFilter .AutoFilter Field:=1, Criteria1:= Country .AutoFilter Field:=4, Criteria1:= BusinessType End With End With End Sub
Időközben újraolvastam, vagy inkább újraértelmeztem a könyvrészletet. Azt nem írta a könyvem (csak én képzeltem hozzá), hogy az Activesheet.protect userinterfaceonly:=True parancs kiadása után a létrejött lapvédelmet is csak program írhatja felül.
Csak arról írt, hogy bizonyos parancsokat azért a védett munkalapon is alkalmazni lehet programból.
A jelszavas védelem majd csak későbbi téma lesz:-)))
Köszönöm. Ezek szerint password nélkül nem működik?
Mert a tankönyvem szerint (Kovalcsik Géza: AZ Excel'97 programozása) ezt (a userinterfaceonly paramétert) csak programból állíthatjuk be, és kapcsolhatjuk ki. De jelszóról nem ír, ami nem is lenne nekem elsőre logikus, hiszen jelszóval védeni nem csak programból lehetne. A kézzel bekapcsolt lapvédelemnél is meg lehet adni jelszót.
Egy fájlban legyen (minimum) két munkalapod. Az egyikben (Munkalap1) a cégeket (B2) és a hozzá tartozó címeket (C2) írdd be, külön cellákba. Az A2-be egy azonosító (pl. 0001, 0002, 0003.....) növekvő egész számot adj, arra fogsz mindig hivatkozni a másik munkalapon.
A másik munkalapon (Munkalap2) az A2 cellába beírod az egyik azonosító számot (pl. 0001) és FKERES függvénnyel hivatkozol a Munkalap1-ben lévő címre
Segítségül a súgóból kimásoltam az FKERES szintaxisát is
A keresési_feltétel a tömb első oszlopában keresett érték.
A tömb legalább két oszlopból álló hivatkozás.
Az index a visszakapni kívánt értéket tartalmazó oszlop száma a tömbben. Az első oszlop száma 1.
A rendezett opcionális paraméter, amely azt jelöli, hogy a tömb első oszlopa növekvő sorrendben van-e rendezve. Ha az első oszlop nincs növekvő sorrendben rendezve, akkor írja be a logikai HAMIS vagy a nulla értéket. A rendezett oszlopokban a keresés sokkal gyorsabb, illetve a függvény minden esetben visszaad egy értéket. Ez igaz még akkor is, ha a függvény a keresési értékkel nem talált pontos egyezést, feltéve, hogy az érték a rendezett lista legmagasabb és a legalacsonyabb rendezett értéke között található. Nem rendezett listák esetén a keresési értéknek pontosan egyeznie kell. Ha nem így van, a függvény a következő üzenetet adja vissza: Hiba: Érték nem érhető el.
Kis segítséget szeretnék kérni tőletek. Egy listát szeretnék létrehozni, amelyben a megfelelő cellát automatikusan kellene kitöltse megadott adatokkal az excel, vagyis:
Beírom a cégnevet, ő meg írja be a címet mellé. A cégnevekhez tartozó cím állandó :) Gondolom kell készíteni egy listát a cégnevekkel és a hozzájuk tartozó címekkel, és ezeket kell behivatkozni valahogy a készítendő listába, de sajnos ez még meghalad engem :)