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.
"Do you know that you can use a UDF as source for hyperlink.
Just like we can write =HYPERLINK(“http://chandoo.org/”,”Click here”) we can also write =HYPERLINK(myFunction(),”Click here”)
And Excel would run your function when user clicks on the link. But, there is more to it. Excel would also run the function, when you place your mouse on the link.No need to click!"
"But, seasoned VBA programmers would know that Functions are not allowed to change values in other cells or format them. Well, that restriction does not apply if you use a function from Hyperlink!!!"
Most komolyan, ezeket a trükköket ki találja meg?
Ilyenkor jövök rá, hogy van okom szerénynek lenni excel témakörben...
Azt a legördülős részt nem értem, de az oszlopra így tudod korlátozni a makrót:
Private Sub Worksheet_Change(ByVal Target As Range) Dim OldVal As Variant, NewVal As Variant If Not Intersect(Target, Range("F:F,L:L")) Is Nothing Then If Target.Count > 1 Then Exit Sub Application.EnableEvents = False NewVal = Target.Value Application.Undo OldVal = Target.Value If IsNumeric(OldVal) And IsNumeric(NewVal) Then Target.Value = NewVal + OldVal End If Application.EnableEvents = True End If End Sub
Van még egy hátránya ennek a makrónak, hogy egy cella értékét nem tudsz törölni, csak ha tartományt jelölsz ki. Ez nem tudom jó-e vagy rossz, lehet Neked éppen így jó!
TransferSpreadsheet, itt klasszul lehet tovább részletezni, hogy hova mentse pontosan.
Tökjó, persze mindig jönnek újabb kihivások...
Pl miért tűnnek el a nulla értékek, amik még megvannak a kereszttáblában, de ha már egy táblát csinálok belőle ugyenbből a kersezttáblából, akkor már csak üres cellát ad...
Private Sub Worksheet_Change(ByVal Target As Range) Dim OldVal As Variant, NewVal As Variant If Target.Count > 1 Then Exit Sub Application.EnableEvents = False NewVal = Target.Value Application.Undo OldVal = Target.Value If IsNumeric(OldVal) And IsNumeric(NewVal) Then Target.Value = NewVal + OldVal End If Application.EnableEvents = True End Sub
Az előző kérdésemhez találtam ezt a makrót, ami tökéletesen megfelel a célra amit írtam. Ha bármelyik aktív cellába beírok egy számot hozzáadja a cella aktuális étékéhez. Tehát ha a cella 2, én beírok 3-at akkor 5-öt mutat. Egy gondom van vele, hogy a táblázatom felső sorában van legördülő lista, stb ami ezzel a makróval nem működik. Lehet valahogy csak az F és az L oszlopra megadni neki egy range-t....
Az alábbi dologban szeretném a segítségeteket kérni:
Adott pl A1, B1, C1 cella
A1-be írok több számot, ami C1-ben összegződne úgy, hogy B1-ben mindig megjelenne mi volt az utolsó szám amit A1-be írtam, egyfajta önellenőrzés céljául. Az A1-be írt szám nem kellene hogy ott maradjon, hasonlóan működne mint egy számológép. Ez egy havi összesítő táblázatomhoz kellene de nem jövök rá hogyan lehetne megoldani. Nyilván ennél bonyolultabb a dolog, ez csak egy szegmense az egész táblázatnak.
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