Çözüldü Hücre Boşsa Gruptan Birini Random Yazdır

ekrmy

Site Üyesi
Excel Versiyonu
Excel 2016
Excel Sürümü
64 Bit
Excel Dili
Türkçe
Merhabalar,

Aldığımız Data'da kayıtlar kullanıcılara atanmayabiliyor. Kullanıcı bölümü boş kalıyor. Örnek bir dosya oluşturdum.

  • B sütunu kaydın hangi kullanıcı tarafından kontrol edileceğini ifade etmektedir.
    • Ataması yapılmamış kaydın kullanıcı kısmı boş gelmektedir.
    • Amaç boş hücreleri random ilgili ekipteki (Grup) kişilere atamak. Liste'de kullanıcıların hangi grupta olduğu belirtilmiştir.
Rastgele formülü ile uğraşsam da yapamadım. Destek olursanız çok sevinirim.

İyi çalışmalar.
 

Ekli dosyalar

@ekrmy

-- UZAY ve ROBOT ibareleri KOD'da da kullanıldı.
VBA ekranında CTRL+H ile bunları gerçek belgedeki verilerle değiştirin.

-- Benzer değişiklik Çalışan Listesi sayfasındaki E sütununda yer alan ÖZET BİLGİ sütunundaki formülde de yapıldı.
Bu formüldeki UZAY ve ROBOT ibarelerini de benzer şekilde, gerçek verilerdeki ibarelerle değiştirin.

-- Hem TEMİZLE, hem de DAĞITIM makrosunda DEĞİŞİKLİKler mevcut.

Çalışan Kişiler sayfasında bir GRUP için SEGMENTerden biri var diğeri yoksa
ilgili GRUP dikkate alınarak, BOŞ olanlardan yine DENGELİ olarak dağıtım yapılır.

Belgedeki kodlar aşağıda gösterildi.

VBA:
Sub DENGELI_DAGITIM_FINAL()
Set t = ThisWorkbook.Sheets("ANA DATA"): Set c = ThisWorkbook.Sheets("Çalışan Listesi")
Application.ScreenUpdating = False: Application.Calculation = xlCalculationManual
If t.AutoFilterMode Then t.AutoFilterMode = False
If c.AutoFilterMode Then c.AutoFilterMode = False
ason = t.Cells(Rows.Count, 1).End(3).Row: cs = c.Cells(Rows.Count, 2).End(3).Row
t.[BA:BB].Insert: c.[BA:BA].Insert
TEMIZLE
On Error GoTo 10
c.Range("BA2:BA" & cs).Formula = "=IF(D2<>"""",D2,IF(SUMPRODUCT(($C$2:$C$" & cs & "=C2)*($D$2:$D$" & cs & _
    "=""Uzay""))=0,""Uzay"",IF(SUMPRODUCT(($C$2:$C$" & cs & "=C2)*($D$2:$D$" & cs & "=""Robot""))=0,""Robot"","""")))"
c.Range("BA2:BA" & cs).Calculate: c.Range("BA2:BA" & cs).Value = c.Range("BA2:BA" & cs).Value
For s = 2 To ason
    If t.Cells(s, 8) <> "" Then
        t.Cells(s, 34) = t.Cells(s, 8)
        t.Cells(s, 53) = t.Cells(s, 32) & "|" & t.Cells(s, 33) & "|" & t.Cells(s, 8)
    End If
Next
For s = 2 To ason
    If t.Cells(s, 34) = "" Then
        x = Evaluate("=SUMPRODUCT(--('Çalışan Listesi'!C2:C" & cs & "&""|""&'Çalışan Listesi'!BA2:BA" & _
                                        cs & "='ANA DATA'!AF" & s & "&""|""&'ANA DATA'!AG" & s & "))")
        If x > 0 Then
            say = say + 1: t.[BB:BB].ClearContents: t.[BB1] = t.Cells(s, 32) & "|" & t.Cells(s, 33)
            For sss = 2 To ason
                If t.Cells(sss, 34) <> "" Then _
                    t.Cells(sss, 53) = t.Cells(sss, 32) & "|" & t.Cells(sss, 33) & "|" & t.Cells(sss, 34)
            Next
            For ss = 2 To cs
                If c.Cells(ss, 3) & "|" & c.Cells(ss, 53) = t.[BB1] Then
                    ara = c.Cells(ss, 3) & "|" & c.Cells(ss, 53) & "|" & c.Cells(ss, 2)
                    adet = WorksheetFunction.CountIf(t.[BA:BA], ara)
                    Randomize: XD = Rnd(): If XD = 0 Then XD = 3 / 10
                    t.Cells(ss, 54) = adet + XD / 100
                End If
            Next:
            t.Cells(s, 34) = c.Cells(WorksheetFunction.Match(WorksheetFunction.Small(t.[BB:BB], 1), t.[BB:BB], 0), 2)
        End If: End If:: Next
