• DİKKAT

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

VBA Procedure To Large Hatası

snapper

Altın Üye
Katılım
3 Eylül 2014
Mesajlar
9
Excel Vers. ve Dili
2013 - türkçe
Arkadaşlar merhaba,

Vba ya yeni başladığım için kendi çabam ile bir şeyler yapmaya çalıştım fakat bir yerde takıldım.Sizlerden yardımcı olmanızı rica edeceğim.

Sorunum ise ;

Operatörler tarafından saat başı girilmesi gereken veriler bulunmakta, güncel tarih ve güncel saat koydum, hesapla butonuna ise yapılacak işlemleri ve tarih ve saate göre kaydedilecek yer için gerekli kodları yazdım.

tarih textboxtun da ki değere göre G1,G2,G3 ......... G31 sayfalarına (31 GÜN)
saate göre ise seçilen sayfada ki A1,A2,A3,..........,A24 satırlarına( 24 saat) veri kaydetmek istiyorum.

Bunu bir şekilde yaptım fakat, denediğim yöntem çok uzun olduğu için
procedure to large hatası alıyorum.


Örneğin tarihin 01 Şubat 2016, saatin ise 01:00 olduğunda ki hesapla butonunun yapacağı işlemler;


If tarih.Caption = "01 Şubat 2016" Then
If saat.Caption = "01:00" Then
If Sheets("G1").Range("A3") = "" Then
Sheets("G1").Range("A" & 3).Value = saat.Caption
Sheets("G1").Range("L" & 1).Value = Format(Date, "dd.mm.yyyy")
Sheets("G1").Range("B" & 3).Value = skipsayısı.Text
Sheets("G1").Range("C" & 3).Value = skipkilosu.Text
Sheets("G1").Range("D" & 3).Value = kmiktarı.Text
Sheets("G1").Range("E" & 3).Value = smiktarı.Text
Sheets("G1").Range("F" & 3).Value = kkalori.Text
Sheets("G1").Range("G" & 3).Value = skalori.Text
Sheets("G1").Range("H" & 3).Value = dönüşüm.Text
Sheets("G1").Range("I" & 3).Value = ortalama.Caption
Sheets("G1").Range("J" & 3).Value = ytoplam.Caption
Sheets("G1").Range("K" & 3).Value = taş.Caption
Sheets("G1").Range("L" & 3).Value = bkalori.Caption
Sheets("G1").Range("M" & 3).Value = kireç.Caption
Else
MsgBox "Daha Önce Giriş Yaptınız.!"
End If
Else
End If
Else
End If


Bu işlemi hata almadan nasıl yapabilirim ?
Yardımlarınız için şimdiden çok teşekkür ederim...
 

Ekli dosyalar

Yardımcı olabilecek bir arkadaş yok mu acaba?
 
userform'un kodlarını notepad++'a kopyaladım. boş satırlar da dahil 16000 satırdan fazla kod var.
maşallah.

1- vba'e iyice hakim olmadan komplex kod yazma işine hiç bulaşmayın.
2- kod yazarken standart olun. değişkenleri ya hep tanımlayın (önerilir) ya hiç tanımlamayın.
3- nesnelerin ya hepsine isim verin ya da bırakın oldukları gibi kalsınlar.

şöyle bir hücre referansını kim gösterdi acaba: gece1.Caption = .Range("I" & 29).Value
eğer satır numarası bir hesaplamaya dayanmıyorsa doğrudan yazın:
gece1.Caption = .Range("I29").Value

formda ComboBox1 adında bir kontrol göremedim. dolayısı ile test etme imkanım olmadı.

ben 2 olay kodunu düzenledim. tamamını bu kodlardaki mantığı kullanarak siz yeniden yazacaksınız. deneme yanılma ile bulacaksınız. ben daha fazlasına bakmam. ona göre. :D
 
Kod:
Private Sub Akşam_Click()

    gun = Day(CDate(ComboBox1.Text))
    
    With Sheets("G" & gun)
        gece1.Caption = .Range("I29").Value
        gece2.Caption = .Range("K29").Value
        gece3.Caption = .Range("M29").Value
        gece4.Caption = .Range("D29").Value
        gece5.Caption = .Range("E29").Value
    End With

End Sub

evet tüm kod bu kadar olmalı. vba'de tarihlerin ABD tarih formatında olduğunu unutmayın. yani AA.GG.YYYY
bu nedenle üzerinde çalışmak gerekebirlir.
 
