Keresés

Részletes keresés

wawabagus Creative Commons License 2010.11.26 0 0 13461

Sziasztok!

 

SQL Kérdés és boraka köszi a segítséget!!!

Tök jó így...kijavítottam és már szuperul működik.

 

 

De én egyszerűen nem értem a logikáját az excelnek.

 

Ha ez a kód normálisan működik:

 

    Workbooks(1).Activate
    Cells.Select
    Selection.validation.Delete

 

Akkor a for next ciklusban azért nem működik, mert szintén nem biztos hogy mindenhol van validációs lista?

 

Ha nincs, akkor nem tud törölni?

 

 

 

SQLkerdes Creative Commons License 2010.11.26 0 0 13460

Most vagy nem ugyanarról a kódról beszélünk vagy valami gond van a kognitív funkcióimmal...

 

Szerintem nem keresi meg a következő P-s cellát, csak elugrik 7 cella távolságra és megpillantja, hogy az P-e.

Előzmény: Delila10 (13458)
SQLkerdes Creative Commons License 2010.11.26 0 0 13459

De lefuttattam, csak nem számítógépen, hanem fejben ;-)

Csak egymagos processzora van, de azért bírja a bizalmamat  :-))

Előzmény: Delila10 (13457)
Delila10 Creative Commons License 2010.11.26 0 0 13458

Az eredeti kérdés  "A célja, hogy lelellenőrizze, hogy az adott dolgozónál két pihenő közt nem telik el 6 napnál több."

 

Itt nincs szó üres, és nem üres cellákról. A makróm nem is figyeli, csak azt, hogy az egymást követő, "P" tartalmú cellák között hány nem "P"-s cella van.

Előzmény: SQLkerdes (13456)
Delila10 Creative Commons License 2010.11.26 0 0 13457

