• DİKKAT

    DOSYA İndirmek/Yüklemek için ÜCRETLİ ALTIN ÜYELİK Gereklidir!
    Altın Üyelik Hakkında Bilgi

Tarih hesabına makrolarla nasıl hükmedilebilir?

Katılım
18 Ocak 2008
Mesajlar
23
Excel Vers. ve Dili
excel2003
Konunun ekindeki dosya içerisinde hem 2003 hem 2007 versiyonu mevcut olan bir gün hesabı yaptırma projemiz var..BU proje çalıştığımız kurumdaki işleyişin hızlanması adına kuruma geldiğim ilk günden itibaren hayata geçirmeye çalıştığım bir çalışmaydı..Zaten bu proje sayesinde de diyebilirim ki VBA ile tanıştım..Projenin amacının ne olduğu ne yapılmak istendiği dosya içinde detaylı bir şekilde aktarılmaya çalışılmış olup kıasaca özetlemek gerekirse;
Proje bir kurs bitiş tarihi hesaplama projesi..Dosyay açtığınız zaman karşınıza ÜÇ sayfadan oluşan bir workbook gelecek ;ilk sayfada TAKVİM ikinci sayfada TATİLLER ve üçüncü sayfada HESAPLA kısmı yer alıyor..Hesapla sayfasında Elle Giriş yapacağımız KURSUN başlangıç tarihi, kursun toplam Saati ve kursun yapılacağı günler ve o günlerde kaç saat kurs olacağı bilgisinin girişinin yapılacağı veri doğrulama Listesi yer almaktadır..Açıklık getirmekte zorlandığım daha doğrusu nasıl bir şekilde makro kodlarına dahil edileceğini kestiremediğim TATİL GÜNLERİ var..TATİLLER sayfasından kullanıcının istediği kadar seçebileceği tatil günleri ...HESAPLA butonuna tıklandığı zaman öyle bir makro devreye girmeli ki; Kursun başlangıç tarihi üzerine kursun toplam saatini bulacak şekilde seçilen günler eklenmeli..tabi bu ekleme işleminde seçilen gün tatil gününe denk geldiğinde o tatil günü hesaba dahil edilmeden bir sonraki seçilmiş günden devam etmeli..Böylece kursun toplam saati miktarınca ekleme işlemi yapıldıktan sonra varılan nihai tarih HESAPLA sayfasında yer alan KURSUN BİTİŞ tarihi hücresine yazdırılsın...Şimdiden İLgi ve Alakanız için teşekkürlerimi sunuyorum..
 

Ekli dosyalar

Bu konuda yardımcı olacak bir arkadaş yok mu? Excelin yerleşik fonksiyonları ile bir şeyler yapmaya çalıştıysam da sonuç olumsuz..Makrolarla bu olayın çözüleceği kesin ama yeterli makro bilgim olmadığından (öğrenmeye çalıştığımı da belirtmek isterim) bu hesaplamayı bir türlü yapamadım..Ya bişeyler yazmaya çalışsam da hep sorun olarak karşıma seçilen gün ile günün karşısındaki saat değerinin kontrol edilerek eğer saat değeri varsa işleme katma ve o saate denk gelen günlerden oluşan bir sayma sistemi kuramamak geliyor..Artı buraya kadar ilerlemiş olsam dahi ki bu mevcut bilgilerle imkansız gibi duruyor..Saydırma işleminde o saate karşılık gelen gün Seçilen tatil gününe denk geldiği zaman es geçilerek bir sonraki seçili günden devam etme ve böylece toplam kurs saatini elde etme safhası var...Lütfen arkadaşla bu kodlamayı anlaşlılır bir şekilde özetleyerek yapabilecek arkadaşların bilgilerini hem benimle hem de öğrenmek için bir örnek teşkil edecek herkes için istirham ediyorum..
 
Bu konuda yardımcı olacak bir arkadaş yok mu? Excelin yerleşik fonksiyonları ile bir şeyler yapmaya çalıştıysam da sonuç olumsuz..Makrolarla bu olayın çözüleceği kesin ama yeterli makro bilgim olmadığından (öğrenmeye çalıştığımı da belirtmek isterim) bu hesaplamayı bir türlü yapamadım..Ya bişeyler yazmaya çalışsam da hep sorun olarak karşıma seçilen gün ile günün karşısındaki saat değerinin kontrol edilerek eğer saat değeri varsa işleme katma ve o saate denk gelen günlerden oluşan bir sayma sistemi kuramamak geliyor..Artı buraya kadar ilerlemiş olsam dahi ki bu mevcut bilgilerle imkansız gibi duruyor..Saydırma işleminde o saate karşılık gelen gün Seçilen tatil gününe denk geldiği zaman es geçilerek bir sonraki seçili günden devam etme ve böylece toplam kurs saatini elde etme safhası var...Lütfen arkadaşla bu kodlamayı anlaşlılır bir şekilde özetleyerek yapabilecek arkadaşların bilgilerini hem benimle hem de öğrenmek için bir örnek teşkil edecek herkes için istirham ediyorum..

