E

Çözüldü WorksheetChange kopyala yapıştırla beraber işlem yapmak

  • Konuyu başlatan Konuyu başlatan ErolU
  • Başlangıç tarihi Başlangıç tarihi

ErolU

Normal Üye
Excel Versiyonu
Excel 2016
Excel Sürümü
64 Bit
Excel Dili
Türkçe
Arkadaşlar,
Ekli dosyada yer alan bir Worksheet_Change kodu var. Bu kod hatasız çalışıyor.
Hücredeki değer değişince (kopyala yapıştır olmadan tek tek değişince) işlemleri hatasız yapıyor.
Kod KOPYALA YAPIŞTIR yapılarak işlem yapıldığında kontrolleri yapmıyor.

Aklıma aşağıdaki gibi bir yöntem geldi. Farkı çözüm önerilerini de kullanabilirim.

SORU: Kopyala yapıştır yapıldığını anlayıp kodun mevcut hâlini çalıştırmayı durdurup aşağıdaki 2 kontrolü yaptırabilir miyiz?
Yani kopyala yapıştır yapılınca aşağıdaki 2 kontrol çalışsın değilse dosyadaki asıl kod çalışsın.

1. Kontrol:

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

Ekli dosyalar

Tek tek kopyalayınca sorun yok gibi ama çoklu kopyalama yapınca problem oluyor.. application.cutcopymode ile kopyalama olup olmadığını anlayabilirsiniz.

change olayının başını aşağıdaki kodu ekleyin..

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

Selman,​

Bilgi için teşekkürler.
Dosya mevcut hâli ile hatasız çalışmakta. Çoklu kopyalamada işlemler yapılmıyor.
Yukarıda verdiğiniz kod parçacığı çoklu kopyalama yapıldığını anlıyor.
Amacım bu noktadan sonra ilk iletimde eklediğim iki kontrolü yapmak.
 
Ben sizin kodları tam anlamadığım için onu adapte edemedim ama dediğim gibi change olayı çalıştığında application.cutcopymode<>0 ise kopyala yapıştır yapılıyordur.. verdiğim kodda target.count kısmınu iptal edip kodlarınızı bu if bloğunun içinde çalıştırın

If Application.CutCopyMode <> 0 Then ' kopyalama yapılıyordur...
' kodlarınızı burada çalıştırın
End If
 

Selman,​

İlk iletimdeki kodlardan birincisi verilen aralıkta aynı numara tekrar ediyor mu kontrolü, ikincisinde adları Soyad büyük diğerlei ilk harf büyük yapan bir kod var.
Bunları çalıştırmak istiyorum.
 
Numara ve İsim aynı anda kopyalanıp yapıştığında mı çalışacak? Tek tek kopyalıyorsanız orjinal kod çalışır zaten. Numara+isim birlikte kopyalanıyorsa o zaman çoklu kopyalama konusuna geliyoruz.
 
Bu işi worksheetchange olayında kontrol etmeye çalışmak zor.. tekrar eden numaralar için ayrı bir prosedür yazıp change olayında bunu çalıştırmanızı ve kullanıcıya uyarı vermesini öneririm:

Aşağıdaki kodu change olayının sonunda çağırın.. Tüm sayfayı kontrol edip mükerrer numaralar için G sütununa X işareti koyacak. Diğer kodunuzuda bunun altına ilave edebilirsiniz..

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

Selman ,​

Makroyu aşağıdaki gibi düzenledim, hatalı işlemler yapıyor.
Bir de G sütununa x koyuyor. Buna gerek yok. Sadece mükerrer no var dese yeterli oluyor.
Kod:
Görüntülemek için giriş yapmanız gerekmektedir.
(12 satır)
 
Belgenize daha evvel de bakmış ancak yapılmak istenileni tam olarak anlayamamıştım.
Belki de şöyle düşünmek lazım.

-- Target.Count>1 iken (toplu kopyala yapıştır yapıldığında)
For each hcr In Target.....Next
diye bir döngü çalıştırıp, bu döngü içerisinde hcr değişkeninin sütun numarasına göre öğrenci numarası mı yoksa ad soyad mı olduğu tespit edilebilir ve buna göre diğer işlemler de yapılabilir elbette.
Bu kez de mevcut koddaki Selection.Count>1 ... kısımlarının ne olacağı, ne yapılacağına karar verilmesi gerekir.

2 sütun 10 satırlık bir alanı kopyalayıp yapıştırdınız diyelim.
Bunlardan bazıları için B sütununda TİK işareti yok, bazı öğrenci numaraları mükerrer, bazı satırlarda isim var soyadı yok vs.
Her bir hücre için ayrı ayrı kontrol yapılırken çok sayıda ve art arda MsgBox karşınıza gelmeyecek mi?

Hedef hücre TEK olsa da (Target.Count = 1 demektir) yukarıdaki hususlarda orun yaşanmaz.

.
 
Bilgisayarda değilim.
Mevcut kodun en başına:
If selection.count > 1 then
For each hcr In Selection
If hcr.column=5 then
Msgbox kullanmadan E sütununa ait kontroller
End if
If hcr.column=6 then
Msgbox kullanmadan F sütununa ait kontroller
End if
Next
End if

diye bitirilip, mevcut kodlar, ...count > 1 kontrolleri kaldırılarak devamındaki eski kodlar çalıştırılırsa istenilen sonuç alınabilir gibi düşünüyorum.Denemek lazım.
 

Ömer BARAN,​