Nem próbáltátok ki az én makrómat (#13438)? Mármint Te és Boraka. 

Előzmény: SQLkerdes (13453)
SQLkerdes Creative Commons License 2010.11.26 0 0 13456

Én is ezt mondom.

 

Ha jól olvasom a kódot, akkor nem ellenőrzi, hogy van-e más P 7 távolságon belül, illetve nem ellenőrzi, hogy ha a 7 távolságra lévő cella üres akkor van-e távolabb P-s cella.

Az első esetben nem kell pirosítani, a másodikban igen.

A kód viszont az első esetben pirosít, a másodikban nem.

 

Előzmény: Delila10 (13454)
Törölt nick Creative Commons License 2010.11.26 0 0 13455

Igen, igazad van, ez így nem jó.

Előzmény: SQLkerdes (13453)
Delila10 Creative Commons License 2010.11.26 0 0 13454

Mi van, ha a (target.row,i+3)-ik cella is "P"? Akkor nem kell színezni.

 

Szerintem a "P" betűk a pihenő napot jelentik, és a színezés azért kell, mert nem szabad 2 pihenő nap között 6-nál több napon dolgoztatni a munkavállalókat.

Előzmény: Törölt nick (13446)
SQLkerdes Creative Commons License 2010.11.26 0 0 13453

Vagy nagyon elnézek valamit, vagy amit csinál az az, hogy megnézi egy cella tartalmát és ha az P ÉS a tőle 7 cellára levő cella tartalma is P akkor a kettő között pirosít.

Amit én mondok az az, hogy ha egy cella tartalma P és a tőle 7 cellára eső cella tartalma üres, de a nyolcadik cella P, akkor a fenti IF hamisra értékelődik ki, pedig a két P-s cella közötti távolság nagyobb mint 6.

 

Vagy.  A1=P,  C1=P és G1=P

Bár itt két szomszédos P közötti távolság sem nagyobb hatnál, de az A1 ellenőrzésekor (tartalma P= true) ellenőrzi a G1-et is (tartalma P= true), látszólag megfelel a kódba épített tesztnek, de mégsem olyan eset amit keresünk.

 

Én egy Do While-lal megkeresném a vizsgált cella utáni első P-s cellát és összehasonlítanám az oszlopszámukat.

Előzmény: Törölt nick (13450)
Törölt nick Creative Commons License 2010.11.26 0 0 13452

Próbáld meg így kikapcsolni a szűrőt:

 

' ha a munkalapon az autoszűrő aktív

If ActiveSheet.AutoFilterMode = True Then ActiveSheet.AutoFilterMode = False

Előzmény: wawabagus (13447)
SQLkerdes Creative Commons License 2010.11.26 0 0 13451

Ehelyett:

 

  'Delete hidden sheets
        a = 1
        While a <= Worksheets.Count
        If Not Worksheets(a).Visible Then
        Worksheets(a).Delete
        Else
        a = a + 1
        End If
        Wend

 

Próbált meg ezt:

 

a kód elejére tedd ezt:

 

Dim WS as worksheet

 

utána az a=1 és az azt követő rész helyére (Wend-del bezárólag)

 

For each ws in workbooks(i).worksheets

if not ws.visible then ws.delete

next

 

Ciklusba nem csak számokat lehet tenni, hanem object-eket is, profibb és gyorsabb (pld nem kell minden iterációnál összeszámolnia a sheet-eket).

Előzmény: wawabagus (13447)
Törölt nick Creative Commons License 2010.11.26 0 0 13450

"Azt kellene leellenőrizni, hogy "P" és "P"-t tartalamzó cellák közti cellák száma nem több 6-nál. Amennyiben több jelölje ki a két "P" közti cellákat pirosal."

 

Szerintem ezt csinálja. 

Előzmény: SQLkerdes (13448)
SQLkerdes Creative Commons License 2010.11.26 0 0 13449

Hát ilyennek oka lehet pld ha nem is volt ott filter

Előzmény: wawabagus (13447)
SQLkerdes Creative Commons License 2010.11.26 0 0 13448

Tuti, hogy ez jó?

Mert úgy tűnik, mintha a konkrét cellától számított 7. cella tartalmát nézni, holott ha pld. a 8. cella "P" de a hetedik üres, akkor is pirosítani kell.

Előzmény: Törölt nick (13446)
wawabagus Creative Commons License 2010.11.26 0 0 13447

Fárszthatlak benneteket még egyszer? /és nem utoljára?

Az alsó kódban minden működik kivéve a banális filter show all, ami normál makróban működik, de ebben  a környezetben nem...

 

WHY?????????????

 

Db = Workbooks.Count
Dim ws As Worksheet

For i = 3 To Db

    Workbooks(i).Activate
    'Delete hidden sheets
        a = 1
        While a <= Worksheets.Count
        If Not Worksheets(a).Visible Then
        Worksheets(a).Delete
        Else
        a = a + 1
        End If
        Wend
        
     'Delete filter
    Workbooks(i).Sheets(1).Activate
    ActiveSheet.ShowAllData
    
    Workbooks(i).Sheets(1).UsedRange.Copy
             
    Workbooks("Trackcode merge template.xls").Activate
    Sheets("Combine").Select
    usor = ActiveSheet.UsedRange.Rows.Count
    Cells(usor + 1, 1).Select
    
    Selection.PasteSpecial Paste:=xlPasteColumnWidths, Operation:=xlNone, _
    SkipBlanks:=False, Transpose:=False
    ActiveSheet.Paste
Next i

A baja:

 

Törölt nick Creative Commons License 2010.11.26 0 0 13446

No, akkor íme egy másik megoldási javaslat:

 

Private Sub Worksheet_Change(ByVal Target As Range)
Dim i As Integer
Dim meddig As Integer

 

  meddig = Cells(Target.Row, Columns.Count).End(xlToLeft).Column 'oszlopok száma az aktuális sor értékei alapján
 
  Range("A" & Target.Row).EntireRow.Interior.ColorIndex = xlNone
   
  For i = 1 To meddig
    If UCase(Cells(Target.Row, i)) = "P" And _
       UCase(Cells(Target.Row, i + 7)) = "P" Then
      Range(Cells(Target.Row, i), Cells(Target.Row, i + 7)).Interior.ColorIndex = 3
    End If
  Next i
 
End Sub

Előzmény: Delila10 (13438)
Törölt nick Creative Commons License 2010.11.26 0 0 13445

használtok vmilyen ERP-t? (SAP R/3, MS Navision, SAP SBO, stb...

Törölt nick Creative Commons License 2010.11.26 0 0 13444

Ja! Nem csak Ő nevezte "P"-nek az egyszerűség kedvéért?

Előzmény: SQLkerdes (13442)
Delila10 Creative Commons License 2010.11.26 0 0 13443

Megint javítanom kell magamat. Az elejére beírandó sor Cells().Interior.ColorIndex = xlNone, lemaradt a másolás elejéről a Cells()  :(

 

SQL: üres cellák esetén is színez a makró.

Előzmény: Delila10 (13440)
SQLkerdes Creative Commons License 2010.11.26 0 0 13442

Nem lesz egy komplex file :-)

P betük egy sorban köztük néhány üres cella.

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

küldd el a file-t. Tetszik a feladat, de így látatlanba...

Előzmény: MixM (13426)
Delila10 Creative Commons License 2010.11.26 0 0 13440

Az elejére érdemes betenni az  Interior.ColorIndex = xlNone sort.

 

Valószínűnek tartom, ha MixM kipirosított területet talál, átírja a P-t közelebbi cellába, és akkor töröltetni kell a kiabáló háttérszínt. 

Előzmény: Delila10 (13438)
Törölt nick Creative Commons License 2010.11.26 0 0 13439

hé, az tök barátságos, mosolyagtam amikor írtam csak az nem látszott :)

Előzmény: Or Kán (13434)
Delila10 Creative Commons License 2010.11.26 0 0 13438

Biztos én csinálok valamit rosszul, de ezek a képletek nem jöttek össze nekem. Írtam helyette egy makrót, ami a lapon lévő összes sort, és oszlopot vizsgálja, a "P"-k közötti cellák hátterét pirosra váltja, amennyiben a a darabszámuk eléri, vagy meghaladja a 6-ot.

 

Sub mm()
    Dim oszlop As Integer, uoszlop As Integer, sor As Integer, usor As Integer
    Dim kezd As Integer, veg As Integer, t As Boolean
    
    uoszlop = ActiveSheet.UsedRange.Columns.Count
    usor = ActiveSheet.UsedRange.Rows.Count
    
    For sor = 1 To usor
        For oszlop = 1 To uoszlop
            If Cells(sor, oszlop) = "P" And t = False Then
                kezd = oszlop
                t = 1
                GoTo Kov
            End If
            
            If Cells(sor, oszlop) = "P" And t = True Then
                veg = oszlop
                If veg - 1 - kezd > 5 Then
                    Range(Cells(sor, kezd + 1), Cells(sor, veg - 1)).Interior.ColorIndex = 3
                End If
                kezd = veg
            End If
Kov:
        Next oszlop
    Next sor
End Sub

Előzmény: SQLkerdes (13436)
wawabagus Creative Commons License 2010.11.26 0 0 13437

Na ne mááá :-)...

 

