- Apple MacBook
- AMD K6-III, és minden ami RETRO - Oldschool tuning
- Milyen monitort vegyek?
- Plazma TV topic
- Fejhallgató erősítő és DAC topik
- Végleg lemondott a régi gépekről a Steam
- Na, milyen hardver kerül a fa alá?
- Kellemes karácsonyi ünnepeket!
- AMD Ryzen 9 / 7 / 5 9***(X) "Zen 5" (AM5)
- Házimozi haladó szinten
-
PROHARDVER!
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
-
bsh
addikt
sziasztok.
lenne egy problémám, pont ilyet nem találtam a neten vagy nem jól kerestem. hátha valaki találkozott már vele.
adott egy táblázat, makrókkal, amit "közösen" használnak, egy fájlszerveren van, hálózati meghajtó, stb. a "közös használatot" úgy kell érteni, hogy X megnyitja szerkesztésre és dolgozik benne, közben Y megnyitja és kapja a figyelmeztetést, hogy X-nél van szerkesztésre és ő csak olvasásra tudja megnyitni. ez így oké is lenne. van lockfájl is meg minden ahogy kell.
csakhogy azt csinálja, hogy mikor Y megnyitja csak olvasásra, akkor X-nél, akinél szerkesztésre van megnyitva és dolgozott benne, hirtelen átvált csak olvasásra és nem tudja a módosításait sem elmenteni.
na ez mitől lehet vajon? -
bsh
addikt
válasz
Fferi50
#47822
üzenetére
@Kasya: 64bit. a fájlok nem nagyok (mármint az excel táblák).
@FFeri50: speciális darabjegyzéket generál cad-ből. egyedüli képletek amik vannak, ha egy tételhez tartozik pdf rajz, akkor a sima szöveges tételszám mezőbe belinkeli azt =HYPERLINK()-kel, de semmi több. minden más cella sima szöveg/szám. kis színezés, kommentek, ilyesmi. a képletszámítást, eventeket és a screenupdating-et kikapcsolja a makró futás alatt és az excel tábla rejtve van amíg el nem készül.
-
bsh
addikt
üdv,
hátha tudtok valami okosat mondani:
van egy alkalmazásban egy vba makróm, ami egy excel táblázatot hoz létre és abba írkál adatokat.
lecseréltem a céges gépemet. a régi egy i7 4771 volt, 32gb ddr3, win7 pro x64 és office 2013. az új i7 7700k, 32gb ddr4, win10 pro x64 és office 2016.
az új gépen sokkal lassabban fut ez a makró, kábé fele-harmada sebességgel.
ez mitől lehet? win10? vagy excel verzió? -
bsh
addikt
sziasztok.
nem nagyon találtam a problémámra megoldást, de lehet rosszul kerestem, ezért inkább megkérdezem.
lenne egy telemakrózott táblázat több lappal. a makrók miatt nem lehet több embernek használni egyszerre, pedig nagyon kéne.
arra gondoltam, hogy nem lehetne-e valahogy szétválasztani a táblázatot kettő fájlba: az egyikben csak a makrók lennének xlsm formában, és ez csak az adatok megjelenítésére szolgálna igazából, az összes komplett munkalapot adatokkal formázásokkal stb. egy másik, makrómentes, és így közösen is használható táblából linkelné?
képletekkel vagy adatforrásokkal csak az adatokat tudom linkelni, szöveg formában, a speciális cellákat (hyperlink, színezések stb.) azt nem.
tehát lenne egy controller vagy master tábla amiben a makrók futnak, a megjelenítendő adatokat pedig egy slave táblából linkelné csak megjelenítési céllal. és módosítás, új sor, stb. esetén a makró a slave táblába dolgozna.már elkezdtem átírni az egész szart adatbázis alapúra, de egyszerűbb lenne, ha excelben meg lehetne oldani. nem kéne komplett gui-t meg mindent megírni hozzá.
-
bsh
addikt
válasz
Fferi50
#41646
üzenetére
tudom, hogy mik a cutcopymode értékei (természetesen már azokat is próbáltam), de ez mégis működik így mert ha a cutcopymode se nem xlcut, se nem xlcopy (azaz nincs copypaste éppen), akkor a cutcopymode értéke 0 (azaz false), egyéb bármilyen esetben meg ugye az else-re ugrik is tovább.
ez most így ebben a formában van használva és működik a copypaste rendesen, csak szeretném olyankor eltüntetni a gombokat (csak a "szépség" kedvéért), de mint írtad, az úgy már viszont nem működik.
ha esetleg megtalálod mi az oka és hogy lehet ellen tenni, annak örülnék, mert nekem nem sikerült semmit találnom (csak pár ugyanezzel a problémával foglalkozó topikot, amik mind megválaszolatlanok) -
bsh
addikt
válasz
Fferi50
#41641
üzenetére
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Application.CutCopyMode = False Then
Button_X.Width = 150
Button_X.Height = 20
Button_X.Enabled = True
Button_X.Visible = True
If (Target.Cells.CountLarge > 1) And (Target.Width < Application.Width) Then
Button_Y.Width = 250
Button_Y.Height = 20
............satöbbi
End If
Else
'Exit Sub
'ezekkel próbálkoztam, de ha ebben a szakaszban BÁRMIT csinálok, onnantól nem működik a copy/paste: eltűnik a kijelölés is (akár másik lapról is) és a vágólap is törlődik(!)
'Application.EnableEvents = False
'Button_X.Visible = False
'Button_X.Enabled = False
'Button_Y.Visible = False
'Button_Y.Enabled = False
'Application.EnableEvents = True
End If
End Sub -
bsh
addikt
sziasztok.
selectionchnage eventet használok (különböző gombokat kapcsolok ki/be és helyezek át a kijelölt cellák mellé) és így nem működik a copy/paste. guglival nem találtam választ rá, hogy miért nem. nem tudja valaki?
a másik, hogy ha a selectionchange eventbe beleírom, hogy ha application.cutcopymode=false esetén csinálja csak a gombpakolászásokat, más esetben ne csináljon semmit, akkor működik a copy paste. ha viszont még extrába beleírom, hogy ha mégis cutcopymode=true, akkor tüntesse el a gombokat - akkor már megint nem működik a copypaste.
hogyan kellene ezt korrektül megoldani?
-
bsh
addikt
válasz
Fferi50
#36510
üzenetére
helló,
sajnos még mindig csak részben működik ez a függvény. így néz most ki:Public Function KKERES() As Double
KKERES = 0
If TypeOf Application.Caller Is Range Then
Dim Cllr As Range
Set Cllr = Application.Caller
Dim Z As String
ZNr = Munka2.Cells(Cllr.Row, 2).Text
If Z <> "" Then
Dim X As Variant, Y As Variant
X = Application.Match(Z, Munka3.Range("B:B"), 0)
If IsError(X) Then
Y = Application.Match(Z, Munka4.Range("B:B"), 0)
If IsError(Y) Then Y = Application.Match(Z, Munka4.Range("C:C"), 0)
If IsError(Y) Then
KKERES = 0
Exit Function
Else
If Cllr.Column = 5 Then
KKERES = Munka4.Cells(Y, 5).Value
Exit Function
End If
If Cllr.Column = 6 Then
KKERES = Munka4.Cells(Y, 6).Value
Exit Function
End If
End If
Else
If Cllr.Column = 5 Then
KKERES = Munka3.Cells(X, 5).Value
Exit Function
End If
If Cllr.Column = 6 Then
KKERES = Munka3.Cells(X, 6).Value
Exit Function
End If
End If
End If
End If
End Function
az én gépemen (office 2013) látszólag működik, de teszteltem egy office2016-os gépen, és ott sok cellára #ÉRTÉK-et ad vissza meg hibát dob a VB. megnéztem egy office2010-es gépen is, ott is jól működik.
lehet valami O2016-nál ami máshogyan működik mint a korábbi verzióknál?
(sajnos most nincs szabad o2016 gép debuggolni.) -
bsh
addikt
Üdv.
Próbálnék egy olyat megoldani, hogy egy bazihosszú képlet helyett egy rövidebb saját függvényt használni, ami ugyanazt csinálná. Így még pár extra egyszerűsítést is bele tudnék mókolni.
Application.Caller-rel megpróbálnám kiolvasni, hogy hányadik sorból hívódik a képlet (így nem kéne megadni paraméternek semmit)
De random módon olyan hibákat csinál, hogy pl. azt mondja, hogy "Application.WorksheetFunction osztály Match tulajdonsága nem érhető el" (miközben watch szerint elérhető) meg ilyenek...
Ez az Application.Caller-t nem ismerem, gondolom ezzel kell valamit trükközni? Mert magában a funkcióm az működik.Public Function KKERES() As Double
KKERES = 0
If TypeOf Application.Caller Is Range Then
Dim Caller As Range
Set Caller = Application.Caller
Dim Z As String
Z = Munka2.Cells(Caller.Row, 2).Text
If Z <> "" Then
On Error GoTo notfound
X = Caller.Application.WorksheetFunction.Match(Z, Munka3.Range("B:B"), 0)
If IsError(X) Then
Y = Caller.Application.WorksheetFunction.Match(Z, Munka4.Range("B:B"), 0)
If IsError(Y) Then Y = Caller.Application.WorksheetFunction.Match(Z, Munka4.Range("C:C"), 0)
If IsError(Y) Then
On Error GoTo 0
KKERES = 0
Exit Function
Else
On Error GoTo 0
If Caller.Column = 5 Then
KKERES = Munka4.Cells(Y, 5).Value
Exit Function
End If
If Caller.Column = 6 Then
KKERES = Munka4.Cells(Y, 6).Value
Exit Function
End If
End If
Else
On Error GoTo 0
If Caller.Column = 5 Then
KKERES = Munka3.Cells(X, 5).Value
Exit Function
End If
If Caller.Column = 6 Then
KKERES = Munka3.Cells(X, 6).Value
Exit Function
End If
End If
End If
End If
notfound:
End Function -
bsh
addikt
üdv,
lenne egy "érdekes" problémám, hátha valakinek van ötlete. (workaround már van)
céges gépemen írogatok egy raktárkezelőszerűséget komplett excel vba-ban... a gép win7 x64 hun, office 2013. nálam minden remekül működik, és eddig a kollégáknál (akik ezt valójában használják) szintén remekül működik a dolog.
pár hete viszont előjött egy probléma náluk (nekik office 2016 van), amit én nem tudok reprodukálni.
a gond az, hogy egy funkció megnyit egy word dokumentumot a háttérben és abba bevisz adatokat az excel táblázatból, majd feldob egy save as ablakot (majd a fájlt visszalinkeli excelbe hiperhivatkozással).
pár hete a kollégáknál nem jelenik meg a save as ablak, majd az excel kiírja, hogy ole objektumra vár stb stb. ilyenkor a tálcán sem jelenik meg a save as ablak ikonja. de alt+tab-bal váltva az ablakok közt már megjelenik és fut tovább a makró.
kipróbálták az összes gépen, mindenhol ugyanez a hiba, kivéve pont az én gépemet... van egy 100%-ban ugyanilyen másik gép, ugyanaz az office is meg minden, ott se működik. és mint mondtam, csak pár napja, azelőtt működött mindenhol.
na ez mitől lehet vajon? esetleg valami win frissítés .net vagy nemtudom?
a workaround annyi, hogy a save as ablak előtt még egyszer aktiválom a word app-ot (app.activate), akkor rendesen megjelenik az ablak és nincs az ole hibaüzenet sem. -
bsh
addikt
válasz
Delila_1
#35574
üzenetére
de ez egy külön gomb megnyomásakor történik. (és most én is gy csinálom, kényszerűségből)
én pont azt akarom, hogy a refedit_change eventnél egyből validálja a tartalmat és addig a "tovább" gomb inaktív marad, amíg a refedit nem felel meg a feltételeknek. de semmilyen event nem fut le a refediten.
-
bsh
addikt
üdv,
egy makrózott táblázatban kéne olyan nekem, hogy a júzer válasszon ki egy cellát a makró futása közben egy ponthoz elérve. ezt úgy gondoltam megcsinálni, hogy egy userform és rajta egy refedit control, majd refedit_change vagy hasonló event-tel validálom az inputot és addig nem mehet tovább, amíg megfelelő cellát választott ki.
csak az a gond, hogy valamiért a refedit control semmilyen event-je nem működik.
előtte application.enableevents=true -t is próbáltam már, de semmi.
ez mitől lehet? neten keresgéltem, de csak olyanokat találtam, hogy megbízhatatlan az egész refedit control, de hogy ne is működjenek az eventek, olyat még csak nem is említenek sehol. biztos nálam a hiba. -
bsh
addikt
válasz
Fferi50
#34466
üzenetére
tudom hogy kell elmenteni egy fájlt. ez szándékosan van így csinálva, hogy más néven is lehessen menteni, ha nem akarja a user felülírni a fix nevű fájlt. ha nem menti el a user, akkor a mégse-re kattintva megjeleníti az excelt. és nyilván a show-val mutatom meg a dialogot. a kérdés az, miért a háttérben jelenik meg, és hogy tudom előtérbe hozni. appactivate-tel nem megy.
-
bsh
addikt
üdv,
egy másik alkalmazásból generálok (vba) egy nem látható excel táblázatot, majd mikor készen van, feldob egy save as dialogot. ezzel csak az a baj, hogy sokszor a háttérbe dobja fel, és úgy, hogy még csak a tálcán sem jelenik meg mint futó ablak, szóval első ránézésre úgy tűnik, mintha megállt volna az alkalmazésban futó vba makró, pedig valójában csak a save as dialog boxra vár.
erre nem találtam semmi trükköt, amivel előtérbe lehetne hozni a dialogot, anélkül, hogy az excel-t magát megjelenítsem vagy külső library-kat kéne használjak. nem tud valaki valami egyszerű megoldásterre? -
bsh
addikt
üdv,
keresgéltem a neten de nem találtam jó megoldást arra, hogy copy+paste esetén ne csessze szét az excel a feltételes formázási szabályokat és ne hozzon létre új szabályokat minden másolt cellához. tényleg nem lehet ezt valahogy kikapcsolni? -
bsh
addikt
üdv.
kolléganő jelezte, hogy gond van egy felmakrózott excel táblázattal. (office365-ös 2016, magyar.) egy sima szöveget próbált átírni egy cellában, és mikor a fok (°) jelet akarta beírni (alt-gr + 5), akkor "elugrott" a táblázat nézete valahová, a szerkesztőlécről is eltűnt minden, majd mikor próbált entert nyomni vagy bármit, akkor azt írja ki, hogy "Érvénytelen hivatkozás" wtf?, valamint egy beágyazott gomb lesz kijelölve (mintha fejlesztő módban lenne) és a szerkesztőlécen a gomb neve látszik, mint egy képlet, egyenlőségjellel meg minden...
escape-pel lehet csak kilépni.
tovább tesztelve, nem is kell semmit átírni, csak simán altgr+5-öt kell nyomni, és máris megbolondul.
furcsa. megnéztem saját gépemen, office 2013-on, ott tökéletesen működik. néztem egy másik office 2016-on, az is legutolsó build (1611 7571.2025 vagy mi), az is ugyanúgy megbolondul. úgy látom, ez elég friss build, talán mostanában frissítette magát a háttérben a két gép, és ez egy újabb csodálatos bug lenne, mint nemrégiben?
valaki találkozott már ilyennel? már megint downgrade-eljek?
-
bsh
addikt
válasz
dajkapeter
#32092
üzenetére
vlookup, offset
-
bsh
addikt
üdv,
ez miért nem találja meg a keresett értéket aB:Coszlopokban?vv = Application.Match(Trim(Me.Cells(SelectedRow.Row, LZNR)), KLM.Range("B:C"), 0)
haB:B-ben vagyC:C-ben keresem, akkor megtalálja, de ígyB:C-ben nem, pedig elvileg kéne neki, nem?
-
bsh
addikt
válasz
m.zmrzlina
#30392
üzenetére
beírsz a kódba egy olyan sort, hogy "Dim Range" (Range nagy betűvel), ekkor elvileg az editor automatán átváltja nagybetűsre az összes range-et. ezután ki is törölheted a "dim Range" sort. ennyi.
ez a kisbetűsség azért (is) lehet, mert valahol valamikor valamiért akár véletlenül definiáltál egy kisbetűs "range" nevű valamit, ami már lehet azóta nincs is benne a kódban, de még az editor emlékszik rá. ez okozhat problémákat is akár, mert kitudja így most mi az a "range"? (option explicit javasolt)
de ez csak egy tipp, egy próbát megér. -
bsh
addikt
válasz
m.zmrzlina
#30373
üzenetére
azért dobja a hibát, mert a Cells() nincs explicit kvalifikálva (vagy hogy híjják ezt magyarul?), így az az activesheet.cells()-re vonatkozik. magyarán kábé így kell használnod:
Set tartomany = ThisWorkbook.Worksheets(1).range(ThisWorkbook.Worksheets(1).Cells(2, 3), ThisWorkbook.Worksheets(1).Cells(int_usor, int_uoszlop))
a kisbetűs range-re meg írtam már, mit lehet ellene tenni. az nem segített?
-
bsh
addikt
válasz
m.zmrzlina
#30352
üzenetére
set terulet = worksheets(1).range(satöbbi)
a range kisbetűre váltás csak ebben a sorban van vagy mindenütt? esetleg tegyél be egy olyan sort, hogy "Dim Range" (nagybetűvel), és utána töröld ki ezt a sort.
-
bsh
addikt
válasz
[HUN]Tyson
#30338
üzenetére
adatok - rendezés és szűrés - speciális - irányított szűrés
-
bsh
addikt
válasz
Delila_1
#30293
üzenetére
most például az a hiba keletkezett, hogy valamelyik gyökér letörölt két docx template fájlt, amikből az excel makróval fuvarleveleket generálna
dolgozzon ezeknek akinek két anyja van, az 
a két docx template-et be tudom ágyazni excelbe valami ole ojjjektumként és azt megadni template-nek (word.documents.add() eljárással? (gondolom az utóbbi része nem menne)
-
bsh
addikt
válasz
Delila_1
#30290
üzenetére
az a baj ez nem az én fájlom, én nem írok bele adatot meg semmi közöm az egészhez, én csak makrózzam
ráadásul közösen használják, a kollégák állandóan szétcseszik az egészet, átállítják (az általam már előre beállított) formázásokat, meg ilyenek, aztán meg csak jön az opás nekem, mert jönnek nyafogni, hogy nem jó
(illetve sokszor észre sem veszik, hogy nem jó amit gányoltak...) na de hagyjuk... 
-
bsh
addikt
válasz
Delila_1
#30285
üzenetére
vagy például amivel a minap ..optam: egy ilyen megrendelési szám: 302000060500, ezt ugye a nagyonokos excelje tudományos formátumra alakítja, ami nem jó... és hiába állítom át szövegre a cellaformázást, akkor is úgy jelenik meg, egészen addig, amíg nem próbálom meg szerkeszteni. ezért egyéni formátumra "@" kell állítanom minden cellát preventíven, de akkor meg "##########" jelenik meg cella teljes szélességében, és azt írja a tooltip, hogy a "negatív vagy túl hosszú dátumok" így jelennek meg... milyen dátumok könyörgöm, amikor ez egy formázatlan szöveg?!
de legalább másolni jó értéket másol... 
-
bsh
addikt
válasz
velizare
#30227
üzenetére
Application.CommandBars.Item("Workbook tabs").ShowPopup
de szerintem ez használhatatlan, alig látni, az egyszeri user meg lehet észre se veszi, hogy most tőle tulajdonképpen inputot vár a makró, mindenképp át is vált a kiválasztott lapra, satöbbi satöbbi...
én inkább userformmal vagy dialogsheettel csinálnám.
-
bsh
addikt
válasz
velizare
#30222
üzenetére
üdv,
de van, csak kábé használhatatlan (szerintem).
With Application.CommandBars("workbook tabs").Controls(16)
If Right(.Caption, 3) = "..." Then .Execute Else .Parent.ShowPopup
End With
az a baja, hogy csak akkor van tényleges dialog, ha 16-nál több munkalap van, máskülönben csak egy popup jelenik meg, és én még nem bírtam rákényszeríteni sehogy, hogy mindig a teljes dialog jelenjen meg.
szerintem egyszerűbb egy userform és rajta egy listbox. (vagy userform nélküli listbox, ha az is elég) -
bsh
addikt
-
bsh
addikt
üdv!
ha excel vba editorban kikapcsolom a "Microsoft Office 15.0 Object Library" referenciát és csak a "Microsoft Excel 15.0 Object Library"-t hagyom, abból lesz bajom? (nem kell belőle semmi elvileg, és ha ez is fel van véve referenciának, akkor kábé nem tudom használni a vbe-t mert minden kattintásra el akarja indítani az outlookot és annak beállító varázslóját
) -
bsh
addikt
válasz
stivi1g
#29979
üzenetére
és biker:
mindkettőtöknél "rossz helyen" van a kód (vagyis én nem úgy írtam, hogy onnan fusson, mert nem sok értelme lenne ezekben az esetekben). én úgy írtam, hogy az csak az adott munkalapon fusson. a képen bejelöltem, hová kell duplán kattintani (VBA Projekt (fájnév)\Microsoft Excel objects\munkalap_neve) és az úgy megnyíló ablakban legyen a kód. bocs a félreértésért
-
bsh
addikt
válasz
stivi1g
#29969
üzenetére
nekem nem teljesen világos: gondolom a B oszloptól az AF oszlopig január 1-től január 31-ig lennének a dátumok (csak nem látszik), de a tartalék mező csak jan.22-től van? akkor most csak jan22-jan31 közti mezőket vegye figyelembe? vagy a tartalék mezők ki lesznek bővítve? vagy nem tudom...
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
On Error GoTo xit
Set Target = Target.Cells.Item(1)
If Not Intersect(Target, Me.Range("B9:AF500")) Is Nothing Then
If Target = "tartalék" Then
x = WorksheetFunction.Match(Me.Cells(8, Target.Column), Me.Range("AI12:AR12"), 0) - 1
Me.Range("AI12:AI512").Offset(0, x).Find("") = Me.Cells(Target.Row, 1)
End If
End If
xit:
Application.EnableEvents = True
End Sub
ez a teljes(?) dátumtartományban (B-AF oszlopok) "figyel", és az AI12:AR12 cellákban lévő dátumokkal hasonlít össze, ezek persze kiterjeszthetők/lecsökkenthetők. -
bsh
addikt
válasz
Delila_1
#29967
üzenetére
én így oldottam meg:
ez a K oszlop (cikkszám) alapján dolgozik, mivel ahogy látom, a megnevezés (B oszlop) lehet eltérő is ugyanahhoz a cikkszámhoz. (emiatt veszélyes is a makróm, mert törli a sorokat, és a többféle megnevezésekből csak az első marad meg, a többi elvész)
Sub flt()
lastrow = Me.UsedRange.Rows(Me.UsedRange.Rows.Count).Row
Call Me.UsedRange.Sort(Me.Columns("K:K"), xlAscending, Header:=xlYes)
i = 2
While i <= lastrow
o = 1
While Me.Cells(i, 11) = Me.Cells(i + 1, 11)
'kategóriák külön oszlopokba (AE, AF, AG, stb.)
Me.Cells(i, 30 + o) = Me.Cells(i + 1, 30)
'vagy kategóriák AD oszlopba, vesszővel elválasztva
'Me.Cells(i, 30) = Me.Cells(i, 30) & ", " & Me.Cells(i + 1, 30)
Me.Rows(i + 1).Delete
o = o + 1
lastrow = lastrow - 1
Wend
i = i + 1
Wend
End Sub -
bsh
addikt
válasz
lizakattila
#29963
üzenetére
ilyesmi? biztos van egyszerűbb is.
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
For Each Item In Target.Cells
If Item.Column = 15 Then
If Item = "" Then
Cells(Item.Row, 1) = ""
Else
Cells(Item.Row, 1) = Now()
End If
End If
Next
Application.EnableEvents = True
End Sub -
bsh
addikt
válasz
Fire/SOUL/CD
#29822
üzenetére
deeee, van azzal gond... pont azért írtam később, hogy nem kellett volna álmosan "segíteni"
az a feltétel úgy nem elég, gyakorlatilag nem tudsz vele így az utolsó oszlop utánra adatot beírni 
ehelyett
If Cells(Target.Row, Me.Columns.Count).End(xlToLeft).Column > 1 Then
ez valamivel jobb:
If Cells(Target.Row, Me.Columns.Count).End(xlToLeft).Column > Target.Column Then -
bsh
addikt
válasz
Fire/SOUL/CD
#29820
üzenetére
(csak nyilván nem szabad eseményhez rendelni, mert onnantól, amíg a makró fut, nem kell adatot bevinni...)

mentségemre szóljon, hogy az nem is volt feltétel...

-
bsh
addikt
válasz
Terra86
#29812
üzenetére
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Cells(Target.Row, Me.Columns.Count).End(xlToLeft).Column > 1 Then
Call ExtendSelection(Target)
End If
End Sub
Private Sub ExtendSelection(ByVal Target As Range)
Me.Range(Cells(Target.Row, Target.Column), Cells(Target.Row, Cells(Target.Row, Me.Columns.Count).End(xlToLeft).Column)).Select
End Sub -
bsh
addikt
válasz
Sátán44
#29781
üzenetére
valami ilyesmi?
Private Sub Worksheet_Change(ByVal Target As Range)
If (Target.Column > 2) And (Target.Column < 25) And (Target.Row > 2) And (Target.Row < 28) Then
If (XCount(Me.Range(Cells(Target.Row, 3), Cells(Target.Row, 25))) > 2) Or (XCount(Me.Range(Cells(2, Target.Column), Cells(28, Target.Column))) > 2) Then
Target.Value = ""
MsgBox ("Már van két X az adott sorban vagy oszlopban!")
End If
End If
End Sub
Private Function XCount(XRange As Range) As Long
XCount = 0
For Each Cell In XRange
If Cell.Value <> "" Then XCount = XCount + 1
Next
End Function -
bsh
addikt
-
bsh
addikt
válasz
bteebi
#29743
üzenetére
sehol nem írta, hogy "időnként működik". ha névütközések vannak, akkor ez sosem fog működni, mivel le sem fordul úgy a program. ha nincs ütközés, akkor lefordítja és akkor mindig működni is fog.
ebből következően ha más fájlban működik ugyanez a kód, akkor ott abban a fájlban a modul neve nem "valasz". -
bsh
addikt
válasz
coldfirexx
#29736
üzenetére
a modul neve ugyanaz (valasz) mint a változóé.
-
bsh
addikt
válasz
Polllen
#29677
üzenetére
az első sorban a Cells()-ek kontextusa nincs kvalifikálva. helyesen:
Worksheets("Layout").Range(Worksheets("Layout").Cells(1, 1), Worksheets("Layout").Cells(1, wk)).Copy Destination:=Worksheets("Munka2").Range("A1")
hasonlóképpen furcsaságok lehetnek, ha a wk változó sincs az adott kontextusban definiálva.a második verzióban még az eleje is rossz:
Worksheets(ws1).Range(Cells(1, 1), Cells(1, wk)).Copy...
helyesen:
ws1.Range(Cells(1, 1), Cells(1, wk)).Copy... -
bsh
addikt
válasz
Szicskeee
#29656
üzenetére
Sub CommandButton_Szamolj_Click()
Select Case Cells(1, 2).Value
Case 1
Call CommandButton1_Click
Case 2
Call CommandButton2_Click
Case 3
Call CommandButton3_Click
Case 4
Call CommandButton4_Click
'satöbbi...
End Select
End Sub
Sub CommandButton1_Click()
'...
End Sub
Sub CommandButton2_Click()
'...
End Sub
Sub CommandButton3_Click()
'...
End Sub
Sub CommandButton4_Click()
'...
End Sub
'satöbbi... -
bsh
addikt
-
bsh
addikt
válasz
Belnir
#29421
üzenetére
azért az jelentősen más, nem csak amolyan "átírjuk oszt' jóvan"

itt egy ilyen faék megoldás. az egyszerűség kedvéért a log fájlt először külön hozd létre (egy üres excel fájl) és a megfelelő elérési utat írd bele.
Private Sub Workbook_Open()
Call WriteToLog(Application.UserName, "Megnyitás")
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
'Call WriteToLog(Application.UserName, "Bezárás")
End Sub
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
'Call WriteToLog(Application.UserName, Sh.Name & " változtatás")
End Sub
Private Sub WriteToLog(ByVal Who As String, ByVal What As String)
Dim NewXL As New Excel.Application
NewXL.Visible = False
Dim Log As New Excel.Workbook
Set Log = NewXL.Workbooks.Open("Z:\logfájl\elérési\útja\log.xlsx") 'A fájlt először kézzel hozd létre!
Dim LastRow As Long
LastRow = Log.ActiveSheet.Cells(Log.ActiveSheet.Rows.Count, 1).End(xlUp).Row
Log.ActiveSheet.Cells(LastRow + 1, 1) = Format(Now, "YYYY.MM.DD hh:mm:ss")
Log.ActiveSheet.Cells(LastRow + 1, 2) = Who
Log.ActiveSheet.Cells(LastRow + 1, 3) = What
Log.Save
Log.Close
Set Log = Nothing
Set NewXL = Nothing
End Sub -
-
bsh
addikt
válasz
Delila_1
#29406
üzenetére
miért van annyi képlet? ezt kérdezd attól, aki a táblázatot csinálta
gondolom fogott egy képletet és autofillel lerántotta a végtelenbe és tovább, hogy "biztosamibiztos" 
de a ctrl+end az működik ezeken a táblázatokon rendesen, az utolsó értéket tartalmazó sorra (és oszlopra) ugrik, képlettől függetlenül. ezt kéne valahogy kihasználnom vba-ból.a "táblázattá alakítás" az egy teljesen másik projekt, semmi köze nincs a lastrow-os dologhoz, sőt az excelhez sincs egyáltalán semmi köze. és kimaradt egy lényeges sor a kódból, mert figyelmetlenül másoltam be:
For Y = 1 To RefDocs.Count
Call CreateRow(Y)
FrmTáblázat.Frame1.ScrollHeight = FrmTáblázat.Frame1.ScrollHeight + RowHeight
Next Y
és a rowheight az egy konstans.
de a lényeg, hogy szerintem meg van adva a userform mérete is, na.
az event kezelés csak arra kellene (de végülis nem életbevágó), hogy csak azokat az értékeket kelljen visszaírni a megfelelő ojjektumokba, amiket megváltoztat a user (vagy a makró, lehet teszek bele ilyen autocorrect funkciót). nekem annyi elég lenne, hogy ha egy (közös, many-to-one) combobox_change event lenne, ami tudná a változott "cella" nevét (amiből én tudom, hogy azt hová kell majd visszaírni) és mondjuk az adott *box .tag-jét beállítom "changed"-re, onnan már sima ügy. -
bsh
addikt
válasz
Delila_1
#29404
üzenetére
nem, azzal azzal megtalálja az utolsó értéket tartalmazó cellát a megadott oszlopban. csak ugye nem tudok egy konkrét oszlopot megadni, mert nem biztos, hogy ténylegesen mindig az az oszlop lesz a "leghosszabb".
de mondjuk az is lehet, hogy pont abban a két oszlopban amivel próbáltam, abban nem volt húszmillió képlet
-
bsh
addikt
válasz
Delila_1
#29402
üzenetére
ez nem jó, mert ha pl. képletek vannak a cellákban (de értékek nélkül), akkor azt így is beleveszi az usedrange-be.
így van a form generálva:
Load FrmTáblázat
FrmTáblázat.Frame1.Caption = "blahblahblah"
FrmTáblázat.Frame1.Left = 3
FrmTáblázat.Frame1.Top = 2
FrmTáblázat.Frame1.Width = 1100
FrmTáblázat.Frame1.Height = 20 + 20 * RowHeight
FrmTáblázat.Frame1.ScrollHeight = 7
FrmTáblázat.Height = FrmTáblázat.Frame1.Height + 70
FrmTáblázat.Width = FrmTáblázat.Frame1.Width + 10
For Y = 1 To RefDocs.Count
Call CreateRow(Y)
'itt az adatok kitöltése
Next Y
If Y < 20 Then
FrmTáblázat.Frame1.ScrollBars = fmScrollBarsNone
Else
FrmTáblázat.Frame1.ScrollBars = fmScrollBarsVertical
End If
FrmTáblázat.Show
End Subés minden sor minden egyes textboxa pedig így: (combobox tökugyanez, csak ott még a választható értékek feltöltése is benne van, +3 sor)
Private Sub CreateTextBox(ByVal Y As Integer, ByVal Name As String, ByVal L As Long, ByVal W As Long)
Set newTB = FrmTáblázat.Frame1.Controls.Add("Forms.TextBox.1", CStr(Y) & Name, False)
newTB.Width = W
newTB.Height = RowHeight
newTB.Top = (Y - 1) * RowHeight + 6
newTB.Left = L
newTB.SelectionMargin = False
newTB.AutoSize = False
newTB.Font.Name = FntName
newTB.Font.Size = FntSize
newTB.SpecialEffect = fmButtonEffectFlat
newTB.BorderStyle = fmBorderStyleSingle
newTB.Visible = True
Set newTB = Nothing
End Sub -
bsh
addikt
válasz
Delila_1
#29395
üzenetére
akartam írni, hogy ez egy szép kis képlet lesz, de megelőztél
ha gyakran kell, akkor én ilyesmire inkább írnék egy saját függvényt:
Public Function TextSplit(TString As String, Delim As String, Pos As Integer) As String
TextSplit = Split(TString, Delim)(Pos)
End Function
'Használata: =TextSplit(A1;":";2) -
bsh
addikt
válasz
Belnir
#29382
üzenetére
túlbonyolítod. excelben le lehet simán védeni jelszóval a lapot módosítások ellen, vagy akár az egész munkafüzetet is.
de makróval is megoldható, csak ugye a makrók letilthatóak...én mondtam, hogy sokkal egyzserűbb egy külön logfájlba menteni a megnyitásokat/mentéseket/akármiket.

-
bsh
addikt
válasz
Delila_1
#29375
üzenetére
az eredeti kérdés csak a megtekintés (megnyitás) volt.
de én is kérdeznék, sőt kettőt is:
az első az erről a lastrow-ról jut eszembe, egy feladatnál kell nekem ilyen, de ez az egyszerű megoldás nem jó, mert nem feltétlen vannak minden oszlopban kitöltve a mezők, nincs olyan oszlop, amit hasznáhatnék az range-hez, mert lehet, hogy van annál hosszabb oszlop is. viszont a ctrl+end az rendesen a legutolsó sor legutolsó oszlopra ugrik. ezt nem lehet valahogy meghívni közvetlenül? vagy erre nincs valami gyors megoldás? (ha végignézem egyesével az oszlopokat, hogy melyik a leghosszabb, az nem elég gyors)a másik nekem bonyolultabb:
még a tegnap írt problémás userform-hoz jó lenne "cella"-szintű event handling. ezt én a kis egyszerű tudatlan fejemmel úgy képzeltem el, hogy "definiálok" egy saját combobox (és ugyanígy textbox) objektumtípust egy class modulban:
Class1:
public withevents eComboBox as ComboBoxés a kódban, ami generálja a userform-ban a "cellákat" ezt használnám a sima msforms.combobox helyett:
newCB = userform.frame.controls.add("msforms.combobox.1", név, true)
helyett:
newCB = userform.frame.controls.add("class1.ecombobox", név, true)persze ha ez működne akkor nem kérdezném, hogyan kell...

próbáltam úgy is, hogy ez előtt a sor előtt explicit megadom a newCB típusát:
dim newCB as class1.ecomboboxde én sajnos ezekhez már nem értek.
találtam rá pár hasonló példát google-ben, de azokat sem bírtam értelmezni illetve nem működnek. szóval kis segítséget kérnék. 
-
bsh
addikt
válasz
poffsoft
#29356
üzenetére
most ezt úgy kérdezem, hogy ekcellhez nem értek, meg nem is próbálom ki mert őőőő ezer a dolgom
de ez hogyan is akar működni? bezárás előtt beleír a táblázatba, amitől az megváltozik. ilyenkor nem ajánlja fel a mentést az ekcszell? mert akkor megint ment, de ugye aftershave megint beleír, amitől megint nem tudod bezárni, goto 10, nem?
-
bsh
addikt
válasz
Belnir
#29332
üzenetére
kód a ThisWorkbook-ba:
Private Sub Workbook_Open()
On Error GoTo xit
Set FSO = CreateObject("Scripting.FileSystemObject")
Set Logfile = FSO.OpenTextFile("Z:\ez\valami\szerveren\legyen\logfile.log", 8, True)
Logfile.WriteLine (Format(Now, "YYYY.MM.DD hh:mm:ss") & " - " & Application.UserName)
Logfile.Close
Set Logfile = Nothing
Set FSO = Nothing
xit:
End Sub -
bsh
addikt
üdv,
megint nem exceles kérdés, de hátha a vba profik tudnának segíteni:
van egy dinamikusan generált userform, amiben egy amolyan táblázatszerűséget generálok textbox és listbox elemekből. minden TB és LB generáláskor megadom minden elemnek a magasságát (=sormagasság), szélességét, autosize=false, font.name és font.size (ezeket is már csak kínomban), az elemek top pozíciója pedig sor_száma*sormagasság képlettel.
mégis ahogy a képen látszik, néhol kicsit szétcsúsznak a sorok, és a betűméret sem mindenhol egyforma, hiába van beállítva. ezek mitől lehetnek? már nincs ötletem. -
bsh
addikt
üdv,
egy excelben lévő combobox-nál fillrange-nek egy egy névkezelőben megadott nevet adtam meg, ami egy másik excel táblázatra mutató adatkapcsolat. beállítottam, hogy a fájl megnyitásakor frissítse a kapcsolatot (erre rá is kérdez megnyitáskor). de a comboboxban nem jelennek meg a listában az értékek, csak akkor, ha előzőleg külön megnyitom a másik táblázatot. szóval nem működik az adatkapcsolat, vagy csak comboboxban nem lehet használni nevesített adatkapcsolást? -
bsh
addikt
válasz
kispéé
#29021
üzenetére
a ThisWorkbook-ba másoltad be a kódot? akkor elvileg automatikusan futnia kell, amint megváltozik a kijelölés.
tehát ha a Munka1 nevű sheeten az A oszlop egyik elemére kattintasz, akkor egyből átugrik a Munka2 nevű sheeten a G oszlop megfelelő elemére, vagy ha Munka2-n a G oszlop egyik elemére kattintasz, akkor átugrik Munka1 A oszlop megfelelő elemére. (nyilván az Munka1!A és Munka2!G oszlopokban legyenek értékek, én pl. egyikbe 1-től 50-ig felvettem értékeket, másikba meg 50-től 1-ig.) -
bsh
addikt
válasz
kispéé
#29017
üzenetére
másik verzió:
(feltételezi, hogy egy workbookban van a két táblázat: Munka1 és Munka2)Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
Select Case Target.Worksheet.Name
Case "Munka1"
If Target.Column = 1 Then
On Error Resume Next
If Not Worksheets.Item("Munka2") Is Nothing Then
On Error GoTo 0
With Worksheets.Item("Munka2")
Set X = .Range("G:G").Find(Target.Value, lookat:=xlWhole)
If Not X Is Nothing Then
Application.EnableEvents = False
Application.Goto .Cells(X.Row, X.Column)
Application.EnableEvents = True
End If
End With
End If
On Error GoTo 0
End If
Case "Munka2"
If Target.Column = 7 Then
On Error Resume Next
If Not Worksheets.Item("Munka1") Is Nothing Then
On Error GoTo 0
With Worksheets.Item("Munka1")
Set X = .Range("A:A").Find(Target.Value, lookat:=xlWhole)
If Not X Is Nothing Then
Application.EnableEvents = False
Application.Goto .Cells(X.Row, X.Column)
Application.EnableEvents = True
End If
End With
End If
On Error GoTo 0
End If
End Select
End Sub -
bsh
addikt
makróval?
Private Sub ize()
i = 1
c = 1
While c <> Selection.Rows.Count - 1
For s = c To Selection.Rows.Count - 1
If (Abs(Selection.Cells(c, 2).Value - Selection.Cells(s + 1, 2).Value) < 50) And (Abs(Selection.Cells(c, 3).Value - Selection.Cells(s + 1, 3).Value) < 50) Then
Cells(i, 4).Value = Selection.Cells(c, 1).Value
Cells(i, 5).Value = Selection.Cells(s + 1, 1).Value
i = i + 1
End If
Next s
c = c + 1
Wend
End Sub
(futtatás előtt ki kell jelölni az adatterületet, pl. A2
6, és a D és E oszlopba fogja gyűjteni a közel eső párokat) -
bsh
addikt
-
bsh
addikt
válasz
Delila_1
#28421
üzenetére
nem ez a gond, de köszi az infót: nem tudtam, hogy már létrehozáskor lehet a workbooknak fájlnevet adni. (emiatt mentem saveas-szel a fájlt), de ha ez így is működik, akkor egyszerűsödik kicsit a kódom.
közben úgy néz ki megtaláltam a hibát (ahogy éreztem) és a megoldást:
.Range(Cells(1, 1), Cells(s, o)).BorderAround Weight:=xlMedium, ColorIndex:=xlColorIndexAutomatichelyett:
.Range(ExcelWS.Cells(1, 1), ExcelWS.Cells(s, o)).BorderAround Weight:=xlMedium, ColorIndex:=xlColorIndexAutomatictehát a Cells-nél meg kell adni az excelws ojjektumot. (esetleg oda is tehetek excelws helyett pontot? mindjárt kipróbálom)
ezzel úgy néz ki tökéletesen működik, és az excel process is mindig bezáródik.
legalábbis eddig. 
-
bsh
addikt
válasz
Delila_1
#28407
üzenetére
megpróbáltam, de nem jó úgy sem.
de már eleve miért fut hibára? nem kéne neki. hacsak nem a .range.... egy előző futáskor keletkező ojjektum ami valamiért megmarad, és arra a nem létező ojjektumra akarna bordert rakni.
ez a hiba: "runtime error 1004: method 'Selection' of object '_Global' failed." nem értem, milyen selection method, nincs is olyan (hacsak nem a range egyben selection is), de főleg az object "_Global" a sokatmondó: ezek szerint nem az excel worksheet-en akar valamit csinálni?
-
bsh
addikt
üdv,
lenne egy VBA-s problémám, van benne excel is de nem hiszem, hogy szorosan excelhez kapcsolódik, inkább csak simán láma vagyok VBA-ban
szóval ez egy vba script lenne autodesk inventorhoz, amit úgy működne, hogy az épp megnyitott rajzon többféle dolgot megcsinál ha lefuttatják, ezek egyike a problémás. (a "többféle dolog" szubrutinok meghívását jelenti, ez az egyik.)
ez annyit csinálna, hogy ha van a rajzon darabjegyzék, akkor azt átmásolná excel-be, némi formázást is raktam rá, hogy csini legyen, aztán menti.
itt egy kódrészlet.
az 51-es sorral van a gond. de szerintem nem magával azzal a sorral van a baj (mert az működik - lásd később), hanem inkább a létrehozott objektumok scope-jával.
ugyanis a következőt csinálja: több rajzon egymás után lefuttatva tökéletesen működik, egészen addig, amíg egy olyan rajzon fut le, ahol már létezik az xls fájl. ekkor mentéskor felajánlja, hogy felülírja-e (ez így jó is) és minden rendben. viszont, a következő rajzon lefuttatva már hibákat dob az 51-es sornál. ha kihagyom a sort (vagy on error resume next), akkor pedig látszólag bezárja a végén az excel-t ahogy kell, viszont ott marad az excel process. innentől már mindig hibázni fog és nem működik rendesen, akkor sem, ha kilövöm a létrehozott excel processeket.
a hibák amiket dobál, pölö: runtime error 438: object doesn't support this property or method.
aztán volt 462 is (valami remote server or application...)
meg 1004 is.én valami context változásra gyanakszom onnantól, hogy felül kell írnia egy létező fájlt, és innentől egy nem létező objektumon akarja a range-tes sort futtatni, meg egy nem létező excel appot akar bezárni? de nekem ezek már magasak sajnos.

valaki segítene? thx.
Új hozzászólás Aktív témák
- Horgász topik
- Xiaomi 15T Pro - a téma nincs lezárva
- One otthoni szolgáltatások (TV, internet, telefon)
- Kuponkunyeráló
- sziku69: Fűzzük össze a szavakat :)
- Milyen autót vegyek?
- AliExpress tapasztalatok
- Epic Store Ünnepi Ajándékozás - 7. nap: The Callisto Protocol
- gban: Ingyen kellene, de tegnapra
- Ingatlanos topic!
- További aktív témák...
Állásajánlatok
Cég: BroadBit Hungary Kft.
Város: Budakeszi
Cég: Laptopszaki Kft.
Város: Budapest










az a feltétel úgy nem elég, gyakorlatilag nem tudsz vele így az utolsó oszlop utánra adatot beírni
de ez hogyan is akar működni? bezárás előtt beleír a táblázatba, amitől az megváltozik. ilyenkor nem ajánlja fel a mentést az ekcszell? mert akkor megint ment, de ugye afters
6, és a D és E oszlopba fogja gyűjteni a közel eső párokat)