Son iletinizi anlamaya bilgim yetmedi. :(

Konuyu ayrıntılı olarak şöyle özetleyeyim, umarım kafa karıştırıcı olmamıştır:

Private Sub Worksheet_Change(ByVal Target As Range)
1. If Application.CutCopyMode <> 0 And Target.Count > 1 Then

__ A) Eğer E8:E67 aralığında boş hücre sayısı 60'a eşit değilse ve E8:E67 aralığındaki öğrenci numaralarında mükerrer varsa MsgBox "Mükerrer var."
__ Mesaj kutusuna tamam deyince ya da E8:E67 aralığında boş hücre sayısı 60'a eşit ise B maddesine geç.
__ B) F8:F67 aralığında boş hücre sayısı 60'a eşit değilse aşağıda AD SOYAD diye gösterdiğim kod çalışsın F8:F67 aralığındaki dolu hücreleri tek tek düzenlesin.
_____ Exit Sub
______(Bu AD SOYAD isimli kod, ad soyadları adlarda ilk harf büyük, soyadı tümü büyük şeklinde kırpma (Trim) yaparak düzenliyor.)

2. Eğer yukarıdaki 1 numaralı maddede belirtilen birden fazla değeri yapıştırma işlemi yapılmamışsa (yani hücrelere tek tek veri giriliyorsa) aşağıdaki NORMAL KOD isimli kodlar çalışsın.
(Bu NORMAL KOD isimli kodlar hatasız çalışıyor, hücrelere tek tek veri yazınca gerekli kontrolleri yapıyor.)
End Sub


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

NORMAL KOD
Kod:
Görüntülemek için giriş yapmanız gerekmektedir.
(50 satır)
 
Ben şöyle düşünmüştüm (kodlamadım).

Kodun en başında Selection.Count kontrol edilir.
Kopyala yapıştır işleminde 1'den fazla satır veya 1'den fazla sütun varsa bu tespit edilmiş olur.
Mükerrer öğrenci numarası, tek kelimelik isim soyisim vs diğer kontroller bu kopyalanan hücreler için yapılır.
MsgBox uyarısı olmadan (çok sayıda gereksiz msgBox anlamlı değil diye düşünüyorum),
standarda uymayan veriler sildirilir ve bu işlem tamamlanır ardından da kodların
eski orijinal kodlara geçişi sağlanır (orijinal koddaki If Selection.Count>1 Then kısımları yok edilir tabi).
 

Ömer BARAN

Kod aşağıdaki hatalı işlemleri yapıyor:
1. Sayfadaki SİL butonu hatalı çalışıyor. İşlem yapmayıp MsgBox çıkıyor.
2. Kopyala yapıştır yapınca 6. öğrencinin ad soyadını yazmıyor. Sadece 6. öğrenciyi (ALİ ALTI) yazmıyor.
3. Kopyala yapıştır yapınca mükerrer no.ları ve ad soyadları yazmıyor. Bu şekilde No.su ayrı ama ad soyadı aynı öğrenciler yazılamıyor.
4. Kopyala yapıştır yapınca öğrenci ad soyadları kırp (Trim) yapılmıyor, bunun yerine ad soyad yazılmıyor.
5. Kopyala yapıştır değil de tek tek giriş yapınca ad soyadı düzenlemiyor.


Görebildiklerim bunlar.

Yukarıdaki 13 no.lu iletimin kurgusunu bayağı düşünüp oluşturmuştum. Bu kurgu kodlama açısından yapılabilir ise tam istenilen olacak.
Siz 14. iletinizde şöyle demişsiniz:
MsgBox uyarısı olmadan (çok sayıda gereksiz msgBox anlamlı değil diye düşünüyorum),
Bu mesajlar 13. iletimdeki kurguda kopyala yapıştır yapılınca zaten işlemeyecek. Bu mesajlar girişi tek tek yazarken çıkıyor, bu istenilen bir durum.

Usta sizsiniz, sizin yazdığınız kod üzerinden de gidilebilir, benim 13. iletimdeki kurgu üzerinden -yapılabilirliği varsa- de gidilebilir.
Konuyu yeniden değerlendirmeniz dileğimle iyi geceler dilerim.
 
Bir de şu haliyle dener misiniz?

Denemeler sırasında (kodu adımlayarak çalıştırırken) işlemleri elle durduracak/kesecek olursanız,
Application.EnableEvents = False olarak kalabilir. Böyle durumlarda aşağıdaki ikinci kodu 1 çalıştırarak tekrar True olarak değişmesini sağlayın.
Tabi bu kodun çalıştırılması normalde gerekmez. Sadece kod elle durdurulduğunda normale dönmek için gerekli.

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

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

Ömer BARAN ,​

Son koddan sonra iki hatalı işlem var:
1. Kopyalama yapılan yerdeki ad soyadların başında ortasında ve sonunda birden fazla boşluk varsa yapıştırdıktan sonra bu ad soyadlar ve okul no siliniyor.
2. Mükerrer okul numarası olunca hem numara hem ad soyad siliniyor. Bunun yerine ilgili yerler silinmeden şu, şu okul numaraları mükererdir diye bir mesaj kutusu çıkması dosya açısından gerekli.

Tekrar yardımınızı rica ederim.
 

Ekli dosyalar

@Erol U.

Kodda For .... satırıyla Else satırının arasını şöyle değiştirerek tekrar deneyin.
Not: SİL düğmesinde sayfa ismi kullanılıyor, sayfa isminin doğru yazıldığı belgede deneyin.

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

Kodu verdim ancak, verdiğim yukarıdaki şu kısım olmadan da deneyin, sanki bu kısım fazla ve işlevi olmayacak.
VBA:
Görüntülemek için giriş yapmanız gerekmektedir.
(5 satır)
 
Üst