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.
Ott a baj! A ThisWorkbook object az mindíg az, amiben a makró "ül".
A Hely, Nev es Ujnev nálad mind a ThisWorkbook-ból olvassa ki a megfelelő tartalmat.
Javaslat: - használd a Workbook object index-ét névvel. Ha tehát tudod a "forrás" workbook nevét, akkor így hivatkozz rá: Workbooks("ForrasWorkbookNeve"). Igy tuti, hogy a jó workbookot használod. Mondjuk ebben az esetben, nem kell a Nev változót kiolvasni, mert tudod. Ha nem tudod, akkor csukj be minden más workbook-ot amikor a makró fut és használd az index-számos workbook hivatkozást: Workbboks(1).
A legjobb ha definiálsz egy ForrásWorkbook workbook objectet, megfelelteted a megfelelő workbooknak és utána arra hivatkozol, pld Dim ForrasWorkbook as workbook Set forrasworkbook = workbooks("forrasworkbookneve") Hely = forrasworkbook.Path & "\"
- Dim Hely, Nev, UjNev, Sor HELYETT Dim Hely, Nev, Ujnev as String (új sor) Dim Sor as Long (azért jobb így, mert ezzel is hibákat azonosíthatsz)
- NE használj Select-et, nézz utána a With ... End With struktúrának. Ha valahol a With ... End With nem műxik, használj mást, pld
Sheets("Partner Pricing Details").Range("A65500").Select Selection.End(xlUp).Select Sor = (ActiveCell.Row) + 1
HELYETT
Sor = Sheets("Partner Pricing Details").Range("A65500").End(xlUp).Row +1
Vagy:
Rows("1:1").Select Selection.Insert Shift:=xlDown
HELYETT
Rows("1:1").Insert Shift:=xlDown
Gondolom látod, hogy hogy műxik a dolog.
A Select csak lassítja és bonyolítja a kódodat.
- Használd a változóidat! Pld: Mivel a Thisworkbook.Name tartalmát már kiolvastad a Nev változóba (most tekintsünk el attól, hogy nem a Thisworkbook object-et kellett volna használni) megfontolandó a következő változtatás a kódban:
Nem csak olvashatóbb a kódod, hanem gyorsabb is, mert az xl-nek nem kell háromszor kiolvasnia a file nevét, elég egyszer, és utána már "csak" a Név változót használja.
Hmm... Tuti, hogy a Personal-t menti csv formában, nem pedig a jót menti, de Personal név alatt? Mert nagyon nem mindegy!
Ha csak a név rossz, akkor azt kell ellenőrizni, ahol a név-sztringer kiolvasod, ha a Personal-t menti, akkor meg azt a részt ahol lemented a filet (mert a lementendő object van rosszul megadva).
Sokat segítene, ha betennék a kódot de legalább a megfelelő részét.
Szia Delila_1! Igen, elvileg már sokat használtam makrót úgy hogy Personal-ba volt lementve... De a gondom az, amit leírtam SQL-nek...
Hogy ha Personalba mentem akkor az Új fájl helyett a personalt mentegeti nekem. Ha viszont a munkafüzethez kapcsolom a macrót, akkor meg jól működik...
És makróval hogy lehetne azt megoldani, hogy mondjuk egy nyomógombbal indítom el a cellában lévő értéket, mondjuk 1-el kezdödjön, és mondjuk 1500-ig helyettesítse be a számokat, amik csak pozitív egész számok lehetnek, és növekvő sorrendben 1,2,3,4,5....1498,1499,1500 és ha a behelyettesítéskor mondjuk a C2-es cella értéke 1-re változik, akkor álljon le a számok behelyettesítése?
Van egy munkalapom, ahol a DL2 cellába kellene behelyettesíteni a számokat 1-1500-ik, és van a DK1 cella amiben bizonyos feltételek teljesülése esetén 0-ról 1-re változik.Azt szeretném, hogy az 1-el inditott behelyettesítés addig menjen, mig a DK1 cella értéke 0-ról 1-re nem változik.Az 1500 számig terjedő behelyettesítésre akár 3 ilyen is előfordulhat, hogy a DK1 cella 0-ról 1-re változik, de van olyan is amikor csak 1-szer, meg olyan is, amikor egyszer sem, ezért nem jó nekem a célértékkeresés.A DK1 cella egyébként egy HA függvényt tartalmaz, ami sok cella értékét figyeli, és ennek csak 0 vagy 1 az értéke.
Nem értem. Ebben az esetben egy sima összeadás/kivonással ki lehet számolni a B2 cella értékét - hogy a C2=1 legyen =J1-H1-G1-F1
vagy: 1. Célérték keresés vagy 2. Solver (A bővítményeknél be kell kapcsolni) vagy 3. Makró számolós ciklussal 4. Makró, aminek kivanja a J1-H1-G1-F1 cellák értékét egymásból és visszaadja a B2 cellának :)
Van egy munkalap, ahol van egy léptető. A léptető 1-től több ezerig terjedhet.Ez a léptető a B1 cellához van rendelve.
F1 cella 112 G1 cella 21 H1 cella 33 értékekkel rendelkezik.
J1 cella a 281-es értékkel rendelkezik
C1 cellában a képlet : =SZUM(B1;F1;G1;H1) C2 cellában a képlet : =HA(C1=J1;1;0)
A munkalap:
A kérdésem az lenne, hogy hogyan lehet azt megoldani, hogy a léptető, vagy esetleg nyomógombbal elinditani a B2-es cellát 1-től, és addig léptetné magától, mig a C2 cella értéke 1-re nem változik.És ennek hatására megállna a léptető.Vagy esetleg nyomógomb hatására indulna el a léptető álltal vezérelt cella, és a C2 értékének 1-re váltása hatására állna meg. Ezt meg lehet oldani?
ha egy képletet tartalmazó cellára szeretnél adatérvényesítést, akkor pl. az adatérvényesítésben ugyanazt a képletet kell megadnod, ami a cellában van. (Adatérvényesítés --> "Egyéni")
"ez a szubrutin egy "...beforedoubleclick" eseménykezelőben van, amit nem tudok a szokásos call paranccsal meghívni."
Nem biztos, hogy nem tudod. Ha például
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) 'kód End Sub
helyett az eseménykezelőd így néz ki:
Public Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) 'kód End Sub
akkor simán meghívható például így:
Sub hívás Munka1.Worksheet_BeforeDoubleClick Range("A1"), False End Sub
Feltéve, hogy a Munka1 kódnevű munkalaphoz tartozik. A szubrutin belsejétől függően fontos lehet, hogy a Range("A1"), False paraméterek helyén mit adsz meg.
"...és egyszerűen meg kellene hívni az XYZ szubrutint"
Bocsánat, erre még nem reagáltam: azt is megpróbáltam, hogy meghívom, de ez a szubrutin egy "...beforedoubleclick" eseménykezelőben van, amit nem tudok a szokásos call paranccsal meghívni.
Azért szeretném (szerettem volna) meghívni makróból a szubrutint, mert az egy többlépcsős makró lett volna, összesítve a különböző, egyébként önállóan működni képes szubrutinokat. Így nem marad más hátra, mint a "...beforedoubleclick"-be írt szubrutint átmásolom egy sima, nem eseménykezelős makróba (amit sajnos még át kell szerkesztenem, hogy így is futni tudjon), és ezt hívom meg az összesítőbe.
Az a bajom, közben rájöttem, hogyha egy cellába csak beírom az adott értéket, amire adatérvényesítést kérek, akkor minden jól működik.Da ha egy olyan cellára kérem, ami több más cellából ad ki eredményt, azaz képletet tartalmaz, akkor már nem müködik az adatérvényesítés.Nekem erre a cellára kellene.Azaz ha a cella értéke több másik cellával összefüggésben olyanra változik amelyre szeretném, akkor az adatérvényesítés figyelmeztessen.
Az adatérvényesítést próbálgatom, de nem tudom beállítani.Ha ott bejönne egy ablak, az jó lenne, de nem tudtam megcsinálni adatérvényesítéssel. Hogy kell azt beállítani?
Igazad van, az Application.DoubleClick tényleg nem csinál semmit (legalábbis semmi láthatót). A kérdés inkább az, miért akarod VBA kóddal emulálni a dupla kattintást. Mert ez most így néz ki (ha jól értem):
1) emulálod kóddal a duplakattintást, 2) erre a DoubleClick eseménykezelő lefut, 3) és meghívja az XYZ szubrutint.
Az első két lépés simán kihagyható lenne, és egyszerűen meg kellene hívni az XYZ szubrutint.
A Personal.xls úgy jött létre, hogy egy makrórögzítésnél a makró helyénél az "Egyéni makró-munkafüzetben" opciót választottad. Amelyik makrót a personalba írod, az minden megnyitott füzetben futtatható, mert ezt a fájlt az Excel indításkor betölti, háttérben. Ez kiválóan alkalmazható, pl. arra, hogy egy kijelölt területet bármelyik füzetben egy kattintással a kedvenc formátumodra alakítsd.
Ha a modullapon a makrók fölött beállítod az SQL által említett Option Explicit-et, futtatáskor azonnal kapsz egy üzenetet, ha dimenzionálás nélküli változót akarsz alkalmazni (UjNeve).
Szia! Nagyon köszönöm a válaszod! Az a jel ott volt a macroban, nem is értem hogyan sikerült ezt rosszul bekopiznom. Viszont nagyon köszönöm ezt az tippert használni fogom.
Igazánból valami nagyon fura dolgot műveltem a makróval, amit abszolút nem értem. Létrehoztam egy PERSONAL nevű fájlt a próbálgatásaim során...de én nem akartam...:-D Szóval szerintem az excel tényleg nem értte mi az aktív munkafüzet.
Azt szeretném még kérdezni, hogy ha ezt a makrót szeretném több ember számára hozzáférhetővé tenni azt hogyan tudom.
A makróm, ami egyébként 99%-ban kész /nagyon éleveztem :-D/ úgy kéne működnie, hogy külön gépeken te tudják futtatni...
Ezt hogyan tudom praktikusan megoldani? Lehetne template-tel, de itt ez nem jöhet szóba.
Itt alapban a bal oldalon látható felületen keresd meg a "Modul" lapokat, amelyekre dupla kattintással megnyílik egy szkript, amit kézzel ki tudsz törölni. (Ha nincs levédve jellszóval...)