Keresés

Részletes keresés

wawabagus Creative Commons License 2011.08.12 0 0 15821

hahahaha...hát igen

:-D

Előzmény: SQLkerdes (15819)
wawabagus Creative Commons License 2011.08.12 0 0 15820

Szia Delila!

Ó, ez tényleg szuper. Megjegyzem későbbre, közben már "átcsináltam" a makrót....

Köszi!

 

Előzmény: Delila10 (15818)
SQLkerdes Creative Commons License 2011.08.12 0 0 15819

Mondjuk az biztos, hogy futás közben tarkón lőni a kódot tartalmazó excel file-t nem egy best practice :-)

Előzmény: wawabagus (15814)
Delila10 Creative Commons License 2011.08.12 0 0 15818

Hihetetlen, de ez az egy sor létrehoz egy új füzetet, és átmásolja a Sheet1 lapot.  Az új füzet lesz aktív, nem lesz benne több lap. Ezt az új füzeted mentheted más néven, és bezárhatod.

 

A sor: Sheets("Sheets1").Copy

Előzmény: wawabagus (15816)
wawabagus Creative Commons License 2011.08.12 0 0 15817

...vagy SaveCopyAs lesz a megoldás :-DDD?

 

Istenem

Előzmény: wawabagus (15816)
wawabagus Creative Commons License 2011.08.12 0 0 15816

Szia,

Igen tudom, de mások fogják használni és nem biztos hogy majd vágják ezt....

Csak közben az jutott eszembe, hogy ha én ciklust írok, amiben becsukom a makrós munkafüzetet, akkor nem szakad meg a ciklus...nem felejti el hol tart a számolásban?

 

Bocs a hülye kérdését...kezdek már kikészülni ettől a hülye makrótól :-D.

 

Már belekezdtem egy olyan megoldásba, ahol inkább array-ként átmásolom az össze sheetet egy friss munkafüzetbe...

Itt most azon szenvedek, hogy nekem csak az átmásolt munkafüzetek kellenek, tehát sheet1, sheet2, sheets3-ra /vagy ahány van nem/.

Ok, újabb megoldásra váró feladat.

 

OK, törlöm az össze sheetet, mielőtt bemásolnám azt ami kell majd nekem.

Szuper, akkor már csak azt nem tudom, hogyan lehet üres munkafüzetbe másolni:

 

   Windows("Template - Version2.xls").Activate
    Sheets(Array("InventoryReport", "EMEA Orders", "Country Orders", _
        "Country Orders Data", "EMEA calls", "Country calls", "EMEA usage", "Country usage" _
        , "PartUsage Data")).Copy Before:=Workbooks("Book1").Sheets(1)

 

Nincs before, after, mert nincs benne sheet...

 

Basszus hány év megtanulni ezt a makró írás mekkmester módra....

ááááááááááááááááááááááá

 

Előzmény: SQLkerdes (15815)
SQLkerdes Creative Commons License 2011.08.12 0 0 15815

Szerintem ehhez elég az Excel biztonsági beállításait megváltoztatni.  Asszem a Trust Center címszó alatt futnak az excel 2007-ben és felette.

Előzmény: wawabagus (15814)
wawabagus Creative Commons License 2011.08.12 0 0 15814

Sziasztok!

Lenne még egy kérdésem...

 

Adott egy template sok sok sheettel, amin mindenféle manipulációt végzek, majd a végén nyomok egy SaveAS-t.

 

Majd újra nyitom a templetem, hogy egy újabb országra is lefusson ugyanaz a procedura...egészen annyiszor ahány országot talál egy adott helyen.

 

 

A kérdésem az lenne, hogy mivel ciklusba szeretném tenni a procedurát /annyiszor fut, ahány országot talál/...a makro biztonsági bizbasza be fog zavarni...

 

Lehet ezt makróból kikapcsolni? Hogy ne zavarjon be minden macro templet nyitáskor?...

 

Össze vagyok zavarodva, lehet nem jó ötlet hogy SaveAS-t nyomok és becsukódik a template...

 

ÁÁÁÁ

 

Esetleg ahelyett, hogy SaveAS a templetre esetleg az egészet egy új munkfüzetbe kéne másolni és akkor a template nyitva marad?

 

Nem tudom mennyire sikerült érthetően átadni mi a gond...

 

Tudok nekem tippet adni, hogyan lehet ezt praktikusan megoldani?

