Telefonszámunk: 1-472-0679

Hozzászólás: Cella lekérdezés adott időszakra, eredmény összehasonlítása más értékkel

Kezdőlap Fórumok Excel témák Cella lekérdezés adott időszakra, eredmény összehasonlítása más értékkel Hozzászólás: Cella lekérdezés adott időszakra, eredmény összehasonlítása más értékkel

#3414
rick
Felhasználó
    Sub test()
     
    Dim MyRnd1 As Double
     
    MyRnd1 = Int((999 - 1 + 1) * Rnd + 1)
    MsgBox MyRnd1
    MsgBox Replace(TimeValue(Now), ":", "")
     
    End Sub
     
    Sub Main()
     
    'last update 2017.feb.28 - gege - initial version
     
    ' cső Norbi!
    ' a makrót többféleképpen is lehet futtatni, pl. altf + F8 --> kiválasztod a "main" nevűt --> run. Vagy beleteszed a kurzort ide a makró szövegébe és F5-öt nyomsz, vagy a play gombot.
    ' Javaslom, hogy az adatot amin futtatni akarod a makrót, másold egy új, külön xls-be (vagy másold ebbe az adatot, az is jó)
    ' a fájl kiterjesztésének xlsm-nek kell hogy legyen, ha makrót akarsz belerakni (vagy xls, de az csak 256 oszlopos, az nem lesz neked elég; szóval save as xlsm)
    ' első munkalapra menjen a shift plan
    ' másodikra a requestek
    ' a makró kidob egy új munkalapot a harmadik helyre, a lap nevének a vége egy generált érték (hogy ne egyezzen a neve esetleg korábbi futtatások kimenetével)
    ' nyugodtan nézd át a makrót, írogass át benne amit akarsz
    ' mindenképp az A1 cellában kezdődjön az adat (fejléc az első sor, aztán adat a másodiktól)
    ' a munkalapokon ne legyen más csak az adat és ne legyenek üres sorok, cellák ha lehet (legalábbis az első oszlopban semmiképp)
    'jelenleg ha hétvégét is belevéve kért valaki szabadságot vagy táppénzt, azt nem egyezőnek veszi a makró, de odaíratom vele a kimenethez hogy az adott nap hétvége
    ' figyelem: a makró csak azt nézi, hogy az adott requestben kért dolgok benn vannak-e shift planben. Azt nem nézi, hogy van-e shift planben pl. betegség vagy vacation amire nem volt request!
    '           ha azt is meg kéne nézni, azt majd megcsinálom, de egyelőre nem fog az agyam. valszeg azt más logikával kéne leprogramozni :D (most eszembe jutott hogy lehetne, leírom ide ha kell:
    '                   egy tömbben eltárolni az összes request dátumát és a nevet akihez tartozik,
    '                   majd a végén átnézni hogy van-e olyan név/dátum páros a shift planben ami sick vagy vacation, de nem volt rá request
    ' kérlek teszteld és ha van benne hiba, vagy más funkciót szeretnél belerakni akkor szólj. Holnap HO-ban vagyok, tudok majd vele foglalkozni kicsit.
     
    Dim MyWb As Workbook
    Dim MainWs As Worksheet 'shift plan
    Dim ReqWs As Worksheet 'requests
    Dim OutWs As Worksheet 'output goes here
    Dim MyRnd As Double
    Dim MyCell As Range 'variable for looping
    Dim MyCell_2 As Range 'another variable for looping
    Dim MyRow As Long
    Dim MyCol As Long
     
    'variables for shiftplan
    Dim sTopLeft As Range 'first name's position on the top left of the shift plan (for defining the position of the requests table)
    Dim sLr As Long 'last row with data
    Dim sLc As Long 'last column with data
    Dim sMainRange As Range 'all the data in the shiftplan
    Dim sType As String
    'variables for requests
    Dim rTopLeft As Range 'first request's left cell (for defining the position of the requests table)
    Dim rRange As Range 'all requests
    Dim rName As String
    Dim rTypeLong As String
    Dim rType As String
    Dim rDateStart As Long
    Dim rDateEnd As Long
    Dim rDateArray() As Long
    Dim rLr As Long 'last row with data
    Dim i As Long
    Dim j As Long
     
    Set MyWb = ThisWorkbook
    Set MainWs = MyWb.Sheets(1) 'can be defined with name as well, for example Set MainWs = MyWb.Sheets("Shitftplan")
    Set ReqWs = MyWb.Sheets(2) 'can be defined with name as well, for example Set ReqWs = MyWb.Sheets("Requests")
    Set OutWs = MyWb.Sheets.Add(, ReqWs)
    'MyRnd = Int((998 - 1 + 1) * Rnd + 1)
    OutWs.Name = "Results_" & Replace(TimeValue(Now), ":", "")
     
    'CURRENTLY THIS ONLY WORKS IF TOP LEFT IS A1, sorry...
    Set sTopLeft = MainWs.Range("A1")
    Set rTopLeft = ReqWs.Range("A1")
     
    rLr = ReqWs.Cells(ReqWs.Rows.Count, rTopLeft.Column).End(xlUp).Row
    sLr = MainWs.Cells(MainWs.Rows.Count, sTopLeft.Column).End(xlUp).Row
    sLc = MainWs.Cells(sTopLeft.Row, MainWs.Columns.Count).End(xlToLeft).Column
    Set sMainRange = MainWs.Range(sTopLeft, MainWs.Cells(sLr, sLc))
    OutWs.Range("A1:F1").Value = Array("name", "date", "shitfplan_value", "request_value", "is_weekend", "comment")
     
    'HORRIBLE HACK
    Call Replace_dates(MainWs.Range(MainWs.Range("B1"), MainWs.Cells(1, sLc)))
     
    'loop through requests and put values into variables
    For Each MyCell In ReqWs.Range(rTopLeft.Offset(1, 0), ReqWs.Cells(rLr, rTopLeft.Column))
        rName = MyCell.Value
        rTypeLong = MyCell.Offset(0, 1).Value
            Select Case rTypeLong
    '            Case "Morning": rType = "A"
    '            Case "Afternoon": rType = "B"
    '            Case "Night": rType = "C"
    '            Case "Office": rType = "D"    ''' commented out because only sick / vacation requests are possible
                Case "Sick": rType = "X"
                Case "sick": rType = "X"
                Case "Holiday": rType = "V"
                Case "holiday": rType = "V"
                Case "Vacation": rType = "V"
                Case "vacation": rType = "V"
                Case Else: rType = "undefined"
            End Select
        rDateStart = CLng(DateValue(MyCell.Offset(0, 2).Value))
        rDateEnd = CLng(DateValue(MyCell.Offset(0, 3).Value))
        rDateArray = fillDates(rDateStart, rDateEnd)
       
        'let's find the name row from the request in the shiftplan
        MyRow = Application.WorksheetFunction.Match(rName, sMainRange.Columns(1), 0)
        'check each date and output if there is discrepancy
        For i = LBound(rDateArray) To UBound(rDateArray)
            MyCol = Application.WorksheetFunction.Match(rDateArray(i), sMainRange.Rows(1), 0)
            sType = MainWs.Cells(MyRow, MyCol).Value
            If sType <> rType Then
                With OutWs.Cells(j + 2, 1)
                    .Value = rName
                    .Offset(0, 1).Value = rDateArray(i)
                    .Offset(0, 1).NumberFormat = "yyyy-mm-dd"
                    .Offset(0, 2).Value = sType
                    .Offset(0, 3).Value = rType
                    If Application.Weekday(rDateArray(i), 2) >= 6 Then .Offset(0, 4).Value = "WEEKEND"
                    .Offset(0, 5).Value = "Request was from " & CDate(rDateStart) & " to " & CDate(rDateEnd)
                End With
                j = j + 1
            End If
        Next i
    Next
     
    'some formatting, add more if you want
    OutWs.Columns.AutoFit
     
     
     
    'terv: ciklus menjen végig a requesteken
    '       ciklus menjen végig a dátum intervallumokon, tegye be egy tömbbe (név, requesttype, dátumok)
    '       kimenet is kerüljön be egy tömbbe
    '       kimenetet tegye ki egy külön munkanapra (név, dátum, requesttype shitfplanről, ezzel nem egyező request érték)
    End Sub
     
    Sub Replace_dates(dRange As Range)
    'horrible hack to make my match function work
    'replace all dates in row 1 to integer numbers
    Dim Rng As Range
     
    For Each Rng In dRange
        Rng.Value = CLng(DateValue(Rng.Value))
    Next
     
    End Sub
     
    Function fillDates(ByVal StartDate As Long, ByVal EndDate As Long) As Variant
    'partially taken from http://stackoverflow.com/questions/29102506/get-all-dates-between-2-dates-in-vba
     
        Dim varDates()      As Long
        Dim lngDateCounter  As Long
     
        ReDim varDates(0 To EndDate - StartDate)
     
        For lngDateCounter = LBound(varDates) To UBound(varDates)
            varDates(lngDateCounter) = StartDate
            StartDate = StartDate + 1
        Next lngDateCounter
     
        fillDates = varDates
     
    ClearMemory:
        If IsArray(varDates) Then Erase varDates
        lngDateCounter = Empty
     
    End Function