Kod:
Private Sub CommandButton4_Click()

    If skipsayısı.Text <> "" Then
        MsgBox "Skip Sayısını Girmeniz Gerekiyor"
        Exit Sub
    End If
    
    If skipkilosu.Text <> "" Then
        MsgBox "Skip Kilosunu Girmeniz Gerekiyor"
        Exit Sub
    End If
    
    If kmiktarı.Text <> "" Then
        MsgBox "Sıvı Yakıt Miktarını Girmeniz Gerekiyor"
        Exit Sub
    End If
    
    If smiktarı.Text <> "" Then
        MsgBox "Katı Yakıt Miktarını Girmeniz Gerekiyor"
        Exit Sub
    End If
    
    If kkalori.Text <> "" Then
        MsgBox "Katı Yakıt Kalorisini  Girmeniz Gerekiyor"
        Exit Sub
    End If
    
    If skalori.Text <> "" Then
        MsgBox "Sıvı Yakıt Kalorisini Girmeniz Gerekiyor"
        Exit Sub
    End If
    
    If dönüşüm.Text <> "" Then
        MsgBox "Dönüşüm Oranını Girmeniz Gerekiyor"
        Exit Sub
    End If

     ytoplam.Caption = Val(smiktarı) + Val(kmiktarı)
     taş.Caption = Val(skipsayısı) * Val(skipkilosu)
     bkalori.Caption = (((Val(kmiktarı) * Val(kkalori)) + (Val(smiktarı) * Val(skalori))) / (Val(smiktarı) + Val(kmiktarı)))
     kireç.Caption = (Val(skipsayısı) * Val(skipkilosu)) / Val(dönüşüm)
     ortalama.Caption = ((((Val(kmiktarı) * Val(kkalori)) + (Val(smiktarı) * Val(skalori))) / (Val(smiktarı) + Val(kmiktarı))) * Val(dönüşüm) * Val(ytoplam)) / (Val(skipsayısı) * Val(skipkilosu))
    
    gun = Day(CDate(tarih.Caption))
    saat = CLng(Replace(saat.Caption, ":00", "")) + 2
    If saat = 2 Then saat = 26
    
    With Sheets("G" & gun)
        If .Range("L1").Value = "" Then .Range("L1").Value = Format(Date, "dd.mm.yyyy")
        If .Range("A" & saat) = "" Then
            .Range("A" & saat).Value = saat.Caption
            .Range("B" & saat).Value = skipsayısı.Text
            .Range("C" & saat).Value = skipkilosu.Text
            .Range("D" & saat).Value = kmiktarı.Text
            .Range("E" & saat).Value = smiktarı.Text
            .Range("F" & saat).Value = kkalori.Text
            .Range("G" & saat).Value = skalori.Text
            .Range("H" & saat).Value = dönüşüm.Text
            .Range("I" & saat).Value = ortalama.Caption
            .Range("J" & saat).Value = ytoplam.Caption
            .Range("K" & saat).Value = taş.Caption
            .Range("L" & saat).Value = bkalori.Caption
            .Range("M" & saat).Value = kireç.Caption
        Else
            MsgBox "Daha Önce Giriş Yaptınız.!"
        End If
    End With

End Sub

evet. 10000 satırlık kod da bu kadar olmalı. düzenlemek, üzerinde çalışmak gerekebilir.
daha da kısaltılabilir ama kafa karıştırmak istemem. :D
 
Son düzenleme:
ben mantığı verdim gerisini siz deneyerek, üzerinde çalışarak bulacaksınız.

kolay gelsin.

bu 2 kod dışında kod yazmam. ama ihtiyaç duyarsanız sorulara cevap verebilirim. foruma çok sık giremediğimi dikkate alın yalnız.

diğer üyelerimiz de yardımcı olacaklardır.
 
mancubus merhaba,

With Sheets(gun & ay)
bu formatta nasıl yapabilirim acaba?
 
gun = Day(CDate(tarih.caption))
ay = Month(CDate(tarih.caption))

With Sheets(gun & ay)

bu şekilde yaptım sayfa ismini de 282 yaptım oldu sanırım :)
 
rica ederim.

evet ay bilgisi o şekilde elde edilir.

ben kendi hesabıma ay bilgisini bir yerde kullanacaksam, standart olması için iki hane olarak kullanırım.

yani 1-9 ayları 01-09 şeklinde:
ay = Format(Month(CDate(tarih.caption)), "00")

keza günü de aynı şekilde yaparım:
gun = Format(Day(CDate(tarih.caption)), "00")

hatta ikisinin arasına bir karekter eklerim, ki bu genelde alt çizgi olur. bu takdirde sayfa ismi gg_aa şeklinde olur. bu şekilde isimlendirilmiş bir sayfaya referans verdiğimizde kullanım da benzer olur:
With Sheets(gun & "_" & ay)

ve bunlar pek değişmeyen şeyler olacaksa hiç değişken kullanmadan doğrudan yazarım.
With Sheets(Format(Day(CDate(tarih.caption)), "00") & "_" & Format(Month(CDate(tarih.caption)), "00"))

ama değiken kullanmak ta yazımı kolaylaştırabilir. ilerledikçe zaten kişi kendi stilini oluşturmaya başlıyor. yer çekimini keşfetmiyoruz. yıllar içinde uzmanların geliştirip kullanıma sundukları kod ve stillerden kendimize uygun olanıları kullanmaya başlıyoruz.

kolay gelsin.
 
Geri
Üst