- Apple iPhone 16 Pro - rutinvizsga
- Az Oppo Find X8 Ultra lett a legvékonyabb kameramobil
- Milyen okostelefont vegyek?
- Vivo X200 Pro - a kétszázát!
- Fotók, videók mobillal
- Szerkesztett és makrofotók mobillal
- Magisk
- Xiaomi 14T Pro - teljes a család?
- Megérkezett a Pixel 5 és 4a 5G
- Motorola Edge 40 neo - színre és formára
-
Mobilarena
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
-
-
Fferi50
Topikgazda
válasz
mulli86 #44095 üzenetére
Szia!
Próbáld ki ezt a makrót légy szíves:Sub rendezo()
Dim sh1 As Worksheet, sh2 As Worksheet, cl As Range, cl2 As Range, xo As Byte, xu As Long, sh3 As Worksheet, x As Integer, oszlop, drb As Long, ido As Date
Application.ScreenUpdating = False
Set sh1 = Sheets("hiba_kod")
Set sh2 = Munka2 'Most ez az adatok munkalapja Névvel is hivatkozhatsz rá, nekem túl hosszú volt.
Set sh3 = Worksheets.Add(after:=Sheets(1))
sh3.Name = "hiba"
sh3.Cells(1, 1).Value = "Teszt"
xu = 3: xo = sh2.UsedRange.Rows(5).Columns.Count
sh2.UsedRange.Rows(5).Copy Destination:=sh3.Cells(2, 1)
ido = Time()
For Each cl In sh1.UsedRange.Rows(1).Cells ' a hiba-kódok listája
Application.StatusBar = cl.Value
oszlop = Application.Match(cl.Value, sh2.Rows(5), 0)'melyik oszlopban van?
If Not IsError(oszlop) Then
x = 1 'végig megyünk a hibakódok értékein
Do
drb = Application.CountIf(sh2.Columns(oszlop), cl.Offset(x, 0)) 'hány hibás tétel van
Set cl2 = sh2.Cells(1, oszlop)
Do While drb > 0
Set cl2 = sh2.UsedRange.Columns(oszlop).Find(what:=cl.Offset(x, 0).Value, LookIn:=xlValues, Lookat:=xlWhole, after:=cl2)
If Not cl2 Is Nothing Then
If sh2.Cells(cl2.Row, xo + 2).Value <> "x" Then 'ha még nincs másolva
sh2.UsedRange.Rows(cl2.Row).Copy Destination:=sh3.Range("A" & xu) 'másoljuk
sh2.Cells(cl2.Row, xo + 2).Value = "x" 'és jelöljük a másolást
xu = xu + 1
End If
drb = drb - 1
End If
Loop
x = x + 1
Loop While cl.Offset(x, 0) <> ""
End If
DoEvents
Next
Application.ScreenUpdating = True
Application.StatusBar = False
MsgBox "Futási idő indulás: " & Format(ido, "hh:mm:ss") & " vége:" & Format(Time(), "hh:mm:ss")
End Sub
Mit csinál?
A hiba-kod munkalapon levő kódokon megy végig. Megszámolja, hogy az adatok között az adott oszlopban hány hibás tétel fordul elő. Ezeket átmásolja. Mivel egy sorban több hiba is lehet, a duplázás elkerülése érdekében az átmásolt sor végére tesz egy x-et.
A végén pedig kiírja, mikor indult és mikor fejezte be.
Ha túl hosszúra nyúlna az idő akkor Ctrl+Break megállítja (ezért van benne a DoEvents sor. Ekkor az éppen aktuális sornál megáll. Meg lehet nézni az eredményt és leállítani vagy folytatni, ahogyan éppen szeretnéd.
Remélem, nem lesz túl lassú.
Ha ismételten tesztelsz, ne felejtsd el az x-es oszlopot törölni!
Üdv. -
Mutt
senior tag
válasz
mulli86 #44069 üzenetére
Szia,
A feltett fájlt megnézve makró mentesen Power Query-vel simán megoldható.
Importálni kell a hibakódokat és a CSV fájlt, majd annyiszor kell lekérdezések összefűzését használni ahány oszlopban akarod a hibakódot keresni. Kibontás és utána egy egyéni oszlopban megnézni, hogy hány esetben lett az eredmény üres (null). Ahol csak null volt azok hibamentes sorok vagyis dobhatók és a maradékot lehet betölteni egy új munkalapra.
Kb. 30 perc alatt megvan a Power Query aki jártas már benne és utána újrahasznosítható más fájlokkal.
Természetesen a Power Query-t tanulni kell, ami idő, de Youtube-on van jó sok segítség.4 oszlop csekkolása kb. így néz ki.
üdv
-
Fferi50
Topikgazda
válasz
mulli86 #44067 üzenetére
Szia!
"Temélem érthető voltam"
Majdnem...
Tehát
1. A hiba-kód munkalapon levő hibakódokat kell keresni a hibalistában (adatállományban)
2. Az hiba-kód munkalapon a hibakód oszlopában kell megkeresni az adatállományban az adott hibakódhoz tartozó értéket - ha benn van, akkor át kell tenni a hibalistára, ha nincs, akkor nem.
3. A hiba-kód munkalapon nem megtalálható hibakódokkal nem kell foglalkozni.
Pl.
ECP_block_Error
0b00
0b01
0b11
Ha az adatállomány x. sorában az ECP_block_Error cellában a fenti 3 érték valamelyike van, akkor megy a hibalistába, egyébként nem.
Jól gondolom?
Üdv. -
Fferi50
Topikgazda
-
Mutt
senior tag
válasz
mulli86 #44058 üzenetére
Szia,
1. lastsor típusa Long legyen, mert az integer csak 32 ezer sorral fog bírni.
2. A hibaname és oszlopnumber a két for cikluson belül van inicilaziálva ami nem jó, hozd ki őket a for-ok elé.
3. Variant a hibaname típusa, de közben a cella értékét ellenőrzöd. Jobb lenne egy specifikus típust használnod pl. Double ha számok érdekelnek, vagy String ha szöveg.
4. Ha sokat dolgozol egy lapon akkor érdemes With ... End With-et használnod.
pl.With Worksheets(1)
lastsor = .Range("A5").End(xlDown).Row
For x ...
For y ...
hibaname = .Cells(5, y)
For p ...
If hibaname = Sheets(3).Cells(1,p) then
....
End If
Next p
Next y
Next x
End With5. A GoTo rész biztos hogy kell? Miért nem teszed az IF-be az ottani dolgokat?
6. Sokat gyorsít a "villódzás" kikapcsolása.
Application.ScreenUpdating = False a for ciklusok elé, majd = True a legvégén.üdv
-
Fferi50
Topikgazda
válasz
mulli86 #44060 üzenetére
Szia!
Fel kell tenni valahova - pl. googlemaps, Data.hu, stb. -, ide pedig a linket.
Az biztos, hogy a lastsor deklarációd nem jó. Az integer típus az csak 32767-ig terjedhet.
Helyette a Long adattípust kell használni.
"Átmásolt 97 sort a 100-ból, pedig nem is szerepelnek benne olyan értékek, amikre keresek."
Nyilván nem egészen korrekt a feltételek ellenőrzése. Vagy a makró szerkezete. Nem egészséges ugrásokat használni.
Üdv. -
Mutt
senior tag
válasz
mulli86 #43960 üzenetére
Szia,
.. több csv (excel alapú) adatbázist. 59 excel, excelenként változó mennyiségű sor, az oszlopok száma megegyezik és az oszlopokon belül található attribútumok is.
Ha Excel 2010 vagy frissebbed van, akkor Power Query fog tudni neked segíteni.
Youtube-on van pár video róla, pl. több fájl fedolgozása.Ha kell segítség a feladathoz dobd fel a fórumra.
üdv
-
bteebi
veterán
válasz
mulli86 #21240 üzenetére
Törölni kell az üres (y) értékekhez tartozó adatcellák (x) értékét. Vegyük úgy, hogy az A sorban vannak az x értékek, a B-ben pedig az y értékek. Ez a makró megoldja a gondot:
Sub diagram()
Dim sor As Long, usor As Long
usor = Range("A" & Rows.Count).End(xlUp).Row
For sor = 1 To usor
If Range("B" & sor) = "" Then
Range("A" & sor) = ""
End If
Next sor
End SubAnnyi, hogy csak akkor működik, ha már ábrázoltad a diagramot, mivel ha az ábrázolás előtt futtatod le, akkor nem lesz egybefüggő az ábrázolandó tartomány, több tartományt pedig (tudtommal) nem tudsz egyben ábrázolni. Ha esetleg valamiért a jövőben még szükséged lenne az üres y értékekhez tartalmazó x értékekre, akkor (a fenti példánál maradva) érdemes az A oszlopot átmásolnod a B-be, elkészíteni a diagramot a B és a C oszloppal, majd a B oszlopon elvégezni a szűrést a makróval.
-
Delila_1
veterán
Új hozzászólás Aktív témák
Hirdetés
- sziku69: Fűzzük össze a szavakat :)
- sziku69: Szólánc.
- Luck Dragon: Asszociációs játék. :)
- Vicces képek
- Kevesebb dolgozó kell az Amazonnak, AI veszi át a rutinfeladatokat
- Tőzsde és gazdaság
- Autós topik
- One otthoni szolgáltatások (TV, internet, telefon)
- Apple iPhone 16 Pro - rutinvizsga
- Videós, mozgóképes topik
- További aktív témák...
- REFURBISHED - HP USB-C Universal Dock G1 docking station (DisplayLink)
- Azonnali készpénzes Sony Playstation 5 lemezes és digitális felvásárlás személyesen/csomagküldéssel
- Keresem : Lenovo Legion 5 16IRX9 83DG0037HV
- BESZÁMÍTÁS! MSI B450M R7 2700X 32GB DDR4 512GB SSD RTX 3050 8GB Rampage SHIVA Thermaltake 500W
- Csere-Beszámítás! Számítógép PC Játékra! Intel I7 6700/ RX 580 8GB / 32GB DDR4 / 500GB SSD
Állásajánlatok
Cég: CAMERA-PRO Hungary Kft
Város: Budapest
Cég: PC Trade Systems Kft.
Város: Szeged