Keresés

Új hozzászólás Aktív témák

  • Mutt

    senior tag

    válasz Owlet #53480 üzenetére

    Szia,

    ...munkafüzet online térben közös használattal lesz feltöltve... ez a részt mit jelent? Sharepoint/OneDrive vagy a shared folder?

    A weben (Sharepoint/OneDrive) a VBA nem műkődik, helyette van az Office Script (csak olyan munkahelyi licensz esetén ahol ezt az admin engedélyezte). Office Scriptben nincs lehetőség aktuális felhasználó beazonosítására, amit ki lehet próbálni hogy felugró ablakban bekérni a felhasználót és azzal tovább menni.

    Ha shared folderben van a fájl, akkor műkődik a VBA, de nagy az esély ilyenkor az adatvesztésre/hibás fájlra.

    Alternatív lehetőségek:
    1) Esetleg amit lehetne tenni, hogy mindenkinek külön fájlja van és Power Query-vel egyesíteni lehet őket.
    2) Microsoft Forms használata (ha van licensz).
    3) Harmadik opció ha mindegyik felhasználó tud emailt küldeni, akkor küldhetnek egy emailt (pl. elég ha a tárgyba beleteszik honnan dolgoznak, a többi jön a feladóból és email dátumából). Ezt lehet Power Query-vel vagy azonnal Power Automate-el összesíteni egy fájlba (utóbbi megint licensztől függ).

    üdv

  • Fferi50

    Topikgazda

    válasz Owlet #53480 üzenetére

    Szia!
    Elviekben:
    Az Application.Username visszaadja annak a felhasználónak a Windows nevét, aki éppen használja a munkafüzetet. Az első sorban levő neveket ehhez kell hasonlítani úgy, hogy a cella értékéből elhagyod az utolsó 6 karaktert. Így megkapod azt az oszlopot, amit felszabadíthatsz.
    Alapesetben a munkalapnak zároltnak kell lennie, hogy a korlátozások érvényesülhessenek. Viszont a zárolást közös használat esetén úgy emlékszem nem lehet feloldani csak kizárólagos megnyitással.
    Úgy gondolom mégis inkább a szerkeszthető terület megadása lesz a megoldás, amit előre definiálhatsz és hozzárendelhetsz a Windows userhez. Ezt utána az Excel maga ellenőrzi, a munkalap azon területeit, amelyeket szerkeszteni lehet, a hozzárendelésnél fel kell szabadítani, majd az egész munkalapot zárolni.
    Üdv.

  • Mutt

    senior tag

    válasz Owlet #53134 üzenetére

    Szia,

    Neked kell sorba rendezni a dátumokat, erre van több megoldás is. A QuickSort elég gyors nagyobb adatsoron is.

    Én még annyit kavartam, hogy ha előfordulnának ismétlődő szabad dátumok, akkor azt egy collection-el előbb kiszűrtem.

    Private Sub FillDates2()
    Dim ws As Worksheet
    Dim cell As Range
    Dim greenColor As Long
    greenColor = RGB(0, 204, 102)

    Set ws = ThisWorkbook.Sheets("2025")

    Dim datumokColl As New Collection 'collection esetén csak egyedi értékek maradnak meg
    Dim datumokArr() 'majd ebbe a tömbbe másoljuk át a kapott értékeket
    Dim c As Long

    On Error Resume Next 'collection leáll ha duplikáció van, így átugorjuk ezt
    For Each cell In ws.UsedRange
    If cell.Interior.Color = greenColor And IsDate(cell.Value) Then
    datumokColl.Add cell.Value, CStr(cell.Value)
    End If
    Next cell
    On Error GoTo 0

    'ha van szabad dátum akkor lehet tovább menni
    If datumokColl.Count > 0 Then

    'a szabad dátumokat egy tömbbe kell másolni, létrehozzuk a megfelelõ méretû tömböt
    ReDim datumokArr(1 To datumokColl.Count)

    'átmásoljuk a collection tartalmát a tömbbe
    For c = 1 To datumokColl.Count
    datumokArr(c) = datumokColl(c)
    Next c

    'növekvõ sorba rendezzük a dátumokat
    Call QuickSort(datumokArr, 1, datumokColl.Count)

    'comboxhoz adjuk a dátumokat
    For c = 1 To UBound(datumokArr)
    Me.ErkezesiDatum.AddItem Format(datumokArr(c), "yyyy.mm.dd")
    Me.TavozasiDatum.AddItem Format(datumokArr(c), "yyyy.mm.dd")
    Next c

    End If

    End Sub

    'https://stackoverflow.com/questions/152319/vba-array-sort-function
    Public Sub QuickSort(vArray As Variant, inLow As Long, inHi As Long)
    Dim pivot As Variant
    Dim tmpSwap As Variant
    Dim tmpLow As Long
    Dim tmpHi As Long

    tmpLow = inLow
    tmpHi = inHi

    pivot = vArray((inLow + inHi) \ 2)

    While (tmpLow <= tmpHi)
    While (vArray(tmpLow) < pivot And tmpLow < inHi)
    tmpLow = tmpLow + 1
    Wend

    While (pivot < vArray(tmpHi) And tmpHi > inLow)
    tmpHi = tmpHi - 1
    Wend

    If (tmpLow <= tmpHi) Then
    tmpSwap = vArray(tmpLow)
    vArray(tmpLow) = vArray(tmpHi)
    vArray(tmpHi) = tmpSwap
    tmpLow = tmpLow + 1
    tmpHi = tmpHi - 1
    End If
    Wend

    If (inLow < tmpHi) Then QuickSort vArray, inLow, tmpHi
    If (tmpLow < inHi) Then QuickSort vArray, tmpLow, inHi
    End Sub

    üdv

  • Delila_1

    veterán

    válasz Owlet #53134 üzenetére

    A For Each a tartomány első során halad és vizsgál balról jobbra, majd veszi a következő sort. Ha ez nem felel meg, akkor 2 For-Next ciklust vegyél fel, az első az oszlopokon, majd azon belül a sorokon haladjon.

Új hozzászólás Aktív témák

Hirdetés