10: t.[BA:BB].Delete: c.[BA:BA].Delete
Application.ScreenUpdating = True: Application.Calculation = xlCalculationAutomatic
If say > 0 Then MsgBox "İşlem tamamlandı..", vbInformation, "::.. Ömer BARAN ..::"
If say = 0 Then MsgBox "İşlem YAPILAMADI..", vbCritical, "::.. Ömer BARAN ..::"
End Sub

Sub TEMIZLE()
Application.ScreenUpdating = True: Application.Calculation = xlCalculationAutomatic
Sheets("ANA DATA").Range("AH2:AH" & Rows.Count).ClearContents
If Sheets("ANA DATA").[BB1] <> "" Then Sheets("ANA DATA").[BA:BB].Delete
If Sheets("Çalışan Listesi").[BA2].Value <> "" Then Sheets("Çalışan Listesi").[BA:BA].Delete
End Sub
.
Üsdat teşekkür ederim emekleriniz için, kaçırdığım/atladığım birşey mi oldu acaba aynı şekilde sorun devam ediyor :)
 

Ekli dosyalar

@ekrmy
Bundan önceki cevabımda hedef, Çalışan Listesi sayfasında SEGMENT bilgisi olmayanların da dağıtıma dahil olmasına yönelikti.
Çünkü sorunuzu öyle anlamıştım ve Çalışan Listesi sayfasında son iki satırda bu bilgiler yok idi.

Her neyse, gerek yukarıdaki gibi bir durum ve gerekse de eklediğiniz son belgedeki isteklerin tümünü karşıladığını düşündüğüm belgeniz ekte.
Denersiniz. Umarım tamamlanmıştır.

Gerçek belgenizde UZAY ve ROBOT ibarelerinden farklı ibareler olabileceğini sanıyorum.
Bu iki kelimenin, Kişi Listesi sayfası E sütunundaki sonuç kontrol hesaplama formüllerinde ve
VBA ekranındaki kodlarda da kullanılıyor olduğunu bir kez daha hatırlatayım.
Hem sayfada hem de VBA ekranında CTRL+H yöntemiyle ROBOT ve UZAY kelimelerini gerçek kelimelerinizle değiştirirsiniz.

.
 

Ekli dosyalar

@ekrmy
Bundan önceki cevabımda hedef, Çalışan Listesi sayfasında SEGMENT bilgisi olmayanların da dağıtıma dahil olmasına yönelikti.
Çünkü sorunuzu öyle anlamıştım ve Çalışan Listesi sayfasında son iki satırda bu bilgiler yok idi.

Her neyse, gerek yukarıdaki gibi bir durum ve gerekse de eklediğiniz son belgedeki isteklerin tümünü karşıladığını düşündüğüm belgeniz ekte.
Denersiniz. Umarım tamamlanmıştır.

Gerçek belgenizde UZAY ve ROBOT ibarelerinden farklı ibareler olabileceğini sanıyorum.
Bu iki kelimenin, Kişi Listesi sayfası E sütunundaki sonuç kontrol hesaplama formüllerinde ve
VBA ekranındaki kodlarda da kullanılıyor olduğunu bir kez daha hatırlatayım.
Hem sayfada hem de VBA ekranında CTRL+H yöntemiyle ROBOT ve UZAY kelimelerini gerçek kelimelerinizle değiştirirsiniz.

.
Merhaba Ömer Bey,

H Sütununda isimleri olan kullanıcılara atama yapmıyor. Dosyada belirtiyorum. Teşekkür ederim.
 

