Çalışan Sayısına Göre Yaklaşık Olarak Dağıtma

  • Konuyu başlatan Konuyu başlatan Hadihatu
  • Başlangıç tarihi Başlangıç tarihi
Durum
Üzgünüz bu konu cevaplar için kapatılmıştır...
Katılım
20 Haz 2022
Mesajlar
6
Excel Versiyonu
Excel 2016
Excel Sürümü
64 Bit
Excel Dili
Türkçe
Merhabalar,

Benim Excel’de yapmak istediğim ancak kafayı yediğim bir problemim var,

şöyle ki bir Masa yapmak için 346 dakika zamana ihtiyaç var. Ancak bu Masayı birçok kişi birlikte yapıyor her isin yapılış zamanı ayrı ayrı hazırlanmış.

örneğin 3 kişi yapacak ise 346/3=115,3 dakika lazım her bir çalışan için, yalnız iş parçalarının zamanları farklı olduğundan herkese 115,3 verme şansımız yok.

Birinci kişi: 107.2 dakika

İkinci kişi : 126 dakika

Üçüncü kişi: 112,8 dakika olacak şekilde Excel kendisi otomatik olarak bölsün

Eğer çalışan sayısı azalıp yada çoğalırsa o zamanda çalışan sayısına göre dağıtacak yaklaşık olarak

Sira NOVARDIYA ACIKLAMAZamanKim yapacakKac Kisi yapacak
3​
Toplam Zaman346Dakika
1​
yapilan is-1
12​
2​
yapilan is-2
14,2​
AliOrtalama
115,3​
Dakika
3​
yapilan is-3
7​
Veli
4​
yapilan is-4
31,4​
Selami
5​
yapilan is-5
26​
6​
yapilan is-6
17​
7​
yapilan is-7
34​
8​
yapilan is-8
38​
9​
yapilan is-9
39​
10​
yapilan is-10
12,4​
11​
yapilan is-11
23​
12​
yapilan is-12
12​
13​
yapilan is-13
6​
14​
yapilan is-14
17​
15​
yapilan is-15
14​
16​
yapilan is-16
21​
17​
yapilan is-17
9​
18​
yapilan is-18
13​
 
Çözüm
Merhabalar Excel 365 kullanıcısı olduğunuz için bende formüllü alternatif sunayım. E3 e aşağıdaki formülü yazıp aşağıya sürüklerseniz dinamik hale gelir tablonuza alta isim ekledikçe otomatik hesaplamalar dahil edilir. Dosyanız ektedir. İncelersiniz.

Kod:
=ÇAPRAZARA(I$3*SATIR(A1);ETOPLA(KAYDIR($B$2;;;SIRALI(BAĞ_DEĞ_SAY($B$2:$B$19)));"<>");ETOPLA(KAYDIR($B$2;;;SIRALI(BAĞ_DEĞ_SAY($B$2:$B$19)));"<>");;-1)-TOPLA(E$2:E2)
aşağıdaki kod işinize yarayabilir
kendi çalışmanıza uyarlamalısınız
sayfa7: verilerin olduğu sayfa
CSS:
Sub HesaplaDz()

dzSure = Sayfa7.Range("C3:C20").Value2 '<--- Bu alan sürelerin olduğu aralık, diziye aktarılır

Sayfa7.Range("k6:k8") = 0 '<--- Bu alan kişiye göre sürelerin toplamının yazılacağı aralık önce 0'a eşitlenir
dzDk = Sayfa7.Range("k6:k8").Value2   '<--- Bu kısımda başlangıçta herkese 0dk verilir
For x = 1 To UBound(dzSure)
    dzSureSr = Application.WorksheetFunction.Max(dzSure) 'maximum iş zamanı bulunur
    indXdzSure = WorksheetFunction.Match(dzSureSr, dzSure, 0)'maximum iş zamanı kaçıncı satırda
 
    dzDkSr = Application.WorksheetFunction.Min(dzDk)'en az iş yapan kişi bulunur
    inxDzDk = WorksheetFunction.Match(dzDkSr, dzDk, 0)
 
    dzDk(inxDzDk, 1) = dzDk(inxDzDk, 1) + dzSure(indXdzSure, 1)'en az iş yapana en çok süre eklenir
    dzSure(indXdzSure, 1) = 0'en uzun iş zamanı sıfırlanır ki sıradaki dağıtımda elensin
Next
Sayfa7.Range("K6").Resize(UBound(dzDk), 1) = dzDk

End Sub
 
Merhabalar Excel 365 kullanıcısı olduğunuz için bende formüllü alternatif sunayım. E3 e aşağıdaki formülü yazıp aşağıya sürüklerseniz dinamik hale gelir tablonuza alta isim ekledikçe otomatik hesaplamalar dahil edilir. Dosyanız ektedir. İncelersiniz.

Kod:
=ÇAPRAZARA(I$3*SATIR(A1);ETOPLA(KAYDIR($B$2;;;SIRALI(BAĞ_DEĞ_SAY($B$2:$B$19)));"<>");ETOPLA(KAYDIR($B$2;;;SIRALI(BAĞ_DEĞ_SAY($B$2:$B$19)));"<>");;-1)-TOPLA(E$2:E2)
 

Ekli dosyalar

Çözüm
aşağıda 2 farklı yöntem daha var istenirse işe kişi de atanabiliyor
kişiye atanan işleri ve kişinin toplam iş yükü süresini gösterir
SCSS:
Sub HesaplaDz()
Set dcIs = CreateObject("Scripting.Dictionary")
 Set Syf = ThisWorkbook.Worksheets("Sayfa3")
With Syf
     ZmnSonStr = .Cells(.Rows.Count, 2).End(xlUp).Row
     KsiSonStr = .Cells(.Rows.Count, 5).End(xlUp).Row
                 .Range("G3:G" & KsiSonStr) = 0 '<--- Bu alan kişiye göre sürelerin toplamının yazılacağı aralık önce 0'a eşitlenir
          dzDk = .Range("G3:G" & KsiSonStr).Value2 '<--- Bu kısımda başlangıçta herkese 0dk verilir
        dzSure = .Range("B2:B" & ZmnSonStr).Value2 '<--- Bu alan sürelerin olduğu aralık, diziye aktarılır
          dzIs = .Range("A2:A" & ZmnSonStr).Value2
End With

For x = 1 To UBound(dzSure)
     dzSureSr = Application.WorksheetFunction.Max(dzSure) 'maximum iş zamanı bulunur
   indXdzSure = WorksheetFunction.Match(dzSureSr, dzSure, 0) 'maximum iş zamanı kaçıncı satırda

       dzDkSr = Application.WorksheetFunction.Min(dzDk) 'en az iş yapan kişi bulunur
      inxDzDk = WorksheetFunction.Match(dzDkSr, dzDk, 0)
                    
                    dcIs(inxDzDk) = dcIs(inxDzDk) & "|" & dzIs(indXdzSure, 1)
        dzDk(inxDzDk, 1) = dzDk(inxDzDk, 1) + dzSure(indXdzSure, 1) 'en az iş yapana en çok süre eklenir
    dzSure(indXdzSure, 1) = 0 'en uzun iş zamanı sıfırlanır ki sıradaki dağıtımda elensin
Next
Syf.Range("G3").Resize(UBound(dzDk), 1) = dzDk
Syf.Range("J3").Resize(UBound(dzDk), 1) = WorksheetFunction.Transpose(dcIs.Items) ' dcIs.Items

Syf.Range("J3").Resize(UBound(dzDk), 1).TextToColumns Destination:=Range("K3"), DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, Other:=True, OtherChar _
        :="|", FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, _
        1)), TrailingMinusNumbers:=True

Syf.Range("J3").Resize(UBound(dzDk), 1).ClearContents
End Sub
Kişinin iş yükü süresini ve işe atanan kişileri gösterir
SCSS:
Sub DagitDz()
 Set Syf = ThisWorkbook.Worksheets("Sayfa3")
With Syf
     ZmnSonStr = .Cells(.Rows.Count, 2).End(xlUp).Row
     KsiSonStr = .Cells(.Rows.Count, 5).End(xlUp).Row
                 .Range("G3:G" & KsiSonStr) = 0    '<--- Bu alan kişiye göre sürelerin toplamının yazılacağı aralık önce 0'a eşitlenir
          dzKs = .Range("F3:G" & KsiSonStr).Value2
          dzDk = .Range("G3:G" & KsiSonStr).Value2 '<--- Bu kısımda başlangıçta herkese 0dk verilir
        dzSure = .Range("B2:B" & ZmnSonStr).Value2 '<--- Bu alan sürelerin olduğu aralık, diziye aktarılır
          dzIs = .Range("A2:C" & ZmnSonStr).Value2
End With

For x = 1 To UBound(dzSure)
     dzSureSr = Application.WorksheetFunction.Max(dzSure) '<--- maximum iş zamanı bulunur
   indXdzSure = WorksheetFunction.Match(dzSureSr, dzSure, 0) '<--- maximum iş zamanı kaçıncı satırda
[ATTACH type="full"]5223[/ATTACH]
       dzDkSr = Application.WorksheetFunction.Min(dzDk) '<--- en az iş yapan kişi bulunur
      inxDzDk = WorksheetFunction.Match(dzDkSr, dzDk, 0)
    
     dzIs(indXdzSure, 3) = dzKs(inxDzDk, 1)
        dzDk(inxDzDk, 1) = dzDk(inxDzDk, 1) + dzSure(indXdzSure, 1) '<--- en az iş yapana en çok süre eklenir
   dzSure(indXdzSure, 1) = 0 '<--- en uzun iş zamanı sıfırlanır ki sıradaki dağıtımda elensin
Next
Syf.Range("G3").Resize(UBound(dzDk), 1) = dzDk
Syf.Range("A2:C" & ZmnSonStr) = dzIs
End Sub
SCSS:
 

Ekli dosyalar

maalsef bir hata yapmışım son satır bulma kodu olan :
KsiSonStr = .Cells(.Rows.Count, 5).End(xlUp).Row kodundaki bu kısım hatalı 5 yani E sütunu olmayacak 6 yani F sütunu olmalı ilgili satır aşağıdaki gibi düzenlenmeli
KsiSonStr = .Cells(.Rows.Count, 6).End(xlUp).Row
 
Durum
Üzgünüz bu konu cevaplar için kapatılmıştır...
Benzer Konular Popüler İçerikler Daha Fazlası
Geri
Üst Alt