Merhaba dosyanızda 1 Saat 2 Saat 3 Saat olrak tanımladığınız yerleri 1 2 3 olarak değiştirdim. ve birleştirilmiş hücreleri kaldırdım. dosya yaparken munkun olduğunca hücre birleştirme kullanmamanızı tavsiye ederim. Hesaplama dosyası ekte. Siz hesaplamayı bir kontrol edin yanlış varsa duzeltelim.

iyi çalışmalar.
 

Ekli dosyalar

Son düzenleme:
Hüseyin bey hazırlamış olduğunuz proje ekini göremedim ...Acaba eklemeyi mi unuttunuz?
 
Hüseyin Bey çok Teşekkür ediyorum ancak eklediğiniz dosyayı incelemeye fırsat bulamadan mesai bitti bende çıkmak zorunda olduğum için sonra inceleyeceğim..Ama herşeyden önce projenin hedefine ulaşıp ulaşmadığını bir kenara bırakırsak İLgi ve Alakanız çok Teşekkür Ediyorum...Sağolun
 
Merhaba;
Syn. Huseyinkis makrolarla bir çözüm üretmiş.
Bu ekde işlevlerle alternatif olsun.
İyi çalışmalar.
 

Ekli dosyalar

muygun bey getirmiş olduğunuz çözüm önerisi için özellikle teşekkür ederim..Fakat yerlerşik fonksiyonlardaki o kargaşa makrolardan daha göz korkutucu geldi gözüme..Hüseyin bey makro kodlarını kısacık da olsa yorumlamanız mümkün mü? en azından mantığını yani burada şu amacı güttüm şu kısımda bunu hedefledim gibisinden..Özellikle..aşağıda vereceğim kod bloğunu..tabi mümkünse açıklarsanız çok sevinirim..Çünkü diğer kod bloklarını gene iyi kötü kıt kod bilgimle yorumlamaya anlamaya çalıştım.. sadece ufak tefek mantık kargaşası yaşadım.O yüzden de diğer kısımlarda mantıksal açıklama yapmanız yeterli olacakken; bu kod bloğunda teknik oalrak bir anlam veremedim de;
A = hk.Find(What:=ayy, LookAt:=xlWhole).Row---> burası gene teknik olarak tamam giriş tarihini gün bazındaA2:B8 aralığında aratıyorsunuz..Ama sonrası zaten sonrasını mantıkende kuramadım sadece giriş tarihi değil seçilen diğer günler nasıl belirleniyor..Anlayamadım...Ksura bakmayın biraz sıkıcı gibi gelse kod bilgimdeki yetersiliğime verin..
Saat = CDbl(Cells(A, "B").Value) * 1 -----> Burasını Hiç anlayamadım..
Ksaat = Ksaat - Saat
tarih = tarih + 1
 
Kod:
[B]'Bu Bölüm Sabitler ilk veriler alınıyor.Başlangıç Tarihi ve Toplam Kurs Saati[/B]

Set hk = Sheets("hesaplama").Range("A2:A8") 
Tarih = Range("D2").Value    'Başlangıç Tarihine Tarih ismini veriyoruz.
Ksaat = Range("F2").Value   'Kurs saatine KSaat

[B]'Buradaki Bas: tanımlama komutu tekrar buraya yonlendirme için kullanıcağız[/B]
[B]'Bas: tanımlamasını sabitlerin alt kısmınına koydum çünkü sabitlerde işlem yapıp tekrar çalıştırırsak işlem iptal olur. [/B]

[B]bas:[/B]
[B]'formula baslarken Ksaat 0 tan kucuk veya aşitese son: git işlem bitti diyoruz. [/B]
If Ksaat <= 0 Then
GoTo son:
End If

[B]'elimizdeki tarihin gününü alıyor rakamsal değil metinsel Cuma,Pazar Gibi [/B]
ayy = Format(Tarih, "dddd")

[B]'Burada Tarih izin günlerinde varmı diye saydırıyoruz[/B]
denem = WorksheetFunction.CountIf(Sheets("tatiller").Range("A2:J1150"), Tarih)

[B]'Burdada sizin saat belirttiğiniz yerde o gün varmı diye saydırıyoruz[/B]
gun = WorksheetFunction.CountIf(Sheets("hesaplama").Range("A2:A8"), ayy)

[B]'şimdi dongu zamanı eğer siz baslangıç tarihi için kurs saati belirlemediyseniz ve tatil günlerinde  yoksa Başlangıç tarihinin bir gün sonrasını al ve hesaplama için başa don.[/B]

If gun = 0 Or denem > 0 Then
Tarih = Tarih + 1
GoTo bas:

[B]'eğer siz ogun için kurs saati verdiyseniz ve tatil gunu değilse[/B]
[B]'A = Hk  formulu   A nın değerini A2:A8 arasında günü ara ve satır numarası yap. Yani Gün Çarşamba ise siz A4 e yazmıştınız A sutun değeri 4 satır(Row) değeri bize burda  A=4 diyecek [/B]

[B]' Saat=Cdbl formulunde ise yukarıda A=4 tanımlamıştık burda diyoruzki B4 hücresinin içerisinde yazan rakamı saat olarak tanımla *1 sadece rakamları medin görmesin diye konulmuş bir işlem bir sayının 1 ile çarpımı yine aynı sayı:)[/B]

[B]'Ksaat=Ksaat-Saat   toplam kurs saatinden o günkü kurs saatini çıkarıyoruz siz çarşamba için 2 saat demiştiniz. Yeni Ksaat=360-2 yaptıkburda[/B]

[B] Tarih = Tarih +1   saat gibi sadece tarihi ertesi güne aldırıp Goto Bas: başa don diyoruz [/B]
Else
A = hk.Find(What:=ayy, LookAt:=xlWhole).Row 
Saat = CDbl(Cells(A, "B").Value) * 1
Ksaat = Ksaat - Saat
Tarih = Tarih + 1
GoTo bas:
End If

[B]son:[/B]

Range("K4").Value = Tarih - 1

End Sub


Anlatma konusunda pek iyi sayılmam inşallah net anlatabilmişimdir. Kısa olarak bugune bakıyor kırıterlere uymuyorsa basa donup ertesi güne bakarak devam ediyor.Kıritere uyuyorsa işlem yapıp ertesi günü alıp bas donuyor.Taki Ksaat 0 olana kadar.
 
Hüseyin bey yapmış olduğunuz açıklamaları sindirmeye ve anlamaya çalışıyorum..O yüzden size hemen dönüt veremedim..Kafamda kodların oturması için sanırım birkaç kez daha yazıp çizdikten, sizin yapmış olduğunuz açıklamaları hece hece okuduktan sonra hala pürüz olan yerler olursa size sormamda bir mahsuru olamyacaktır İnşaallah..Ama şu kadarını belirteyim ki aslında hiç de iyi bir anlatım yapamam diyen birisi için gayet başarılı bir anlatım yapmışınız..Teşekkürler..sadece benim kodlamanın başında olan birisi oalrak bu kadar veriyi ve bilgiyi içselleştirmem biraz zaman alacak..O kadar da olacak diye düşünüyorum..Öğretmen olarak örnek vermem gerekirse sınıf da öğrencilerime okuma yazmayı öğretirken nasıl zorlandılarını yakinen biliyorum..Ve Şimdi daha iyi anlıyorum...
 
Hüseyin bey tekrardan merhaba iş güç yoğunluk derken yazdığınız kodları gerçekten her bulduğum fırsatta anlamaya ve zihnimde iyice yerleştirmeye çalıştım..Şuan güzel herşey anlaşılır pozisyonda..tabi sizin anlatımınızın katkısını belirtmeme gerek bile yok..yani zihnimde bilgiler bir denge içerisinde duruyor ama heran sarsılıp bozulmaması için..Bu sefer de şöyle bişeyi denemeye karar verdim..Bİlemiyorum tabi ne ölçüde başarılı olacağım..Olay bu sefer tersten işliyecek; yani kursun başlangıç zamanı olacak, bitiş zamanı olacak(Bitiş zamanı kursun yapılacağı günlerden bir günü ileri tarihli olarak elle belirleyeceğiz), kursun yapılacağı günler ve saatler olacak ve gene tatillerimiz de olacak..olmayan ve hesaplanması gereken bu sefer kursun toplam saati olacak..Ben bu proje üzerine sizden aldığım ışık ile gideceğim..dediğim gibi ne kadar başarılı olurum bilemiyorum..Ama başaramazsam sizden tekrar yardım talebinde bulunacağım..Tabi talep bizden karşılık sizden..Müsait olma ve istekleriniz doğrultusunda..
 
Hüseyin bey tekrardan merhaba iş güç yoğunluk derken yazdığınız kodları gerçekten her bulduğum fırsatta anlamaya ve zihnimde iyice yerleştirmeye çalıştım..Şuan güzel herşey anlaşılır pozisyonda..tabi sizin anlatımınızın katkısını belirtmeme gerek bile yok..yani zihnimde bilgiler bir denge içerisinde duruyor ama heran sarsılıp bozulmaması için..Bu sefer de şöyle bişeyi denemeye karar verdim..Bİlemiyorum tabi ne ölçüde başarılı olacağım..Olay bu sefer tersten işliyecek; yani kursun başlangıç zamanı olacak, bitiş zamanı olacak(Bitiş zamanı kursun yapılacağı günlerden bir günü ileri tarihli olarak elle belirleyeceğiz), kursun yapılacağı günler ve saatler olacak ve gene tatillerimiz de olacak..olmayan ve hesaplanması gereken bu sefer kursun toplam saati olacak..Ben bu proje üzerine sizden aldığım ışık ile gideceğim..dediğim gibi ne kadar başarılı olurum bilemiyorum..Ama başaramazsam sizden tekrar yardım talebinde bulunacağım..Tabi talep bizden karşılık sizden..Müsait olma ve istekleriniz doğrultusunda..

Yapmak istediğiniz işlem için gerekli bütün kodlar nerdeyse hepsi önceki dosyada mevcut.

Bence bu proje için parça parça bilgi isteyerek ilerlersek öğrenmeniz açısındanda daha iyi olur gibi geliyor.

İyi Çalışmalar.
 
Hüseyin bey; haklısınız önceki dosyadan esinlenerek demiyeceğim, Allah Razı Olsun sayenizde kavradığım mantık ile bir düzenleme yaptığımda istenilen hesaplama yapıldı..Tekrar tekrar teşekkürlerimi sunarken...İyi çalışmalar diliyorum sizlere..Bu arada ilgilenen arkadaş olursa diye de yapılan düzenlemeyi paylaşıyorum;

Sub toplam_saat()
Dim saatTop As Double
saatTop = 0

Set hk = Sheets("hesaplama").Range("A2:B8")
baslangic = Range("D2").Value
bitis_tar = Range("D5").Value
bas:
If baslangic > bitis_tar Then
GoTo son:
End If
gun = Format(baslangic, "dddd")
tatillerde_ara = WorksheetFunction.CountIf(Sheets("tatiller").Range("A2:J1150"), baslangic)
gunlerde_ara = WorksheetFunction.CountIf(Sheets("hesaplama").Range("A2:A8"), gun)
If gunlerde_ara = 0 Or tatillerde_ara > 0 Then
baslangic = baslangic + 1
GoTo bas:
Else
satir_al = hk.Find(what:=gun, lookat:=xlWhole).Row
saat = CDbl(Cells(satir_al, "B").Value) * 1
saatTop = saatTop + saat
baslangic = baslangic + 1
GoTo bas:
End If
son:
Range("F6").Value = saatTop
End Sub

 
Son düzenleme:
hüseyin bey eğer vaktiniz olur da ilgilenebilirseniz sevinirim; Kodları pratik yaparak daha kalıcı bir şekilde öğrenme adına yapmaya çalıştığım bir projede çok ilginç bir hata ile karşılaşıyorum ..Örnek dosya mesajın ekinde sunulacaktır..Fakat kısaca özünden bahsetmek gerekirse; aranacak metin girişi yapacağımız bir hücre var buraya isimler listesinden bir isim girildiğinde ve butona tıklandığında o ismin karşısında bulunan veri mesajbox'da görüntüleniyor..Aslında sorun yok gibi ama ilk ver olan "mustafa" ismini girdiğimiz zaman ilk veri olan "elma" yerine onu geçiyor ve ondan sonraki veri olan "şeftali" verisini msgbox'da görüntülüyor..Sebebi nedir anlayamadım yardımcı olursanız sevinirim..
 

Ekli dosyalar

hüseyin bey eğer vaktiniz olur da ilgilenebilirseniz sevinirim; Kodları pratik yaparak daha kalıcı bir şekilde öğrenme adına yapmaya çalıştığım bir projede çok ilginç bir hata ile karşılaşıyorum ..Örnek dosya mesajın ekinde sunulacaktır..Fakat kısaca özünden bahsetmek gerekirse; aranacak metin girişi yapacağımız bir hücre var buraya isimler listesinden bir isim girildiğinde ve butona tıklandığında o ismin karşısında bulunan veri mesajbox'da görüntüleniyor..Aslında sorun yok gibi ama ilk ver olan "mustafa" ismini girdiğimiz zaman ilk veri olan "elma" yerine onu geçiyor ve ondan sonraki veri olan "şeftali" verisini msgbox'da görüntülüyor..Sebebi nedir anlayamadım yardımcı olursanız sevinirim..

Sanırın find komutunun yapısından kaynaklan bir problem daha once dikkat etmemiştim. ilk satırda sanırım başlık var gibi hareket ediyor.
 
Peki hüseyin bey bu sorunun çözümü var mı?

: tabiki ayrı birkod yazabiliriz veya kısa çözüm olarak başlık eklerseniz yani A1 be B1 hücrelerine A1 = Adı B1 = Meyve Adı gibi başlık eklerseniz işlem çözülecektir. Kodlarda değişiklik yapmayın.
 
Geri
Üst