Ekli dosyalar

-- Kodun baş tarafında yer alan aşağıdaki satırların sol başlarına birer tane TEK TIRNAK işareti ekleyerek etkisiz hale getirin.
(TEK TIRNAK ekleyince satırın yazı rengi yeşile dönüşür)

VBA:
For s = 2 To ason
    If t.Cells(s, 8) <> "" Then
        t.Cells(s, 34) = t.Cells(s, 8): t.Cells(s, 53) = t.Cells(s, 32) & "|" & t.Cells(s, 33) & "|" & t.Cells(s, 8)
    End If
Next

-- Sonra da, kodun sonuna yakın 20: End If: Next şeklindeki satırın üstüne yeni bir satır olarak şu satırı ekleyin.

VBA:
    If t.Cells(s, 8) <> "" Then t.Cells(s, 34) = t.Cells(s, 8)

.
 
-- Kodun baş tarafında yer alan aşağıdaki satırların sol başlarına birer tane TEK TIRNAK işareti ekleyerek etkisiz hale getirin.
(TEK TIRNAK ekleyince satırın yazı rengi yeşile dönüşür)

VBA:
For s = 2 To ason
    If t.Cells(s, 8) <> "" Then
        t.Cells(s, 34) = t.Cells(s, 8): t.Cells(s, 53) = t.Cells(s, 32) & "|" & t.Cells(s, 33) & "|" & t.Cells(s, 8)
    End If
Next

-- Sonra da, kodun sonuna yakın 20: End If: Next şeklindeki satırın üstüne yeni bir satır olarak şu satırı ekleyin.

VBA:
    If t.Cells(s, 8) <> "" Then t.Cells(s, 34) = t.Cells(s, 8)

.
Ömer Hocam,
Elinize emeğinize sağlık. Gerçekten büyük emek, her şey için çok teşekkürler. Minnettarım...
 
@ekrmy
O halde nihai çözüm dosyasını ve kodları bu cevaba ekleyeyim.
Benzer ihtiyacı olanlar, mesajlar, belgeler arasında boğulmadan kolaylıkla sonuca ulaşabilsin.

Çözüm belgesi ekteki gibi olup, belgede kullanılan kodlar aşağıda gösterilmiştir.
Belki sadece Çalışan Listesi sayfasında;
-- E sütunundaki formül de birinci formülle değiştirilebilir
-- F sütununa da aşağıdaki ikinci formül uygulanabilir.
Böylece hem veri miktarı değişikliğinde formülleri güncelleme gerekmez, hem de yapılan yeni dağıtım sonuçları elde edilmiş olur.

Sonradan eklenen not: Formüller ve kodlarda, hızlanmaya yönelik küçük değişiklikler yapıldı ve eklenen sonuç belgesi de
buna göre güncellendi. 13.08.2021 01:00


Kod:
=TOPLA.ÇARPIM(('ANA DATA'!$AF:$AF=C2)*('ANA DATA'!$AG:$AG=EĞER(D2<>"";D2;EĞER(TOPLA.ÇARPIM(($C:$C=C2)*($D:$D="Uzay"))=0;"Uzay";EĞER(TOPLA.ÇARPIM(($C:$C=C2)*($D:$D="Robot"))=0;"Robot";""))))*('ANA DATA'!$AH:$AH=B2))
=TOPLA.ÇARPIM(('ANA DATA'!$H:$H="")*('ANA DATA'!$AF:$AF=C2)*('ANA DATA'!$AG:$AG=D2)*('ANA DATA'!$AH:$AH=B2))

VBA:
Sub DENGELI_DAGITIM_FINAL()
Set t = ThisWorkbook.Sheets("ANA DATA"): Set c = ThisWorkbook.Sheets("Çalışan Listesi")
TEMIZLE
Application.ScreenUpdating = False: Application.Calculation = xlCalculationManual
If t.AutoFilterMode Then t.AutoFilterMode = False
If c.AutoFilterMode Then c.AutoFilterMode = False
ason = t.Cells(Rows.Count, 1).End(3).Row: cs = c.Cells(Rows.Count, 2).End(3).Row
t.[BA:BB].Insert: c.[BA:BA].Insert
On Error GoTo 10
c.Range("BA2:BA" & cs).Formula = "=IF(D2<>"""",D2,IF(SUMPRODUCT(($C$2:$C$" & cs & "=C2)*($D$2:$D$" & cs & _
    "=""Uzay""))=0,""Uzay"",IF(SUMPRODUCT(($C$2:$C$" & cs & "=C2)*($D$2:$D$" & cs & "=""Robot""))=0,""Robot"","""")))"
c.Range("BA2:BA" & cs).Calculate: c.Range("BA2:BA" & cs).Value = c.Range("BA2:BA" & cs).Value
For s = 2 To ason
    If t.Cells(s, 34) = "" Then
        x = Evaluate("=SUMPRODUCT(--('Çalışan Listesi'!C2:C" & cs & "&""|""&'Çalışan Listesi'!BA2:BA" & _
                                        cs & "='ANA DATA'!AF" & s & "&""|""&'ANA DATA'!AG" & s & "))")
        x2 = Evaluate("=SUMPRODUCT(('Çalışan Listesi'!C2:C" & cs & "='ANA DATA'!AF" & s & _
                            ")*('Çalışan Listesi'!D2:D" & cs & "<>'ANA DATA'!AG" & s & "))")
        say = say + 1: t.[BB:BB].ClearContents
        If x = 0 And x2 = 0 Then GoTo 20
        If x > 0 Then t.[BB1] = t.Cells(s, 32) & "|" & t.Cells(s, 33)
        If x = 0 And x2 > 0 Then t.[BB1] = t.Cells(s, 32)
        For sss = 2 To ason
            If t.Cells(sss, 34) <> "" Then
                If x > 0 Then
                    t.Cells(sss, 53) = t.Cells(sss, 32) & "|" & t.Cells(sss, 33) & "|" & t.Cells(sss, 34)
                ElseIf x = 0 And x2 > 0 Then
                    t.Cells(sss, 53) = t.Cells(sss, 32) & "|" & t.Cells(sss, 34)
                End If
            End If
        Next
        For ss = 2 To cs
            If x > 0 Then krt = c.Cells(ss, 3) & "|" & c.Cells(ss, 53)
            If x = 0 And x2 > 0 Then krt = c.Cells(ss, 3)
            If krt = t.[BB1] Then
                adet = WorksheetFunction.CountIf(t.[BA:BA], krt & "|" & c.Cells(ss, 2))
                Randomize: XD = Rnd(): If XD = 0 Then XD = 3 / 10
                t.Cells(ss, 54) = adet - XD / 100
            End If
        Next: t.Cells(s, 34) = c.Cells(WorksheetFunction.Match(WorksheetFunction.Small(t.[BB:BB], 1), t.[BB:BB], 0), 2)
    If t.Cells(s, 8) <> "" Then t.Cells(s, 34) = t.Cells(s, 8)
20: End If: Next
10: t.[BA:BB].Delete: c.[BA:BA].Delete
Application.ScreenUpdating = True: Application.Calculation = xlCalculationAutomatic
If say > 0 Then MsgBox "İşlem tamamlandı..", vbInformation, "::.. Ömer BARAN ..::"
If say = 0 Then MsgBox "İşlem YAPILAMADI..", vbCritical, "::.. Ömer BARAN ..::"
End Sub

Sub TEMIZLE()
Sheets("ANA DATA").Range("AH2:AH" & Rows.Count).ClearContents
If Sheets("ANA DATA").[BB1] <> "" Then Sheets("ANA DATA").[BA:BB].Delete
If Sheets("Çalışan Listesi").[BA2].Value <> "" Then Sheets("Çalışan Listesi").[BA:BA].Delete
End Sub

.
 

Ekli dosyalar

Bir önceki nihai çözüm cevabımı güncelledim.
Örnek belge dahil yeni haline, sayfayı yenileyerek tekrar bakılmasında yarar var.
Ömer Hocam,

Özelden durumu belirttim. Eşit atamada sorun var. Belirttiğiniz güncel kod ve dosyada denedim sonuç değişmedi.

