- Felháborodott az Apple, a Meta az iPhone-felhasználók üzeneteit akarja olvasni
- A luxusmárkáknak kell a bitcoin, az USA jegybankjának nem
- Letiltja az USA a politikusokat a telefonhívásokról és szöveges üzenetekről
- Nagy áttörés jön a napelemek piacán, nem kell annyi hely a paneleknek
- Belenyúlt az USA az Epic Games igazgatótanácsába, nyomoz az NVIDIA
-
IT café
A Microsoft Excel topic célja segítséget kérni és nyújtani Excellel kapcsolatos problémákra.
Kérdés felvetése előtt olvasd el, ha még nem tetted.
Új hozzászólás Aktív témák
-
Mutt
senior tag
válasz ROBOTER #44131 üzenetére
Szia,
Se a Value2, se a Text nem tartalmazza a cella értékét?
Irányított beillesztésnél az ellenőrzés nem fog lefutni, így előfordulhat hogy a cella "érvénytelen" adatot tartalmaz (pl. számnak tűnő szyöveg), de attól még a cella értéket kellene tudnod kiolvasni.
üdv
A tanácsaimat ingyen adom. Ha nem tetszik, akkor kérlek ne kritizáld! / https://github.com/viszi/codes/tree/master/Excel
-
ROBOTER
addikt
válasz ROBOTER #43594 üzenetére
Bocs, egy kicsit zavarosan írtam le. Szóval ha két ujjal nagyot görgetek a touchpad segítségével, akkor a cellakiválasztás "ott marad" és nem működik a cellakiválasztás. Ha hozzáérek a scrollbarhoz, akkor visszaugrik oda, ahol a kiválasztott cella állt az előbb, és működik minden. Ha a scrollbarral scrollozok tovább, semmi gond. Tiltható ez?
-
Fferi50
Topikgazda
válasz ROBOTER #43498 üzenetére
Szia!
Igen, vannak olyan fejlesztési fázisok, amikor a korábbi változók értéke elvész, mert átstruktúrálódik a memória. Tulajdonképpen minden új futtatás inicializálja a változók értékét. Erre mindenképpen figyelni kell. Megoldás lehet, hogy fix értékekkel feltöltött környezetet használsz a tesztelés során, ahol nem kell újra és újra felépíteni a környezetet. Egy (kapcsoló) változóval meghatározhatod, hogy tesztkörnyezetet kell használni vagy felépíteni szükséges. Pl. a teszt logikai változó értéke igaz, akkor nem kell a környezettel bíbelődni, ha false akkor "éles" a futás.
Gondolom, a teszt különböző részfeladatok megoldására szükséges.
Amennyiben további kérdéseid lennének, priviben szívesen cserélnék eszmét veled.
Üdv. -
Fferi50
Topikgazda
válasz ROBOTER #43488 üzenetére
Szia!
Amennyiben a program futása során hozol létre újabb makrókat, eseménykezelőket, akkor sajnos a globális változók tartalma (is) elvész. Ebben az esetben szerintem nincs más megoldás, mint azok tárolása valamilyen módon.
Ha nem nyúlsz a VB projekthez, akkor a változók értékeinek meg kell maradnia.
Üdv. -
Mutt
senior tag
válasz ROBOTER #43335 üzenetére
Szia,
Több infó kellene nekünk, mert nehéz kitalálni hogy miért nem fut le a kód.
Watch ablakba be kellene húzni a változókat és megnézni, hogy melyik nem kap értéket, lehet hogy nem is a tartományokkal van gond.
Két ötlet:
1. Spill funkció használata (itt feltételezem hogy az első sor fejléc. Ha kibontás hiba van, akkor foglalt a céltartományRange("KÖLTSÉG").Cells(2, 1).Formula2 = "=EGYSÉGÁR*MENNYISÉG"
2. INDEX függvénnyel próbáld meg a megfelelő elemet kinyerni:
Range("KÖLTSÉG").Cells(rowID, 1).Formula = "=INDEX(EGYSÉGÁR*MENNYISÉG,)"
üdv
A tanácsaimat ingyen adom. Ha nem tetszik, akkor kérlek ne kritizáld! / https://github.com/viszi/codes/tree/master/Excel
-
Delila_1
veterán
válasz ROBOTER #43323 üzenetére
Ha azt a listát, ahova az érvényesítéseket akarod makróval bevinni, táblázattá alakítod, az első cellába beviszed az érvényesítést. Mivel táblázat, a többi sorban is automatikusan ott lesz, és egyáltalán nem kell makró.
Programozó: hibás programok megírására és kijavítására kiképzett szakember. Többet ésszel, mint ész nélkül.
-
Fferi50
Topikgazda
válasz ROBOTER #43323 üzenetére
Szia!
A nevek mindaddig megmaradnak a munkafüzetben, amíg ki nem törölted azokat - mindegy, hogy a munkafüzetben kézzel vagy makróval hoztad létre azokat. Tehát ismételt megnyitás esetén nem is kell már foglalkozni velük, hacsak nem módosítani szükséges.
Ha nem létezik a név, a Subscript out of Range (9 -es hibaszám) hibaüzenet adja tudtul.On Error Resume Next
nev=names("neve").name
if Err=9 Then ' a név még nincs létrehozva
létrehozod a nevet
endif
Err=0
On Error Goto 0
Üdv.
[ Szerkesztve ]
-
Fferi50
Topikgazda
válasz ROBOTER #43311 üzenetére
Szia!
Amennyiben az érvényesítésed listája növekvő-csökkenő és nem új listát kell megadni, akkor megoldás lehet egy rugalmasan változó területet tartalmazó nevet definiálni, menüből:
Pl.=ELTOLÁS(AUX2!$A$2;0;0;DARAB2(AUX2!$A$2":$A$1000);1)
neve legyen lista.
Makróból:ActiveWorkbook.Names.Add "lista2",RefersTo:="=OFFSET(AUX2!$A$2,0,0,COUNTA(AUX2!$A$2:$A$1000),1)"
Ebben az esetben,ha adsz az A oszlophoz újabb értékeket, az érvényesítés automatikusan ki fog rá terjedni.
Ráadásul, ha minden igaz a nevet is hozzá tudod adni a védett laphoz makróból.
Tehát egyszer az elején meghatározod az érvényesítést, utána nem kell hozzányúlni.
Üdv. -
Delila_1
veterán
válasz ROBOTER #43309 üzenetére
Az érvényesítésben szereplő adatokhoz adj címsort, majd a Beszúrás | Táblázat menüben alakítsd táblázattá. A kép szerint adj nevet az adatokat tartalmazó soroknak.
Rendeld a lenti makrót a lapodhoz, ahol az A oszlopba be akarod vinni az érvényesítést.
Ügyelj rá, hogy az az oszlop, ahova írni akarsz, ne legyen zárolt.
Szerek.: Mivel táblázattá alakítottad az érvényesítéshez szükséges adatokat, a táblázat bővülésekor automatikusan bővül a Lista nevű tartomány, nem kell külön gondoskodni róla.Private Sub Worksheet_Change(ByVal Target As Range)
ActiveSheet.Unprotect
With Cells(Target.Row, 1).Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:="=Lista"
End With
Cells(Target.Row, 1).Activate
ActiveSheet.Protect
End Sub[ Szerkesztve ]
Programozó: hibás programok megírására és kijavítására kiképzett szakember. Többet ésszel, mint ész nélkül.
-
Fferi50
Topikgazda
válasz ROBOTER #43302 üzenetére
Szia!
A VBA-ban is tudni kell a nem zárolt cellát kezelni. Viszont vannak olyan műveletek, amelyeket zárolt munkalapon nem lehet végrehajtani.
Makróval védetté teheted a munkalapot úgy, hogy az csak a felhasználó műveleteit gátolja, makróval mindent végrehajtathatsz. Ehhez a Protect metódus UserInterfaceOnly tulajdonságát True -ra kell állítanod, amikor védetté teszed a munkalapot.
Célszerűen a makró futtatása során a műveletek előtt ismét be kell állítani a védettséget:
Sheets(x).Protect Password:="Jelszó" , UserInterfaceOnly:=True
Ez a beállítás mindaddig hatásos, amíg a fájl nyitva van. A munkafüzet bezárása után viszont megszűnik a hatása. Ezért minden megnyitáskor újra ki kell adni ezt a parancssort a védeni kívánt munkalapokra.
Üdv. -
Mutt
senior tag
válasz ROBOTER #43293 üzenetére
Szia,
Azt még nem értem, hogy honnan veszi, hogy az adott sorban hajtsa végre a műveletet, amikor sor-koordináta nincs megadva.
Implicit intersectionnak hívják, ha nem adod meg az elemet, akkor az Excel feltételezi hogy az aktuális sorra/oszloppal megegyező elemet akarod visszakapni.
@ jelet tesz az új név elé!
Office365-öt használsz, ahol vannak már spill (kitöltő) függvények, vagyis ha a képlet végeredménye nem fér be 1 db cellába, akkor több cellába fogja kiírni az eredményeket. A @ jel azt mondja meg az új Excelben, hogy ne legyen több cellás kitöltés, az implicit intersection szerinti eredményt adja vissza. Ha azt akarod, hogy műkődjön a spill, akkor a Formula2 tulajdonságba kell a képletet írnod.
üdv
A tanácsaimat ingyen adom. Ha nem tetszik, akkor kérlek ne kritizáld! / https://github.com/viszi/codes/tree/master/Excel
-
Fferi50
Topikgazda
válasz ROBOTER #43293 üzenetére
Arra nem válaszoltál, hogy táblázattá van-e alakítva amin dolgozol, vagy sima munkalap.
Gyanítom, hogy táblázat...
A táblázatban egészen mások a hivatkozási szabályok... Nézd meg a hozzá tartozó Excel Helpet.
Ma már nem leszek.
Ha még van problémád, írd meg légy szíves priviben.
Üdv.[ Szerkesztve ]
-
Fferi50
Topikgazda
válasz ROBOTER #43289 üzenetére
Ha képletet írsz, akkor ne a Value tulajdonságot használd, hanem a Formula tulajdonságot.
Range("névC").Cells(adottsor,1).Formula="=névA*névB"
Ha teljes oszlopot/sort adtál meg névnek, akkor a képletnél nem kell beírni az adott sor számát, mindig a célcella sorának megfelelő értékekkel fog számolni a képlet.
Hogyan tudom azt mondani, hogy =újoszlopnév2 vagy =újoszlopnév$2 ?
Ebben a formában sehogyan sem, mint ahogyan fentebb is írtam. Ez nem működik sem munkalapon, sem VBA-ban.
Üdv.[ Szerkesztve ]
-
Fferi50
Topikgazda
válasz ROBOTER #43287 üzenetére
Szia!
A névvel ellátott tartomány egy cellájára így hivatkozhatsz:
Names("neve").RefersToRange.Cells(sor,oszlop)
A tartomány első cellájától indulva használhatsz sor és oszlop számokat - a tartomány első sor, első oszlop lesz az első cella (kezdőpont áthelyezés). Ha nem az első sortól/oszloptól kezdődik a tartomány, akkor 0 és negatív értéke is lehet a sor vagy/és oszlop számának
Üdv. -
Fferi50
Topikgazda
válasz ROBOTER #43286 üzenetére
Szia!
Szerintem nem megfelelően használod a nevekre való hivatkozást (bocs, hogy ilyeneket írok). Milyen módon használod? Megírnád, hogyan hozod létre a neveket? Itt mintha táblázatot látnék, ahol a képletek automatikusan folytatódnak. Esetleg egy mintát mutatnál?
Ha ez egy táblázat, akkor a táblázatnak vannak névvel elérhető paraméterei. (Táblázat alatt a kezdőlap - beszúrás - táblázat menüpont alatt létrehozottat értem. Ezen kívül lehet még kimutatás is adott esetben.)
Természetesen a név jó lehetőség a relatív kezelésre, de VBA-ban inkább az adott terület változóhoz rendelése a praktikusabb. Ha egy kicsit pontosabb leírást adnál arról, mit szeretnél, talán jobban tudnánk segíteni.
Üdv.[ Szerkesztve ]
-
Fferi50
Topikgazda
-
Delila_1
veterán
válasz ROBOTER #43273 üzenetére
Nem mutattad meg, de talán az általam leírt módszer is jó.
Két AxtiveX vezérlőt tettem a Munka2 lapra. Ezeknek az az előnyük az érvényesítéssel szemben, hogy a kezdőbetűt leütve a listában szereplő kezdetű tételre ugrik a kijelölés. A ComboBox1-ben a kategóriát választhatod ki, a ComboBox2-ben a terméket. A Munka1 lapon vannak a táblázatok, amikben a második sortól az utolsóig elneveztem a tartományokat a címsornak megfelelően.A makró a 2 vezérlőhöz:
Private Sub ComboBox1_Change()
ComboBox2.ListFillRange = "Munka1!" & ComboBox1
End Sub
Private Sub ComboBox2_Change()
Dim sor As Long, oszlop As Integer
sor = Selection.Row
Select Case ComboBox1.Value
Case "keresztnév": oszlop = 1
Case "város": oszlop = 2
Case "zöldség": oszlop = 3
Case "gyümölcs": oszlop = 4
End Select
Cells(sor, oszlop) = ComboBox2.Value
End SubÁllsz a soron a Munka2 lapon, ahova be akarod vinni az adatot, és kiválasztod a kategóriát, majd a terméket. Beírja, ahova kell.
Programozó: hibás programok megírására és kijavítására kiképzett szakember. Többet ésszel, mint ész nélkül.
-
Fferi50
Topikgazda
válasz ROBOTER #43265 üzenetére
Szia!
Azért a globális változók hasznosak ha nem írjuk felül a programunkat állandóan.
Az új lap hozzáadása után újra kell "startot" csinálni a változóknál és akkor megy tovább rendesen. Ellenőrizni az értékét, ha nem az amit vártunk, akkor beolvasni a kíírt valós értéket.
Üdv. -
Fferi50
Topikgazda
válasz ROBOTER #43263 üzenetére
Szia!
Amikor új programot adunk a projekthez, minden változó értéke defaulttá válik. Ha kódmodulba makróval írunk, akkor a programból kilépés után történik ez meg. Amíg a program fut, addig elérhető az értéke. Ezt be kell kalkulálni sajnos.... Munkalapra fel kell jegyezni amit később használni szeretnénk.
Üdv.[ Szerkesztve ]
-
Fferi50
Topikgazda
válasz ROBOTER #43261 üzenetére
Szia!
Jó lenne látni végig azt a kódot, amivel az eseménykezelőt beírod. Plusz esetleg a Newsheet kódjait is.
Egyébként pedig melegen ajánlom az Option Explicit utasítást a modulok elejére (ill. a Tools - Options - Editor lapon a Require Variable Declaration bejelölését). Hidd el sok hiba megelőzhető vele.
Üdv.[ Szerkesztve ]
-
ROBOTER
addikt
válasz ROBOTER #43260 üzenetére
Bocs, lejárt a szerkesztési idő. A writeCode így folytatódik:
With Application.VBE.ActiveVBProject.VBComponents(sheetCodename).CodeModule
.InsertLines c + 1, "'dinamukusan létrehozott programkód"
.AddFromString myCode
Lehet az AddFromString rossz helyre szúr be és a változók memóriaterületére ír?
-
Pakliman
tag
válasz ROBOTER #43257 üzenetére
Szia!
Kipróbáltam a kódodat, de nálam minden esetben (többszöri indítás és beírás) kiírta a jobb oldalra $B$11-et.
Valahol kell lennie egy utasításnak a kódodban, ahol aWorksheets("START").Range(newSheetNamePos)
cella értéke törlésre kerül (akár delete, akár szóköz, akár "").[ Szerkesztve ]
-
Fferi50
Topikgazda
válasz ROBOTER #43255 üzenetére
Szia!
Milyen utasítással adsz értéket neki a Workbook_Open-ben? Melyik esemény során olvasod ki az értékét és milyen utasítással, melyik modulban? És melyik a másik esemény, amikor nincs értéke, szintén modul, utasítás megnevezéssel?
Van-e Option Explicit utasítás a moduljaid elején?
Jó lenne a makróid szerint válaszolni a kérdésekre - a változónév természetesen lehet akármi, de az utasítások legyenek pontosak.
Az érték látszólagos elvesztésének oka a helytelen hivatkozás lehet. Ezért kérdezem a fentieket, hogy lássuk, megfelelően hivatkozol rá.
Üdv.[ Szerkesztve ]
-
Pakliman
tag
válasz ROBOTER #43220 üzenetére
Szia!
Ez alapján elindulhatsz:
Private Sub Kód_írása_programból()
Dim c As Long
'Új munkafüzet létrehozása
Workbooks.Add
c = Application.VBE.ActiveVBProject.VBComponents("ThisWorkbook").CodeModule.CountOfLines
'Az új munkafüzetbe beírunk egy kódot!!!
With Application.VBE.ActiveVBProject.VBComponents("ThisWorkbook").CodeModule
.InsertLines c + 1, "'Ezeket a sorokat programból hoztuk létre!!"
.InsertLines c + 2, "Private Sub Workbook_BeforeClose(Cancel As Boolean)"
.InsertLines c + 4, "End Sub"
End With
End SubAz idézőjelekre kell nagyon odafigyelni, amikor "szöveggé" alakítod a létrehozott programkód sorait:
sKód = ""
sKód = sKód & vbLf & "Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)"
sKód = sKód & vbLf & " Dim TaláltSor"
sKód = sKód & vbLf & " Dim sCrit As String"
sKód = sKód & vbLf & " Dim sÉvHó As String"
sKód = sKód & vbLf & " Dim c"
sKód = sKód & vbLf & ""
sKód = sKód & vbLf & " If Cells(1, Target(1).Column) = ""Név"" Then"
sKód = sKód & vbLf & " Cancel = True"
sKód = sKód & vbLf & " TaláltSor = Application.Match(Cells(ActiveCell.Row, 4), Columns(4), 0)"
sKód = sKód & vbLf & " If Not IsError(TaláltSor) Then"
sKód = sKód & vbLf & " ActiveWindow.ScrollRow = TaláltSor"
sKód = sKód & vbLf & " Cells(TaláltSor, ActiveCell.Column).Activate"
sKód = sKód & vbLf & " End If"
sKód = sKód & vbLf & " Else"
sKód = sKód & vbLf & " If Target(1).Row = 1 Then"
sKód = sKód & vbLf & " For Each c In Range(""A:A"")"
sKód = sKód & vbLf & " If c.Value Like ""T*2#######"" Then"
sKód = sKód & vbLf & " sÉvHó = Left(Right(c, 8), 6)"
sKód = sKód & vbLf & " sÉvHó = Left(sÉvHó, 4) - 1 & Right(sÉvHó, 2)"
sKód = sKód & vbLf & " Exit For"
sKód = sKód & vbLf & " End If"
sKód = sKód & vbLf & " Next c"
sKód = sKód & vbLf & " If sÉvHó <> """" Then"
sKód = sKód & vbLf & " Cancel = True"
sKód = sKód & vbLf & " sCrit = "">="" & sÉvHó"
sKód = sKód & vbLf & " Cells.AutoFilter Field:=Target(1).Column, Criteria1:=sCrit, Operator:=xlAnd"
sKód = sKód & vbLf & " End If"
sKód = sKód & vbLf & " End If"
sKód = sKód & vbLf & " End If"
sKód = sKód & vbLf & "End Sub"
.AddFromString sKód -
Delila_1
veterán
válasz ROBOTER #43203 üzenetére
Csak makróval tudom megoldani. A makrót a lapodhoz kell rendelned.
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 1 And Target.Value = "igen" Then '*
With Cells(Target.Row, "B").Validation '**
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Formula1:="=$J$1:$J$7" '***
End With
End If
End Sub3 sorhoz tettem *-ot.
* nálam az igen-nem választás az A oszlopban van, ezért Column=1. Nálad a te oszlopod sorszámát add meg helyette.
** a B oszlopba viszem be a választási lehetőséget az érvényesítéshez, a B helyett ad meg a saját oszlopod betűjelét.
*** a $J$1:$J$7 helyébe a saját listád címét add meg.Programozó: hibás programok megírására és kijavítására kiképzett szakember. Többet ésszel, mint ész nélkül.
Új hozzászólás Aktív témák
- Milyen processzort vegyek?
- Autós topik
- Nagy "hülyétkapokazapróktól" topik
- Xiaomi Mi Box androidos médialejátszó 4K és HDR támogatással
- Honor Magic6 Pro - kör közepén számok
- Megoldások IBS/IBD-re
- Internet fejlesztés országosan!
- Xiaomi 14 - párátlanul jó lehetne
- Nintendo Switch 2, vagy amit akartok (találgatós topik most még)
- Proxmox VE
- További aktív témák...
- Játékkulcsok olcsón: Steam, Uplay, GoG, Origin, Xbox, PS stb.
- Windows, Office licencek kedvező áron, egyenesen a Microsoft-tól - 1190 Ft-tól!
- Bitdefender Total Security 3év/3eszköz! - Tökéletes védelem, Újévi kedvező ár!
- Új, bontatlan World of Warcraft gyűjtői kiadások
- Adobe Creative Cloud - 2024. 04. 05 - 2025. 04. 05-ig
Állásajánlatok
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest