E

Çözüldü Üç Ayrı Şekildeki Makroyu Birleştirme

  • Konuyu başlatan Konuyu başlatan ErolU
  • Başlangıç tarihi Başlangıç tarihi
Durum
Üzgünüz bu konu cevaplar için kapatılmıştır...

ErolU

Normal Üye
Değerli Arkadaşlar,
Başlıkta da belirttiğim gibi "Private Sub Worksheet_Change(ByVal Target As Range)" başlıklı üç makroyu üçü de çalışacak şekilde birleştirmek istiyorum.
Makroların aşağıda verdiğim sıralamaya göre alt alta yazılması daha doğru olacak diye düşünüyorum.
Birinci ve ikinci makroda geçen "On Error GoTo Son" satırı E8:F67 bölgesinde toplu silme işlemi yapınca çıkan makro hatasını göstermemek için kullanılıyor.
Konu hakkında yardımlarınızı rica ediyorum.

1. MAKRO:
Kod:
Görüntülemek için giriş yapmanız gerekmektedir.
(19 satır)

2. MAKRO:
Kod:
Görüntülemek için giriş yapmanız gerekmektedir.
(8 satır)

3. MAKRO:
Kod:
Görüntülemek için giriş yapmanız gerekmektedir.
(7 satır)
 
Önce bundan önceki cevabıma bakınız SAyın @Erol U. .

Sanki kodun son kısmı (10: dolu = ..... ile End Sub satırları arasında kalan kısım) şöyle olsa daha doğru olacak.
Her iki duruma göre deneyip sonucu, varsa sorunu iletirsiniz.

VBA:
Görüntülemek için giriş yapmanız gerekmektedir.
(6 satır)

.
 
Sayın Ömer BARAN,
Öncelik olarak teşekkürler ve iyi geceler.

Yazmış olduğunuz her iki cevabı da gördüm ve üzerinde uygulama yaptım. Sorun halledilmiş gibi duruyor ancak hesaba katmadığım birkaç durumu son koda göre ayrıntılı düşünmem gerekiyor.
Dosyayı sadece kendim kullanmayacağım. Dosya yapısı(onay kutuları) diğer kullanıcılar açısından soruna yol açabilir gibi duruyor.
Yarın öğleden sonra konu ile ilgili çalışıp son durum hakkında bilgi vereceğim.
 
Sayın Ömer BARAN,
Daha önce öngöremediğim bir kaç durumla ilgili bir belge hazırladım. Açıklamalarım içerisinde. Bu konularda çözüm üretilebilir mi?

EK: 21. iletinizdeki kodda iki yerde 68. satır yazılmış. Tablom 67. satırda bitiyor. Bu bir yanlışlık mı, gereklilik mi? Gereklilik ise bir sıkıntı yok.
 

Ekli dosyalar

Sizin veri alanınınız 67'nci satırda bitiyor ve boşluksuz veri girişi zaten kodla sağlanıyor.
Bu durumda iki sütuna veri girildiğinde İLK BOŞ SATIR'ın bulunması için iki seçenek var.
-- Biri başlık hücresinden aşağı doğru ilk boş hücreye ulaşmak. Bunun için ilk seçenek CTRL+AŞAĞI OK.
Başlıklarınız iki hücre birleştirilmiş olduğundan (aslında E6 DOLU, E7 BOŞ, F6 dolu, F7 boş demek),
CTRL+AŞAĞI OK işleminin 2 kez uygulanması, Sonuçta varılan hücrenin 1 altındaki satır boş hücredir.
-- İkincisi ise sütunda en son satırdan (excel versiyonuna göre 1048576'ncı satırdan yukarı doğru gitmek için
E1048576 hücresine gelip CTRL+YUKARI OK tuşuna basmak, varılan hücreden 1 satır aşağısı ilk boş hücredir.
Tablonuzdaki satır sayısı sabit olduğuna göre (ben öyle anladım en azından) E68'den CTRL+YUKARI OK, varılan satır+1 ilk boş hücredir.
Ben bu seçeneği düşünmüşüm.

Belki de kısa kod oluşturmaya çalışmak yerine, basitçe ilgili sütunda 8'inci satırdan itibaren TEK TEK dolu/boş kontrolü için
For...Next döngüsü kurulup, boş hücreye varıldığında döngüden çıkılması da düşünülebilir. Neticede veri alanınız çok satırlı bir alan değil.

Tabi dikkate alınmamış bir durum da 67'nci satıra da veri yazıldığında nasıl bir işlem beklenildiği.
Bu durum seçeneği halen AÇIKTA.

Bir de önerim olsun, GİZLENECEK sütunu kullanmaya gerek var mı sizce?
İlgili Onay Kutularının bağlantı hücresi olarak Onay Kutusunu konumlandırdığınız B sütununu neden kullanmıyorsunuz?
Tabi tek koşul, bu hücrelerin arkaplan rengiyle yazı rengini AYNI olacak şekilde ayarlamalısınız.

Son belgenizdeki isteğinize ayrıca bakarım uygun olduğumda.
Aklıma ilk gelen aslında VERİ DOĞRULAMA yöntemiyle alana veri girişinin kısıtlanması oldu.
Ama önceden düşünülmesi gereken bir durum da solunda YANLIŞ yazılıykan veri girilip, Onay Kutusu sonradan işaretlendiğinde ne yapılacağı. Bu duru için benim aklıma gelen yöntem ise KOŞULLU biçimlendirme üzerinden uygulanacak renklendirmeyle bu duruma dikkat çekmek.

.
 
İyi akşamlar Sayın BARAN,
Yukarıda yazmış olduğunuz ilk üç paragraf bundan önceki iletimdeki EK: 21. iletinizdeki kodda iki yerde 68. satır yazılmış. ..... açıklamam ile ilgili galiba. Bu konuda hiçbir sıkıntı yok. Tablo 67 satırda bitiyor, yanlışlıkla mı 68 yazıldı diye düşündüm. Ona dikkat çekmek istemiştim.
Bir gereklilikmiş zaten.
67. satıra veri yazdıktan sonra ne olacağı konusu: 68'e geçiyor, burada da bir şey yapmaya gerek yok.

Gizlenecek sütunu şu amaçla koydum: Eğer listeye sonradan öğrenci eklenirse numaralar da sıralandığı için "DOĞRU, YANLIŞ" sonuçlarının da öğrenci ile hareket etmesi için. Öğrenci ad ve soyadlarının yanına koymamın sebebi kod yazılırken kolaylık olsun diye. Dosya açısından orada olmasının sıkıntısı yok.

Veri doğrulama ile yapma fikri benim de aklıma geldi fakat yapılabilirse makronun içerisinde bir bütün olsun istedim.

Onay kutusu konusu söyle: Öğrencinin okul numarası yazılmışsa onay kutusunda ne olursa olsun fark etmez. Yeter ki okul numarası yazılmadan onay kutusu işaretlenemesin, DOĞRU sonucunu vermesin.

ÖZETLE
Son eklediğim belgedeki ilk metin kutusunun içerisindeki 3. madde ile eğer yapılabilirse ikinci metin kutusundaki onay kutusu konusu önem arz ediyor.
 
Yanlış düşünmüyorsam mevcut kodda ilk If..... ile bir sonraki Elseif.... arasına aşağıdaki yeşil kısım eklenirse,
örnek belgedeki 1 ve 2 numaralı istekleriniz karşılanmış olur.

VBA:
Görüntülemek için giriş yapmanız gerekmektedir.
(5 satır)
 
Önce bundan önceki cevabıma bakınız.
Onay Kutularına TİK işareti konulması mevzusuyla ilgili olarak; aşağıdaki kodu, sayfanın kod bölümüne ekleyin.
Sonra sayfadaki tüm Onay Kutularını seçili hale getirin
(seçili derken TİK işareti koyma veya kaldırmayı kastetmiyorum, nesneleri seçili hale getirin)
sonra birinin üzerinde fareyle sağ tıklayıp MAKRO ATAyı seçin ve açılacak küçük ekranda ONAY_E_DOLU_KONTROL
makrosunun adını seçip işlemi onaylayın.

Artık E sütunu boş olan satırdaki onay kutusu işaretlendiğinde istediğiniz uyarı verlir ve onay kutusuna koyulan TİK iptal edilir.

NOT: SİL ismini verdiğiniz makro, sadece BAŞLANGIÇ isimli sayfada işlem yapacaksa,
o makro kodlarını da sayfanın kod bölümüne alabilirsiniz.


CSS:
Görüntülemek için giriş yapmanız gerekmektedir.
(13 satır)

.
 
Sayın Ömer BARAN,
Zaman ayırıp çözüm ürettiğiniz için çok teşekkür ediyorum.
Son kodları ekteki belgeye uyguladım. Denemeler yaptım ve bazı durumlar ortaya çıktı.
Belge içerisinde bu durumlara ilişkin açıklama ekledim.
Konuya tekrar bakmanızı rica eder iyi geceler dilerim.
 

Ekli dosyalar

Sayın @Erol U.

Aşağıdaki ilk kod satırını Worksheet_Change kodunun End Sub satırının hemen üstüne ekleyin.
Devamındaki ONAY_E_DOLU_KONTROL makrosunu da aşağıdaki gibi değiştirin.

CSS:
Görüntülemek için giriş yapmanız gerekmektedir.
(12 satır)

.
 
Sayın BARAN,
Önerileriniz işlemleri hatasız yapıyor. Önceki iletimdeki bir konu eksik kalmış. Burası da tamamlanırsa eksiksiz olacak.

Onay kutusu makrosunda mevcut makro çalışsın Msgbox çıkarsa tamam diyeyim ve makro sonuçlansın. Başka işlem yapmasın.
Eğer Msgbox çıkmaz ise makro aşağıdaki işleme geçsin:
TİK koyduğum satır E8:E67 arasında dolu, aynı satır A8:A67 arasında boşsa
MsgBox "Bu öğrenciye işaret koymaya gerek yok. Öğrenciyi silin." , vbCritical, "HATA" uyarısı çıksın, işlem iptal edilsin (Yani satırın D sütunundaki DOĞRU değeri silinsin.) .
 
Keşke yeni bir konu açıp tüm durum ve koşulları tek seferde açıklasaydınız.
Böylece boşuna uğraşılmamış, bir defada sonuç almaya daha çok yaklaşılmış olurdu.

Herneyse; TİK koyma (onay kutusunu seçili hale getirme) işlemi yapıldığında E sütunu boşsa son verdiğim kod ile
MsgBox görüntüleniyordu. İstenilenin bu olduğunu anlıyorum.
ANcak MsgBox ile birlikte D sütununda oluşan DOĞRU ibaresi siliniyor idi. Bunu mu istemiyorsunuz?
Eğer öyle ise ilgili Onay Kutusu seçili (dolayısıyla da ilgili satırda D hücresinde DOĞRU ibaresi) olarak kalır.

Sanırım anlayamadım.
 
Merhaba Ömer Bey,
Aslında yeni konu açmayı düşünmedim değil fakat konunun yukarıdan beri gelen şekli ile ilgili olduğu için buradan devam edeyim dedim. İleride böyle bir şey lazım olan olursa hepsini bir yerden görsün amaçlı.
28 ve 30. iletilerde aslında durumu ifade etmiştim dikkatten kaçtı galiba böylelikle konu tekrara düştü. Zamanınızı aldım, kusuruma bakmayınız.

Son durum şöyle:
29. iletideki yazdığınız onay kutusu kodunun altına bir ekleme yapmak istiyorum.
Öncelikle mevcut kod hatasız çalışıyor. Burada bir problem yok.

Hatasız çalışan mevcut kodda belirtilen durum gerçekleşip Msgbox açılınca Tamam diyoruz ve sonuca hatasız ulaşılıyor. İşlem sorunsuzca bitiyor.
Makro bu noktadan sonra şöyle ilerleyebilir mi:

Hatasız olan mevcut kod çalışıp eğer Msgbox çıkarsa tamam dediğimizde makro sonlansın. Alt satıra yazılacak koda geçmesin.
Msgbox çıkmaz ise
(yani kodun yukarıda aradığı durum gerçekleşmemişse) makro aşağıdaki işleme geçsin:

TİK koyduğum satır E8:E67 arasında dolu, aynı satır A8:A67 arasında boşsa

MsgBox "Bu öğrencinin puanı yok. İşaret koymadan öğrenciyi silebilirsiniz." , vbCritical, "HATA" uyarısı çıksın, işlem iptal edilsin (Yani satırın D sütunundaki DOĞRU değeri silinsin.).


ÖZETLE tik koyma işlemine 2 kısıtlama getirmiş oluyoruz.

İlk durumda E sütununda öğrenci no yoksa tik konulamasın. Konulan tik silinsin ve makro sonlansın. (Bu durum mevcut makroda zaten yapılıyor.)
İkinci durumda tik konulmak istenen satırın A sütunu boşsa tik konulamasın. Konulan tik silinsin ve makro sonlansın.
 
Onay Kutularyıla ilgili işlemdeki ÖNCELİK sırası konusundan emin olamadım açıkçası.

Aşağıya 2 öncelik sırası seçeneğini de vereyim, yazdığım açıklamayı değil de iki kod seçeneğini ayrı ayrı uygulayıp,
sayfada işlem yaparak deneyin ve sonuca göre karar verin.

Hangisi isteğinizin TAM karşılığı ise onu kullanırsınız.
-- Birinci seçenekte; önce A sütunu hücresi için boş/dolu kontrolü yapılır,
A boşsa TİK işareti kaldırılır (yani D hücresi silinir) ve E sütunu kontrolü yapılmadan işlem biter, MsgBox görüntülenmez.
-- İkinci seçenekte; önce E sütunu hücresi boş/dolu kontrol edilir, E hücresi boşsa MsgBox görüntülenir ve
onay kutusu temizlenir (yani D hücresi silinir) , A sütunu kontrol edilmeden işlem solandırılır.

Kodlardaki Range(Split(XD, "_")(1)).Offset(0, 2).ClearContents
satırlarının TİK işaretinin kaldırılması anlamına geldiği bellidir, çünkü bağlantı hücresi silinince TİK kalkar).

CSS:
Görüntülemek için giriş yapmanız gerekmektedir.
(8 satır)

CSS:
Görüntülemek için giriş yapmanız gerekmektedir.
(8 satır)

.
 
Sayın Ömer BARAN,
Son verdiğiniz kodlardan altta olanına aşağıda renklendirdiğim kısımları ekleyince tam istediğim gibi çalıştı.
Yardımlarınızdan dolayı derin bir teşekkürü borç bilirim. Çok sağ olunuz.

Sub ONAY_E_DOLU_KONTROL()
XD = Application.Caller
If ActiveSheet.Shapes(XD).OLEFormat.Object.Value = 1 And _
Range(Split(XD, "_")(1)).Offset(0, 3).Value = Empty Then
MsgBox "Okul numarası yazılmadan işaret koyamazsınız.", vbCritical, "HATA"
Range(Split(XD, "_")(1)).Offset(0, 2).ClearContents
ElseIf ActiveSheet.Shapes(XD).OLEFormat.Object.Value = 1 And _
Range(Split(XD, "_")(1)).Offset(0, -1).Value = Empty Then
MsgBox "Bu öğrencinin puanı yok. İşaret koymadan öğrenciyi silebilirsiniz.", vbCritical, "HATA"
Range(Split(XD, "_")(1)).Offset(0, 2).ClearContents
End If
End Sub

Dosyanın çözüme ulaşmış açıklamalı şeklini de ekliyorum. Güzel bir çalışma oldu.
 

Ekli dosyalar

Durum
Üzgünüz bu konu cevaplar için kapatılmıştır...
Üst