Tekrar dağıtım yap dediğimde totalde kayıt sayısı düşük olana tüm yeni atamaları yaptı. Sanırım var olan atamalarıda değerlendiriyor. Var olan H boşsa yeni kayıt anlamına geliyor amacımız bu yeni kayıtları ilgili takım ve gruplara eşit olarak dağıtmak. Atladığım bir nokta varsa kusuruma bakmayın lütfen. :)

Dosyaları ek olarak paylaşıyorum.
 

Ekli dosyalar

@ekrmy
50 numaralı cevap ekindeki belgeyi yeniledim.
Belgeyi tekrar indirerek gerekli kontrolü yaparsınız.

.
Merhaba Ömer Bey,

Dosyada işlem hızı %100 farklı olmuş elinize sağlık.

Ek olarak paylaşıyorum.

1. Segment te çalışan varken diğer segmentte kayıt ataması yapıyor. Kırmızı olarak belirtim.
2. Çalışan listesinde eski dağılım sanırım segment ve kullanıcı adından sayıyor. Kullanıcıya atanmış farklı segment kayıtları olabiliyor. Kullanıcıdaki net sayıyı görmek için kullanıcı adından gitmesi yeterli olacak gibi.

Şimdilik bu 2 durumu tespit ettim.

Emeğinize sağlık Ömer Bey.
 

Ekli dosyalar

@ekrmy
50 numaralı cevap ekindeki belgeyi tekrar yeniledim.
Belgeyi tekrar indirerek gerekli kontrolü yaparsınız.

Son mesaja eklediğiniz belgede hatalı sonuç almanızın nedeni; Robot yerine Rabot yazılması. ;)
Ayrıca; yenilediğim belgede Çalışan Listesi sayfası E sütunundaki SAYIM, ANA DATA sayfası H sütunundaki İSİM ADETİ olarak değiştirildi.

.
 
@ekrmy
50 numaralı cevap ekindeki belgeyi tekrar yeniledim.
Belgeyi tekrar indirerek gerekli kontrolü yaparsınız.

Son mesaja eklediğiniz belgede hatalı sonuç almanızın nedeni; Robot yerine Rabot yazılması. ;)
Ayrıca; yenilediğim belgede Çalışan Listesi sayfası E sütunundaki SAYIM, ANA DATA sayfası H sütunundaki İSİM ADETİ olarak değiştirildi.

.
Merhaba Ömer Bey,

Hatam için kusura bakmayın. :)
Dağıtım ve diğer konularda bir sorun görünmüyor gibi sadece yeni dağıtımda fazladan yazım yapıyor :) Örneğin 1 kayıt gitmiş kişiye 2 yazıyor veya gitmiş 5 gitmiş 8 yazıyor.

İyi çalışmalar.
 

Ekli dosyalar

Çalışan Listesi sayfası E sütununda,
ANA DATA sayfasındaki Grup ve Proje sütunlarına hiç bakmadan doğrudan İSİM sayısının mı bulunması gerekiyor?

Verdiğiniz olması gereken sonuç sayıları 1'er fazla sanırım. ANA DATA sayfasında sadece H sütunu filtrelendiğinde; atakan 39, ceren 43 adet.

.
 
Çalışan Listesi sayfası E sütununda,
ANA DATA sayfasındaki Grup ve Proje sütunlarına hiç bakmadan doğrudan İSİM sayısının mı bulunması gerekiyor?

Verdiğiniz olması gereken sonuç sayıları 1'er fazla sanırım. ANA DATA sayfasında sadece H sütunu filtrelendiğinde; atakan 39, ceren 43 adet.

.
ANA DATA sayfasındaki Grup ve Proje sütunlarına hiç bakmadan doğrudan İSİM sayısının mı bulunması gerekiyor?
-Evet
Verdiğiniz olması gereken sonuç sayıları 1'er fazla sanırım. ANA DATA sayfasında sadece H sütunu filtrelendiğinde; atakan 39, ceren 43 adet.
Evet 1 fazla yazmışım Ömer Bey
 
Konuyu başlatan
Site Üyesi
Katılım
Konu Bilgi
Durum
Çözüldü 
Forum
Genel Excel Soruları
Başlangıç tarihi
Son yanıt tarihi
Cevaplar
61
Üst