Én mindig is szerettem ide járni, pont mert mindenki tök normális és segítőkész. /ellentétben pl az access forummal, ahol már annyi idióta okostojással találkoztam/.

 

Hát pont azért van ez a fórum, hogy segítséget lehessen kérni, nem?

 

Mindenki jól jár :-), aki kérdez és aki válaszol.

 

Nem tudom, hogy az itt feltett kérdéseim alapján ez mennyire hihető, de a cégünkön belül /200ember :-), engem képzelnek az

"excel" szakértőnek. Ha kérdésük van mindig hozzám jönnek, főleg hogy tanfolyamot is csináltam az embereknek.

 

És én ezt konkrétan tök szeretem, mert pl:

1. nagyon okosnak érzem olyankor magam :-))), hogy mindent meg tudok oldani /majdnem :-d/

2. mindig tanulok valami újat

3. tök jó érzés, hogy meg tudom valakinek könnyíteni az életét

4. a hülye monoton feladataim mellett kifejezettem éhezek apró/ vagy nem apró kihívásokra

 

Szóval mardjon szerintem minden a régiben, ahogy eddig...mindig mindenki segítőkész volt és jófej :-)))

 

 

 

SQLkerdes Creative Commons License 2010.11.26 0 0 13436

Ugyanez másként:

 

=(MIN(IF(A1:$Q1="p",COLUMN(A1:$Q1),1000))-MAX(--($A1:A1="p")*COLUMN($A1:A1))-1>6)

Előzmény: SQLkerdes (13435)
SQLkerdes Creative Commons License 2010.11.26 0 0 13435

Ugyan már, most ez komoly?

 

Nem kell itt villongásokba átcsapni.

 

 

Inkább írjatok jobb megoldást, mint amit én itt javasolok:

 

=(MATCH("p",A1:$Q$1,0)+COLUMN(A1)-1-LOOKUP("p",$A$1:A1,COLUMN($A$1:A1))-1>6)

 

ezt a képletet kell használni a Conditional Formattingban, egyéb tudnivalók:

 

- a képlet feltételezi, hogy a kiértékelendő elemek az 1. sorban vannak

- a Conditional Formatting indításánál az A oszlopból (A1) kiindulva formázunk

- a kiértékelés a Q1 celláig működik, ha ennél nagyobb a kiértékelendő terület, akkor a képlet $Q$1 részét megfelelően ki kell cserélni, pld $AA$1-re

Or Kán Creative Commons License 2010.11.26 0 0 13434

Ha már elkezdted...

 

Ennél a hozzászólásnál miért nem volt problémád a nem barátságos hangnemmel?

 

http://forum.index.hu/Article/jumpTree?a=105148072&t=9009340

Előzmény: Delila10 (13433)
Delila10 Creative Commons License 2010.11.26 0 0 13433

De, azt hiszem, igen. Más fórumoktól csak a jót vegyük át, itt maradjon meg az eddigi barátságos, segítőkész szellem.

 

Nem érdemes ezt tovább ragozni.

Előzmény: Or Kán (13432)
Or Kán Creative Commons License 2010.11.26 0 0 13432

A sok kaptafa között a megoldást nem találtad véletlenül meg?

Előzmény: Delila10 (13431)

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