Új hozzászólás Aktív témák
-
Lokids
addikt
válasz Delila_1 #2950 üzenetére
Azt hiszem megvan a hiba.
Van a fenti részben egy feltétel. "If actrow = 2 then"
Na ide nem lép be, hogyha a fenti rész lefut. Ezért kiakad a második résznél.
Azt az If-et a Range léptetés elé téve működik.
De jellemző, hogy az után veszem észre, hogy felteszem a kérdést. Nem az előtte lévő 1 órában.[ Szerkesztve ]
If you chase two rabbits you will lose them both.
-
vilag
tag
Halihó!
Azt meg lehet valahogyan oldani, hogy ha kijelölök egy cellát akkor az adott sor háttere színt váltson?
Próbáltam a Workbook_Change()-ben megírni, de úgy tűnik, hogy a kijelölt cella változásakor a Workbook_Change () nem fut le.
Igazándiból nem is arra vagyok elsősorban kíváncsi, hogy mit írjak meg (bár erre is szívesen fogadok javaslatokat, hátha valakinek jobb ötlete van mint nekem), hanem sokkal inkább az, hogy hová kellene azt megírni.
Köszönöm!
[ Szerkesztve ]
-
Delila_1
veterán
Lapfülön jobb klikk, Kód megjelenítése.
Ezzel beléptél a Visual Basik-be, ott is a lapod kódjához. A jobb oldalon lévő nagy üres felületre viheted be az eseményvezérelt makrót. Az üres rész tetején balra a (General) helyett kiválasztod a Worksheet opciót.
Már meg is jelent a makród kezdő- és befejező sora.Private Sub Worksheet_SelectionChange(ByVal Target As Range)
End SubEz a makró akkor indul, ha egy cellát kiválasztasz, magyarul, ha rálépsz. A két sor közé írhatod meg a kódodat, pl.
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Target.Interior.Color = vbYellow
End SubA kiválasztott cella háttere sárga lesz.
Adhatsz feltételt, hogy pl. csak az A oszlopban sárgítson.
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Column = 1 Then
Target.Interior.Color = vbYellow
End If
End SubEzernyi más dolgot is rendelhetsz a makróhoz.
Programozó: hibás programok megírására és kijavítására kiképzett szakember. Többet ésszel, mint ész nélkül.
-
vilag
tag
válasz Delila_1 #2953 üzenetére
Köszönöm a javaslatot.
Ma már kínlódtam vele vagy két óra hosszát, de belekavarodom a dologba és most teljesen máshogy akarom újra kezdeni.
Most épp látom a fényt az alagút végén, de csak pislákol.
A javaslatodat használva próbálkoztam, de nem teljesen hozza a várt eredményt.
Jelen formájában kiszínezi a kijelölt cellát vagy cellákat, azonban ha újabb cellát vagy cellákat jelölök ki akkor azokat is kiszínezi (az elősző színezések meghagyásával).A célom az lenne, hogy a kijelölt cellák sorait jelölje ki és az esetlegesen korábban kijelölt cella/cellák sorainak színezését pedig szüntesse meg.
A fejemben már össze is állta a dolog el is kezdtem megírni, de ott elakadtam, hogy több sort érintő kijelölés esetén csak az első sor sorának a számát tudom lekérdezni pl ezzel
sorok = Selection.Row
pedig nekem a kijelölés kezdő és végsorának számára is szükségem lenne.Próbáltam
Selection.Address
kóddal is de abból meg csak kerülő úton tudnám a sorok számát kinyerni.Van esetleg erre valami egyszerűbb megoldás?
Egyébként nagyjából így képzelném a kódot:
Cells.Interior.Pattern = xlNone 'összes színezés megszüntetése a munkalapon
kijelolttartomanysorai = ????
Rows(kijelolttartomanysorai).Interior.Color = vbYellowÍgy visszanézve kissé viccel, hogy egy 3 soros kóddal bajlódom két órája
-
Delila_1
veterán
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim elozo As String
Range(Target.Address).Interior.Color = vbYellow
If Range("AA1") <> "" Then
elozo = Range("AA1").Value
Range(elozo).Interior.Color = xlNone
End If
Range("AA1") = Target.Address
End SubSzínezi a kiválasztott területet, majd az AA1-be beírja a jelenlegi területet. A következő kijelölésnél a színezésen kívül az AA1-ben tárolt cím (terület) színezését megszünteti.
Programozó: hibás programok megírására és kijavítására kiképzett szakember. Többet ésszel, mint ész nélkül.
-
vilag
tag
válasz Delila_1 #2955 üzenetére
Ez eddig rendben van, ezt én is megoldottam (ugyan ennél kevésbé elegánsabban), de egy fontos körülmény elkerülte a figyelmedet:
Én nem magát a kijelölt területet akarom átszínezni, hanem a kijelölt területtel érintett egész sorokat.
Az egésznek a lényege az lenne, hogy amolyan sorvezetőként szolgálna a szemnek.
De lehet, hogy az általad írt kódból is meg tudom oldani a dolgot, mert most kipattant egy ötlet a fejemből, meglátjuk működik-e.
[ Szerkesztve ]
-
Delila_1
veterán
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim elozo Long
Rows(Target.Row).Interior.Color = vbYellow
If Range("AA1") <> "" Then
elozo = Range("AA1").Value
Rows(elozo).Interior.Color = xlNone
End If
Range("AA1") = Target.Row
End SubProgramozó: hibás programok megírására és kijavítására kiképzett szakember. Többet ésszel, mint ész nélkül.
-
vilag
tag
válasz Delila_1 #2957 üzenetére
A
Target.Row
-t már próbáltam, de az csak a kijelölt tartomány első sorának sorszámát adja vissza lekérdezésben.A
Rows(Target.Row).Interior.Color = vbYellow
pedig ugyan megtartja az eredeti kijelölést, de csak a kijelölt tartomány első sorát színezi át.Tehát még mindig az a probléma, hogy hogyan lehetne lekérdezni a kijelölt tartománnyal érintett sorokat?
A
x=Targer.Address
visszaadja a teljes tartományt, de abból meg ki kellene mókázni a sorok számát...Ezért valami ettől egyszerűbb megoldást keresek.
-
Delila_1
veterán
Már majdnem kész volt a makró, mikor jött a szerelő.
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim elozo As String, kezd As Long, ucso As Long, b As Integer, cim As String
Application.EnableEvents = False
cim = Target.Address
Debug.Print Target.Address
If Range("AA1") <> "" Then
elozo = Range("AA1") & ":" & Range("AB1")
Range(elozo).Interior.Color = xlNone
End If
kezd = Selection.Row
For b = Len(cim) To 1 Step -1
If Mid(cim, b, 1) = "$" Then
ucso = Mid(cim, b + 1, 20) * 1
Exit For
End If
Next
Rows(kezd & ":" & ucso).Interior.Color = vbYellow
Range("AA1") = kezd: Range("AB1") = ucso
Application.EnableEvents = True
End SubItt a kijelölés alsó sorát egy ciklussal kerestetem ki. Ha sikerül elegánsabb megoldást találni rá, megírom.
Programozó: hibás programok megírására és kijavítására kiképzett szakember. Többet ésszel, mint ész nélkül.
-
vilag
tag
válasz Delila_1 #2959 üzenetére
Nagyon szépen köszönöm!
Kicsit egyszerűsítettem rajta mivel biztosan nem lehet a munkalapon semmi korábbi színezés, így annyit csináltam, hogy minden színezést töröl és utána színezi az érintett sorokat a módszered szerint.
Egyébként azt furcsállom, hogy a
Target.Rows
nem működik.
Pedig a Target-nek van Row és Rows tulajdonsága is, legalábbi a "." billentyű után felkínálja mint lehetőséget. -
Lokids
addikt
Meg tudja valaki mondani, hogy tudom a szóközöket eltávolítani egy cellából.
Pl: cella értéke: 101 101 101
És ez kellene legyen: 101101101Az spacek miatt nem húzza rá a pénznem formát, így ki kéne szednem a szóközöket.
Se a trim, se a replace nem működik.s_Cell.value = Workbooks(Input_F_Name).Worksheets(Input_KATWS_Name).Cells(p_SrcRow, s_CNum)
s_Cell.value = Replace(s_Cell, " ", " ")
s_Cell.value = WorksheetFunction.Trim(s_Cell)A google találatokban ezt a két módszert láttam megoldásra.
If you chase two rabbits you will lose them both.
-
Lokids
addikt
válasz csaszizoltan #2962 üzenetére
De ezt próbáltam. És nem működik.
If you chase two rabbits you will lose them both.
-
sztanozs
veterán
-
csaszizoltan
csendes tag
És így?
Egyébként az biztos, hogy egy szóközt egy üres stringgé kell átalakítania a replace-nek, mindenhol mindenképp az előbbi szerint próbáld.Dim s_Cell As Range
Set s_Cell = Workbooks(Input_F_Name).Worksheets(Input_KATWS_Name).Cells(p_SrcRow, s_CNum)
s_Cell.Value = Replace(s_Cell.Value, " ", "")[ Szerkesztve ]
- Kivel és mit iszik Orbán? - Tök mindegy! Sörös vagy boros, csak közel legyen Soroshoz.
-
Delila_1
veterán
A tegnapi makró egyszerűsítve úgy, hogy az összes cella háttér színezést szüntesse meg, mielőtt a kijelölt sorokat besárgítja:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim kezd As Long, ucso As Long, cim As String
Application.EnableEvents = False
Cells.Interior.Color = xlNone
cim = Target.Address
kezd = Selection.Row
ucso = Range(cim).Row + Range(cim).Rows.Count - 1
Rows(kezd & ":" & ucso).Interior.Color = vbYellow
Application.EnableEvents = True
End SubProgramozó: hibás programok megírására és kijavítására kiképzett szakember. Többet ésszel, mint ész nélkül.
-
vilag
tag
válasz Delila_1 #2969 üzenetére
Ez a megoldás tényleg sokkal frappánsabb.
Apróbb kiegészítésekkel (ami nem képezte részét az eredeti koncepciónak) be is építettem.Néhány kivételkezelést tettem még hozzá, de ezek mind szépészeti beavatkozások. PL.: hogy csak olyan tartományt jelöljön ki ahol már van érték, meg a fejléces tartományban ne jelöljön ki, ilyesmi...
Köszönöm a segítséget!
-
vilag
tag
Üdv!
Le lehet valahogyan kérdezni, hogy az adott munkalap hány nyomtatás szerinti oldalból áll?
Wordben le tudom, de excelben egyelőre nem találom.
Wordben:oldalszam = ActiveSheet.BuiltinDocumentProperties(wdPropertyPages)
-
vilag
tag
válasz Delila_1 #2973 üzenetére
Tökéletes!
Remekül sikerült megoldani a problémát.
Felvetnék még egy kérdést amelyre régóta nem lelem a megoldást.
Van egy olyan TextBoxom (illetve több is), amely úgy van megoldva, hogy csak számokat enged bevinni az alábbi kóddal:Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) 'Ügyirat főszámba csak számot enged írni
If KeyCode = 8 Or KeyCode = 46 Or _
(KeyCode >= 48 And KeyCode <= 57) _
Or (KeyCode >= 96 And KeyCode <= 105) Then
TextBox1.Locked = False
Else
TextBox1.Locked = True
End If
End SubValamilyen okból ha a munkafüzetet Office 2007-ben Win7-es gépen mentem el, random módon az a jelenség következik be, hogy elindítva a formot a mezőbe nem csak számot enged írni, valamint ha nyomok egy TAB-ot akkor nem a következő vezérlőre ugrik hanem valóban egy tabulátort tesz az adott vezérlőbe.
Ez ugye hibás működést eredményez és számos problémát okoz.
Arra viszont rájöttem, hogy ha egy Win Xp-s gépen (és azt hiszem Office 2003-on) makrók letiltásával indítom a munkafüzetet és rámentek, akkor már a Win7-es Office 2007-es gépeken sem jelentkezik a probléma.
Van esetleg ötleted (vagy bárkinek), hogy mivel lehetne ezt kiküszöbölni.
Most csak ezért megint össze kellett raknom egy Xp-s gépet amit gyakorlatilag csak ennyire használok.Egy másik apró de idegesítő probléma:
A munkafüzet indításakor automatikusan indul a form. Ezen van egy gomb amely lehetővé teszi a VB indítását és ezzel együtt a jelszavazás feloldását is az alábbi módon:Unload Me
Unload UserForm1
Application.Visible = True 'hogy az Excel menüje újra látszódjon
'Project védelem feloldása
With Application
.SendKeys "%{F11}", True 'VB megnyitása
.SendKeys "^r", True 'Project Explorer ablak aktiválása
.SendKeys "SZTK" 'SZTK projectre ugrás
.SendKeys "~", True 'Enter leütés imitálása
.Wait (Now + TimeValue("0:00:01"))
.SendKeys "jelszó" 'Jelszó megadása
.SendKeys "~", True 'Enter leütés imitálása
' .Wait (Now + TimeValue("0:00:01"))
' .SendKeys "Mod"
' .SendKeys "~", True 'Enter leütés imitálása
' .Wait (Now + TimeValue("0:00:01"))
.SendKeys "For"
.SendKeys "~", True 'Enter leütés imitálása
' .Wait (Now + TimeValue("0:00:01"))
' .SendKeys "Mic"
' .SendKeys "~", True 'Enter leütés imitálása
End WithA folyamat végén valóban indul a VB, de valamiért a NUMLOCK-ot kikapcsolja.
Ugyan ez a fentebb említett Xp-s gépen is lefut azonban ott nem kapcsolja ki a NUMLOCK-ot.A kívánatos az utóbbi lenne.
-
Lokids
addikt
Ne ezzel mi a gond? Mi az, hogy _Global failed?
Set WBRange = Workbooks(OutputKAT_F_Name).Worksheets(s_wsName).Range("A2:" & HeaderKAT_Last_Col & s_OutRow)
Workbooks(OutputKAT_F_Name).Worksheets(s_wsName).Sort. _
SortFields.Add Key:=Range(WBRange), SortOn:= _
xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal[ Szerkesztve ]
If you chase two rabbits you will lose them both.
-
sztanozs
veterán
Megírod ide, hogy szeretnéd töröltetni: linkBiztos, hogy a range-et jól veszi fel ez a sor:
Set WBRange = Workbooks(OutputKAT_F_Name).Worksheets(s_wsName).Range("A2:" & HeaderKAT_Last_Col & s_OutRow)
Nézz rá debuggerben.[ Szerkesztve ]
JOGI NYILATKOZAT: A bejegyzéseim és hozzászólásaim a személyes véleményemet tükrözik; ezek nem tekinthetők a munkáltatóm hivatalos állásfoglalásának...
-
Lokids
addikt
Már nem tudom szerkeszteni.
Ez nem jó.
Set WBRange = Workbooks(OutputKAT_F_Name).Worksheets(s_wsName).Range("A2:" & HeaderKAT_Last_Col & s_OutRow)
Workbooks(OutputKAT_F_Name).Worksheets(s_wsName).Sort.SortFields.Add Key:=Range(WBRange & "[" & "Projekt neve" & "]"), SortOn:= _
xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormalEz meg miért jó?
Range("A2").Select
ActiveWorkbook.Worksheets("VIGKAT").Sort.SortFields.Add Key:=Range("A2"), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormalIf you chase two rabbits you will lose them both.
-
sztanozs
veterán
Ahogy nézem SortFields-be megadott range nem lehet több oszlop széles. Vsz ez a problémája.
Ha több oszlop szerint szeretnél rendezni, akkor mindet egyesével hozzá kell adni.
Majd miután beállítottad a rendezési feltételeket, jöhet a Sort parancs.Valahogy így:
Workbooks(OutputKAT_F_Name).Worksheets(s_wsName).Sort. _
SortFields.Add Key:=Range(Range("A2:A" & s_OutRow)), SortOn:= _
xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
Workbooks(OutputKAT_F_Name).Worksheets(s_wsName).Sort.SetRange Range("A2:" & HeaderKAT_Last_Col & s_OutRow)[ Szerkesztve ]
JOGI NYILATKOZAT: A bejegyzéseim és hozzászólásaim a személyes véleményemet tükrözik; ezek nem tekinthetők a munkáltatóm hivatalos állásfoglalásának...
-
vilag
tag
Valakinek van ötlete hivatkozott problémával kapcsolatban?
+1 kérdés:
Adott egy munkafüzet aminek az egyik lapját (vagy annak tartalmát) másolom egy új munkafüzetbe és mentetem el kód segítségével.
Szerencsére a munkalapon lévő gomb (és a hozzá tartozó kód is) megye vele.Meg lehet-e valahogyan oldani, hogy az újonnan létrejövő munkafüzet "ThisWorkbook"-jába kódot helyezzek el?
Oda szeretném megírni, hogy bezárás előtt ne dobjon fel hibaüzenetet, hanem mindent figyelmen kívül hagyva zárja be.
Nevezetesen:Application.Displayalerts = False
A gombnyomásra lefutó makró miatt ugyan is bezárás előtt megkérdezi, hogy akarok-e menteni.
Ezt viszont nem szeretném, mert a felhasználók amúgy sem tudnak beleírni a munkafüzetbe, így semmi szükség erre, csak összezavarja szegényeket...Sajnos ebben a formában eredménytelen:
Private Sub CommandButton1_Click()
ActiveSheet.PrintOut Copies:=2, Collate:=True
Application.DisplayAlerts = False
End Sub[ Szerkesztve ]
-
bozsozso
őstag
Sziasztok,
Kis segítség kellene ami lehet nem is kicsi. Excel makróban szeretnék egy olyat megvalósítani nyomógombbal, hogy megadott könyvtárból másoljak fájlokat megadott könyvtárba az alábbi módon:
Könyvtárszerkezet:
c:\a\001\x\fájl1.exe
fájl2.exe
c:\a\002\x\fájl1.exe
fájl2.exe
fájl3.exe
c:\a\003\x\fájl1.exe
fájl3.exe
c:\a\004\x\fájl1.exe
stb.Elkezdi keresni a fájlt a könyvtárakban, nincs fix név amit talál azzal foglalkozik. Az 1-2-3-4 azok folytonos számok 999-ig de vannak kihagyások az nem tudom mennyire gond, hogy 100 alatt elő vannak nullázva(pl.:080) 3 karakterre.
Ha talált fájlt akkor egy megadott helyen létrehoz egy napi dátumos könyvtárat majd azon belül a fájl nevével megegyező könyvtárat
kiterjesztés nélkül.
Pl:c:\mappa\2018.01.11\fájl1\
Majd ide elkezdi bemásolni az 1-2-3-4 stb "x" mappában található fájlokat úgy, hogy fixnév_1.exe, fixnév_2.exe........
A végén lesz egy ilyenem:
c:\mappa\2018.01.11\fájl1\fixnév_1.exe(itt már nem kellene előnullázni a számot)
fixnév_2.exe
stb.Persze ha közben új fájlt talál akkor szintén létrehozza a hozzá tartozó könyvtárat és ha a továbbiakban talál ugyanilyet akkor azt már ebbe a
könyvtárba másolja. A mappák mindig fixek csak a fájlok mások.Hát nem tudom érthetően fogalmaztam-e, de ha valaki tud annak előre is köszönöm a segítséget.
-
_kovi_
aktív tag
Sziasztok!
IT üzemeltetésben dolgozom, és amiatt szeretném a segítségeteket kérni, hogy miként tudok egy batch file-t készíteni amiben automatikusan lenyomódik 3 billentyű! CTRL-SHIFT-H
Amit aztán indítópultba tennék. -
sztanozs
veterán
-
sztanozs
veterán
vbs fájlt (pl
cthlshifth.vbs
) kell létrehozni neki és így lehet futtatni:wscript.exe //nologo cthlshifth.vbs
[ Szerkesztve ]
JOGI NYILATKOZAT: A bejegyzéseim és hozzászólásaim a személyes véleményemet tükrözik; ezek nem tekinthetők a munkáltatóm hivatalos állásfoglalásának...
-
sztanozs
veterán
amúgy indítópultba elég, ha behúzod a vbs fájlt (mármint ha a Start menü > Programok > Startup - ról van szó)
[ Szerkesztve ]
JOGI NYILATKOZAT: A bejegyzéseim és hozzászólásaim a személyes véleményemet tükrözik; ezek nem tekinthetők a munkáltatóm hivatalos állásfoglalásának...
-
Ispy
veterán
Hát ahhoz írni kell egy win szervizt, mondjuk .NET-be, aztán telepíteni kell a szerviz modulba.
Egyébként nem egy agysebész feladat, kell hozzá egy Visual Studio, meg pár sor kód.
Mondjuk nem tudom ez mennyire jó, mert a szerviz már akkor elindul, amikor feláll a win, tehát még be sem kell hozzá loginolni, lehet jobb lenne, ha leírnád pontosan miért is kell ez.
[ Szerkesztve ]
"Debugging is like being the detective in a crime movie where you're also the murderer."
-
_kovi_
aktív tag
-
sztanozs
veterán
Szervíz nem hiszem, hogy tudna (rendesen) interaktálni a desktoppal modern windows os esetén: [link]
Esetleg HKLM/Software/Microsoft/CurrentVersion/Run - ba lehetne berakni, hogy korábban elinduljon.
Vagy job schedulerrel lehet loginra (de asszem az is deferred).[ Szerkesztve ]
JOGI NYILATKOZAT: A bejegyzéseim és hozzászólásaim a személyes véleményemet tükrözik; ezek nem tekinthetők a munkáltatóm hivatalos állásfoglalásának...
-
vilag
tag
Sziasztok!
Lenne egy fontos és sürgős kérdésem:
Tudok-e VBA-ban "öngyilkos kódot" írni?
A lényege az lenne, hogy ha valaki a Projektet védő kódot mondjuk 3-szor rosszul üti be (VBAProject - Project Properties/Protection), akkor az azt eredményezi, hogy a projektből az összes kód törlődik és ráment a munkafüzetre.
Úgy néz ki elhagyom a jelenlegi munkahelyemet és a programokat ugyan itt hagyom, használhatják, de nem akarom, hogy a kódhoz bárki is hozzábabráljon (mégis csak az én "gyermekem").
Továbbá érdekelne, hogy hogyan is kell levédetni jogilag egy programot.
Mivel már csak korlátozottan fogok hozzáférni a gépemhez, nagyon sürgős lenne a dolog.
Köszönöm!
-
sztanozs
veterán
Kódtörlés: [link]
Az első kérdésedre amúgy "nem" a válasz mert nem kódból ellenőrzöd a vba protection kódot, hanem az excel csinálja meg neked, szóval a kódot csak időzítve, vagy programozható eseményhez kötve tudod töröltetni.JOGI NYILATKOZAT: A bejegyzéseim és hozzászólásaim a személyes véleményemet tükrözik; ezek nem tekinthetők a munkáltatóm hivatalos állásfoglalásának...
-
smallmer
őstag
Sziasztok!
Makrót szeretnék készíteni a következő feladat megoldására:
Van kb. 200 darab excel fájlom.
Minden fájlban van 4 darab munkalap.
Minden munkalapon Vannak adatok kb 150 oszlop és 220 sor, de pár darabbal lehet több.A feladat az lenne, hogy van egy SABLON fájlom, amiben már van egy kész macro, ami arra szolgál hogy valamilyen szempont alapján vizsgálja a 4 munkalap adatait.
Ebbe a sablonba kellene mind a 200 daran excel fájl adatait egyesével belerakni, majd elmenteni, és az se lenne rossz, ha a sablon macroja lefutna. Ezt valahogyan meg lehet oldani automatizáltan?
Programozáshoz az alapokat értem(java,c++ ...)Köszönöm szépen