KÖSZÖNÖM

 

 

wawabagus Creative Commons License 2011.08.12 0 0 15813

Szia Jimmy,

Hahaha...nagyon trükkös megoldás :-). Sosem jutott volna ilyen eszembe.

Köszi szépen, tegnap még vissza csináltam a filteres megoldásom...úgy ezerszer gyorsabb :-), mint a szuper loopos...pedig arra nagyon büszke voltam.

 

 

 

Előzmény: Törölt nick (15811)
wawabagus Creative Commons License 2011.08.12 0 0 15812

Ok, köszi

Előzmény: SQLkerdes (15810)
Törölt nick Creative Commons License 2011.08.11 0 0 15811

Esetleg ezt is megpróbálhatod. Úgy mértem, durván 5x gyorsabb, mint a ciklusos megoldás.

Kb. 55000 sornál 51 sec volt a futási idő. (Lehet, hogy a kézi szűrés-másolás ennél is gyorsabb :))

 

Sub töröl()
    Dim Rng As Range, WS As Worksheet
    Application.Calculation = xlCalculationManual
    Set WS = Sheets("Country Orders Data")
    Set Rng = WS.Range("B2", WS.Range("B" & Rows.Count).End(xlUp))
    WS.Range("B:B").Insert
    With Rng.Offset(, -1)
        .FormulaR1C1 = "=IF(RC[1]<>""Denmark"",1,"""")"
        .Copy
        .PasteSpecial xlPasteValues
        .SpecialCells(xlCellTypeConstants, xlNumbers).EntireRow.Delete
    End With
    WS.Range("B:B").Delete
    Application.Calculation = xlCalculationAutomatic
End Sub

Előzmény: wawabagus (15809)
SQLkerdes Creative Commons License 2011.08.11 0 0 15810

A Calculate-et feltétlenül próbáld meg.

Előzmény: wawabagus (15809)
wawabagus Creative Commons License 2011.08.11 0 0 15809

Szia,

Screenupdate-et lekapcsoltam

Calculate-et viszont nem

 

Közben megpróbáltam, hogy szüréssel nyerem ki ami kell nem ezzel a ciklussal és így sokkal gyorsabb.

 

Köszi!

Utánanézek ennek a calculate dolognak

Köszönöm a sgeítséget!!

 

Előzmény: SQLkerdes (15808)
SQLkerdes Creative Commons License 2011.08.11 0 0 15808

Screenupdating lekapcsolás,

Calculate lekapcsolás

 

35000 sornál akár rengeteget is számíthat.

Előzmény: wawabagus (15807)
wawabagus Creative Commons License 2011.08.11 0 0 15807

Sziasztok!

Lenne még egy kérdésem.

 

Van nekem ez a kódom:

 

    Sheets("Country Orders Data").Activate
    Last = Cells(Rows.Count, "B").End(xlUp).Row
    For i = Last To 2 Step -1
        If (Cells(i, "B").Value) <> "Denmark" Then
            Cells(i, "A").EntireRow.Delete
        End If
    Next i

 

Mivel azonban a sheet, amin töröl kb 35ezer sor van, ez eléggé kikészíti a programot.

Mi lehetne a gyorsabb megoldás? Rászűrés Denmarkra és kicopizás?

 

Köszi a tiippeket!!

 

 

wawabagus Creative Commons License 2011.08.11 0 0 15806

Sziasztok!

Tudnátok nekem tanácsot adni?

 

Vadi új gépet kaptam a munkahelyemen és új programokat is:

 

Windows XP - ->> Windows7

Excel 2003 -->> Excel2007, de a Excel 2003-es még rajta van

 

Vannak régi excel fájlaim, minenféle makróval....meg új fájlok amikben most komponálik makrót stb...

 

TETÜ LASSÚ AZ EXCELEM!!!

 

Megnyitni egy fájlt 3 perc

Elmenteni 2perc

Gagyi makrót futtatni 4 perc

 

A gépem vadi új!

 

Lehet emögött olyan ok, amin esetleg változtatni tudok? Létezik, hogy az excel 2007-en ennyire lassan nyíljanak a régi fájlok?

 

Köszi előre is a tippeket/ötleteket mit lehetne tenni...

Köszi!!!

magyarpityu Creative Commons License 2011.08.11 0 0 15805

Szia Jimmy!

 

Köszönöm a választ, megint tanultam tőled! :))

 

Ezt a 4 elemű tömböt én is nézegettem, de nem tudtam kiokoskodni, milyen adatokat is tárol. Végül megtaláltam a megoldást:

 

Sub szamol()
  Dim Param1 As Integer, Param2 As String
  Dim MenuCommand As CommandBarControl
  Set MenuCommand = CommandBars.ActionControl
  If Not TypeName(MenuCommand) = "CommandBarButton" Then Exit Sub
  Param1 = MenuCommand.Tag
  Param2 = MenuCommand.DescriptionText
  ...

 

A menü több szintes, minden szinten CommandBarControl objektumok szerepelnek. Azokat a menüpontokat, amelyek valamilyen feladatot hajtanak végre, vagyis amelyek meghívják a szamol() makrót, azokat msoControlButton típussal hoztam létre:

 

AlMenu(k).OnAction = "szamol"

AlMenu(k).DescriptionText = "..." 'Param2

AlMenu(k).Tag = "..." 'Param1

 

Azok a menüpontok, amelyekből almenü nyílik, azok msoControlPopup típusúak, és nincs .OnAction tulajdonságuk (pontosabban, ezt a tulajdonságát nem irányítottam a szamol() makróra).

 

Mikor a menüből meghívódik a 'szamol' makró, akkor a CommandBars.ActionControl tartalmazza azt a referenciát, amire szükségem van. Felvettem a 'szamol' makróban egy CommandBarControl típusú objektumot, ennek adtam át a CommandBars.ActionControl referenciát, és innentől kiolvashattam a korábban minden menüpontra egyedileg jellemző .DescriptionText és .Tag tulajdonságokat. Így már át tudok adni paramétereket a meghívott makrónak. Sőt, akár három paraméter is átadható, mert a .Parameter tulajdonság is használható.

Még egyszer köszönöm a segítséget!

Előzmény: Törölt nick (15804)
Törölt nick Creative Commons License 2011.08.11 0 0 15804

Hát én úgy nézem, hogy a variant egy négyelemű tömb, amelynek elemei a hívó menuitem pozícióját mutatják.

 

Sub teszt()
    Dim v As Variant
    v = Application.Caller
End Sub

 

Ha a fenti makrót saját menügombbal indítod, akkor a v(1 To 4) vektor elemei a következők lesznek:

 

v(2) : hányadik menü a felső menüsorban

v(1) : az adott menün belül hányadik menüpont

v(3) : ??? (nem tudom mi ez)

v(4) : kísérleteim szerint, ha legalább 3. szinten van az aktivált menüpont, akkor v(4) értéke 1, egyéb esetben nulla. (Vagyis, ha az aktivált menüpont a főmenü->almenü->menüpont útvonalon érhető el, mint pl. az Eszközök->Védele->Lapvédelem, vagy még ennél is lejjebb van a hierarchiában.)

 

Maximum 2 szintes menürendszer esetén működik az alábbi tesztprogram. A 3. szintre már nem tudtam kiterjeszteni, mert fogalmam sincs, miből derül ki az, hogy az aktív menüpont a hierarchia hányadik szntjén tartózkodik.

 

Sub szamol()
    Dim v As Variant
    With Application
        v = .Caller
        MsgBox .ActiveMenuBar.Menus(v(2)).Caption & " -> " & .ActiveMenuBar.Menus(v(2)).MenuItems(v(1)).Caption
    End With
End Sub

 

Lehet, hogy van egyszerűbb módja is, pl. direkt hivatkozás az aktív menüpontra valahol az Application objektum ezernyi tulajdonsága között. Nem tudom.

Előzmény: magyarpityu (15803)
magyarpityu Creative Commons License 2011.08.10 0 0 15803

Szia Jimmy!

 

Ezt a módszert hogyan lehetne alkamazni menürendszernél?

 

Létrehoztam egy több szintű menüt, minden menüpont CommandBarControl típusú.

 

Const maxMenuCommand As Integer = 40

Dim FoMenu As CommandBarControl

Dim AlMenu(maxMenuCommand) As CommandBarControl

 

Set FoMenu = CommandBars(1).Controls.Add(msoControlPopup)

 

Azokat az almenüpontokat, amelyeknek további almenüi vannak, így hoztam létre:

 

Set AlMenu(k) = FoMenu.Controls.Add(msoControlPopup)

 

Míg azokat a menüpontokat, amelyeknek már nincs almenüje, így:

 

Set AlMenu(k) = FoMenu.Controls.Add(msoControlButton)

 

Minden almenü .OnAction tulajdonságát ugyanarra a makróra állítottam:

 

AlMenu(k).OnAction = "szamol"

 

és a későbbi azonosítás kedvéért még néhány menüpontra jellemző adatot is beállítottam:

 

AlMenu(k).DescriptionText = "..."

AlMenu(k).Tag = "..."

 

Már csak az van hátra, hogy mikor meghívódik a 'szamol' makró, akkor valahogyan azonosítania kellene, hogy melyik menüpont indította el. Ha tudnám, melyik menüpontról lett meghívva, onnantól tudnám a 'szamol' makró paramétereit is, mert minden menüpont .DescriptionText és .Tag tulajdonságait kitöltöttem. Viszont az Application.Caller ebben az esetben egy Variant() típust ad vissza. Hogyan lesz ebből CommandBarControl objektumra való hivatkozás?

 

Előre is köszönöm a segítséget!

Előzmény: Törölt nick (15800)
magyarpityu Creative Commons License 2011.08.10 0 0 15802

Szia Jimmy!

 

Ez fantasztikus, köszönöm szépen! :)) Ezt az Application.Caller-t kerestem!!!

 

Még egyszer köszönöm a segítséget!

Előzmény: Törölt nick (15800)
Törölt nick Creative Commons License 2011.08.10 0 0 15801

kórvégrehajtás kódvégrehajtás

Előzmény: Törölt nick (15800)
Törölt nick Creative Commons License 2011.08.10 0 0 15800

Nem biztos, hogy jól értem a kérdést, de ha igen, akkor a következő megoldást javaslom.

Ne az OnAction értékbe adjad be a paramétert, hanem magát a makrót írd meg úgy, hogy különböző dolgokat csináljon attól függően, hogy melyik képről indult.

 

Tehát pl. minden kép OnAction értéke a meret nevű makró, ami pedig így épül fel:

Sub meret()
    If TypeName(Application.Caller) = "String" Then
        Select Case Application.Caller
        Case "Kép 1"
            MsgBox "A 'Kép 1' objektumra kattintottál."
        Case "Kép 2"
            MsgBox "A 'Kép 2' objektumra kattintottál."
        Case "Szövegdoboz 3"
            MsgBox "A 'Szövegdoboz 3' objektumra kattintottál."
        End Select
    End If
End Sub

Itt tehát az Application.Caller tartalmazza annak az objektumnak a nevét, amelyről a kórvégrehajtás indult.

 

 

Előzmény: magyarpityu (15799)
magyarpityu Creative Commons License 2011.08.10 0 0 15799

Az ID azonosítók mentés, kilépés, újra megnyitás után változnak (de természetesen továbbra is egyediek maradnak), úgyhogy másként kell azonosítani az eseményt kiváltó objektumot. Így aztán most már két kérdésben kérek tőletek segítséget!

 

1. Hogyan lehet (pl. Shape objektum) OnAction eseménykezelőjébe olyan makróhivatkozást megadni, ami paramétereket is át tud adni a meghívott makrónak?

 

2. Hogyan lehet azonosítani azt az elemet, ami kiváltott az OnAction hatására a makróhívást?

 

Illetve talán rosszul közelítek a kérdéshez. Hogyan oldható meg, hogy egy képre kattintva elinduljon egy makró, ami ezt a képet (csak ezt, a többit nem) módosítja?

Előzmény: magyarpityu (15798)
magyarpityu Creative Commons License 2011.08.10 0 0 15798

Sziasztok!

 

Egy dologban szeretném a segítségeteket kérni! Makróval képeket szúrok be egy munkalapra, és azt szeretném, hogy a képre kattintva elinduljon egy makró.

 

Addig rendben, hogy a kép 'Shape' típusú objektum, és az 'OnAction' tulajdonságát beállítom a meghívandó makró nevére, de hogyan adok át paramétert a makrónak? Paraméterek nélkül valóban meghívódik a makró a képre kattintva, de át szeretném adni paraméterként, hogy melyik képre kattintva hívódott meg a makró! Arra gondolok, hogy a meghívandó makró várna egy Long típusú értéket, ami az egérkattintás eseményt kiváltó Shape objektum ID azonosítója lenne. Így próbáltam:

 

Dim abra as Shape

Set abra = Munlalap.Shapes.AddPicture(FileNev, msoTrue, msoTrue, Xpos, Ypos, pWidth, pHeight)

abra.OnAction = "meret(" & abra.ID & ")"

 

Az 'abra' objektum 'OnAction' tulajdonsága valóban felveszi pl. a "meret(12)" stringet, de rákattintva az ábrára hibaüzenetet kapok: "A(z) meret(12) makró nem futtatható. Lehetséges, hogy a makró nem érhető el a munkafüzetben, vagy le van tiltva az összes makró." Viszont a 'meret' makrót Excelből elindítva rendben lefut. Kipróbáltam:

 

sub tesztel()

meret 12

end sub

 

így működik.

 

Mi lehet a hiba? Hogyan lehet ezt megoldani?

tt65 Creative Commons License 2011.08.10 0 0 15797

köszi, valóban  3x(18+1)=57, most már értem honnan a misztikus szám! :-)

Előzmény: Sztai (15794)
Törölt nick Creative Commons License 2011.08.10 0 0 15796

Az Outlook a csatolmányokat belementi az email-be.

Amikor a mellékletet megnyitos, bemásolódik egy temporary mappába, és a továbbiakban az összes mentés, automentés itt rögzül. Aztán amikor be akarod zárni az emailt, az Outlook megkérdezi, hogy mentse-e a változásokat. És ha azt mondod, hogy igen, akkor a temp mappából az email obektumba beágyazódik a csatolt fájl utolsó verziója, és az egész együtt elmentődik vagy az exchange szerverre, vagy a lokális pst fájlba. Mivel elvileg ez (tehát az email + a beágyazott csatolt fájl) a végtermék, és minden egyéb csak munkaverzió, az ideiglenes fájlokra nincs szükség, tehát fölösleges őket az asztalra, vagy egyéb frekventált helyre másolni/menteni. Legalábbis valami ilyesmi lehet az ideológia mögötte.

 

Mindenesetre akár tetszik, akár nem, ehhez kell alkalmazkodni, ha Outlookot használ az ember. Fontos fájlok esetében érdemes rászokni arra, hogy mindenekelőtt lemented a mellékletet egy biztos helyre, és csak utána kezdesz dolgozni vele.

Előzmény: Qtyi (15793)
Sztai Creative Commons License 2011.08.10 0 0 15795

Milyen oprendszered van, milyen outlookod és exceled?

Előzmény: Qtyi (15775)
Sztai Creative Commons License 2011.08.10 0 0 15794

az 57 abból adódik, hogy a példában 18 ország volt, tehát az első 18 pontot kap, a második 17 stb. Ezt úgy számolom ki, hogy 18+1-helyezési sorszám. Mivel 3 csoportban értékelte őket:

n+1-ssz1+n+1-ssz2+n+1-ssz3=3*(n+1)-ssz1-ssz2-ssz3

a ssz-ot pedig a MATCH/HOL.VAN adja meg

Természetesen 57 helyett jobb megszámolni az elemszámot fv-nyel (3*(count(a:a)+1))

Üdv

 

Előzmény: tt65 (15774)
Qtyi Creative Commons License 2011.08.10 0 0 15793

Jimmy, hályog kovács, tt65,

 

Köszönöm a segítségeteket!

Sajnos egyik módszerrel sem sikerült elővarázsolni a file-t.

Emlékeztem, hogy valami T-vel kezdődő krix-krax-nevű könyvtárba "mentettem", de azt nem találtam meg (pedig volt vagy 40 könyvtár mindenféle kezdőbetűvel, és mindet végignéztem).

Viszont megtaláltam egy korábbi file-t, amivel szintén így jártam anno, úgyhogy segítségetek nem volt hiábavaló :)

 

Mégegyszer köszönöm!

 

(Pusztán csak elgondolkodás végett, vajon mire jók ezek a krixkrax nevű, elérhetetlen könyvtárak? Miért nem menti az Outlook valami normális helyre a file-okat alapból?... )

 

Előzmény: Törölt nick (15776)
tt65 Creative Commons License 2011.08.10 0 0 15792

mail ment

Előzmény: Daniel Jonas (15791)

Ha kedveled azért, ha nem azért nyomj egy lájkot a Fórumért!