• DİKKAT

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

Döngü sorunu

Tekrar merhaba.

Belgeniz ve userformlar Almanca olduğundan ne olduğu / ne olmadığını anlamak için deneme yanılmadan başka seçenek kalmıyor bana.
Malesef Almanca bilgim yok, İngilizce olsaydı keşke.

-- Sayfa kodlarının başında Option Explicit oyduğuna göre sayfalarda işlem yapacak kodların tümünde,
kullanılan değişkenlerin ilgili kod'un başlığının ardından tanımlanmış olması gerekiyor.
Aşağıdaki konu sayfasında Sayın alpi'nin konuya ilişkin açıklamaları var,
konu sayfasına bakıp, ona göre de belgedeki kodlarda değişken tanımlamaları yapılmalıdır.

Nedir şu Option Explicit-Option Base-Option Compare

-- Ayrıca seri sorular yerine adım adım gitmekte yarar görüyorum.
İlk fark ettiğim şey userform kodlarında, boş geçilmemesi zorunlu alanlar/nesneler varsa (TextBox3 ve TextBox4 gibi),
işlem düğmesi kodlarının başında,
bu nesnelerin dolu/doğru veri türünde veri girişi yapılmış olup olmadığının kontrol edilmesi,
eksik/yanlış bilgi varsa MsgBox uyarısı ve SetFocus gibi kodlarla doldurulması gereken alana odaklanılmasının sağlanması yerinde olur.

Yukarıda belirttiğim gibi önce kullanılan değişkenlerin, ilgili kodların başında
Dim....As.... şeklinde tanımlamalarını yapıp ondan sonra deneyin, oluşan sorunları adım adım sorun isterseniz (örnek belgeyi de buna göre yenileyin tabi).

"bazı makrolar düzenli çalışmıyor" derken muallak olmuş, hangi kod/kodlar onu netleştirin isterseniz.

Bir de belgenin genel akışını pek anlamadım.
Belgenin/userformların kullanım aşamalarını adımlar halinde biraz açıklarsanız (senaryo)
daha iyi olur ve ilk adımdan başlayarak sorunlar çözülmeye başlanabilir ve böylece daha sağlıklı ve geriye dönmeden ilerlemek mümkün olur kanaatindeyim.

Son cevabınızın son kısmındaki "Sizin yaptığınız dosyada değiştirmek istediğim..." diye başladığınız kısıma bakarım.

Bir konuyla ilgilenmeye başladığımıza göre devam edeceğiz demektir.
.
 
Merhabalar Ömer bey,

Dediğiniz gibi değişkenleri tanımladım. Öncelikle programı biraz anlatayım. Önemli olan kısım şuanda Prozess1 olduğu Userform.

- İlk olarak en üstte açılan "başlangıç saati" (örneğin=00:00) ve "Zaman aralığı" (örneğin=15) buradaki veriler girildikten sonra, rastgele birgünlük elektrik fiyatı listesi oluşuyor. Program şuanda deneme aşamasında olduğu için böyle birşey öngördüm.

-Daha sonra aşağıdan firmadaki mesai sayıları giriliyor, ürün ve adetleri giriliyor. Herürün eklendikten sonra bizim databankımızdaki üretim sürelerini vs. alarak bize günlük üretim planlaması sağlıyor. Buraya kadar standart bir program. Bunları normalde makrosuz kullanabiliyordum.

-Ancak "Druckluftbedarf" sayfasında elektrik fiyatlarınıda alarak(sizin hazırladıgınız kodlar yardımıyla) üretimi elektrik fiyatlarına göre planyacağız. Yani elektrik ucuz olduğunda elektrik gideri fazla olan ürünlerin üretilmesini sağlayacağız. Güç aktarımı gibi düşünülebilir.

-Berechnung sayfasıda, ürün planının yazdırıldıktan sonra nasıl görüneceğini gösteriyor. İşçilerinde anlayabileceği şekilde tasarlanacak. Genel hatlarıyla program bundan ibaret.

Buarada evet haklısınız, textboxlar boşken herhangi bir uyarı gelmiyor yahut yanlış bir ürün girildiğinde onun içinde uyarı verilmiyor.

Düzenli çalışmayan makroları göstermek için rastgele bir ürün ekledim. Druckbedarf sayfasında I7 hücresinde görebilirsiniz. Ancak aynı anda ürün,sayı ve ta yı vlookuptan getirmedi. Yani J,K,L hücreleri boş kaldı. M hücreside Npt'yi hesaplayamadı. (Ta:Bir parça için üretim süresi)

Ancak Vba'ya girip tek tek makroları çalıştırsam düzeliyor. Yani bir yerde eksiklik yapmışım muhtemelen.

Şimdiden teşekkürler.
 

Ekli dosyalar

Tekrar merhaba.

Önce bir not; SAAT_EKLE kod blokunun başındaki Dim ilksatir As Range kısmı Integer olması lazım.

İlk olarak, SUREC adlı kod'daki aşağıdaki satırı silin veya sol başına TEK TIRNAK ekleyerek etkisiz hale getirin,
(kullandığınız produkt adlı kod'un P sütununa yazdığı değerler daha sonra lazım olmayacak varsayıyorum)
ardından da DAGITIM_DK adlı koddaki sütun adlarını (benim gönderdiğim belgeyi de aynı anda açıp mukayese ederek) kontrol edin.
.
Kod:
'brn.Range("P1:P" & son).Copy: brn.[Q1].PasteSpecial Paste:=xlPasteValues
Bu işlem sırasında S sütununun önceki işlemden kalan ARTIK dakika için ayrıldığını, dağıtımın aslında T sütunundan başladığını unutmayın.
.
 
Merhabalar tekrar,

Sürec'teki değişikliği yaptım. Ancak "P"sütunu süreci hesaplamada kullanılıyor. Tekrar sayısı*60*0.25(elektrik fiyatları arasındaki süre farkı). Aslında formülde bir yanlışlık var burada 0.25 olmamalı, onun yerine "stammdaten" sayfasındaki, K ve J sütunları arasındaki zaman farkını alarak işleme tabi tutmalı.

Bundan sonraki dediğiniz işlemleri henüz yapmadım çünkü "P" sütunu dediğim gibi bir işlevi var. Ne yapmamı önerirsiniz acaba?
 
Şu an bilgisyar başında değilim, mola verdim.
Sütnları bir kaydırmak gerekiyor demektir.
Ya da benim belgede ÖZET BİLGİ için diye belirterek BOŞ bıraktığım R sütunundan vazgeçip, P, Q yu Q R ye kaydırmak çözüm olur.
Biraz (1 saat kadar) sonra bilgisayar başına geçip tekrar bakarım.
 
Tamam Ömer bey zamanınız olduğunda bakarsanız bende ona göre düzeltmeleri yaparım.
 
Merhbalar tekrar,

Dediğiniz gibi kontrol ettim bir yerde hata vardı onu düzelltim. Hepsini bir sütun kaydırdım birtek "I1" hücresinden gösterim için aldığı kodu "H2" ye yazdırdım. Sanırım o değişecek zaten.
 
Ben de tüm kodları gözden geçirip formdaki SAAT ve SAYI tektboxlarına ilişkin ilaveler yaptım.
Berazdan bilgisayar büşına gaçerim.
 
Ömer bey merhabalar,

Kodu düzenleyip tek bir modülde birleştirdim. Şuanda buraya kadar sorunsuz çalışıyor. İlk baştaki "with" kısmında hata verdiği için kısaltmaları (s1,s2..) kullanamadım.


Kod:
Option Explicit

Sub hesap()
Dim z, k, p As Long
Dim i, t, aaa As Integer
Dim lz1, lz2, ss As Long
Dim s1, s2, s3 As Worksheet

Set s1 = Sheets("berechnung")
Set s2 = Sheets("druckluftbedarf")
Set s3 = Sheets("stammdaten")

With ThisWorkbook.Worksheets("druckluftbedarf")
        z = ThisWorkbook.Worksheets("druckluftbedarf").Cells(.Rows.Count, "B").End(xlUp).Row + 1
        k = ThisWorkbook.Worksheets("Archiv").Cells(.Rows.Count, "B").End(xlUp).Row + 1
        p = ThisWorkbook.Worksheets("Archiv").Cells(.Rows.Count, "D").End(xlUp).Row + 1
        ThisWorkbook.Worksheets("druckluftbedarf").Cells(z, "B") = Berechnung.TextBox1.Value
        ThisWorkbook.Worksheets("druckluftbedarf").Cells(z, "C") = Berechnung.TextBox2.Value
        ThisWorkbook.Worksheets("Archiv").Cells(k, "A") = Berechnung.TextBox1.Value
        ThisWorkbook.Worksheets("Archiv").Cells(k, "B") = Berechnung.TextBox2.Value
        ThisWorkbook.Worksheets("Archiv").Cells(p, "D") = Date
        ThisWorkbook.Worksheets("Archiv").Cells(p, "E") = Time
End With

lz1 = s1.Cells(Rows.Count, "A").End(xlUp).Row
lz2 = s2.Cells(Rows.Count, "B").End(xlUp).Row

For t = 2 To lz2
s2.Cells(t, "D") = WorksheetFunction.Vlookup(s2.Cells(t, "B"), s3.Range("A3:g24"), 5, 0)
s2.Cells(t, "E") = WorksheetFunction.Vlookup(s2.Cells(t, "B"), s3.Range("A3:g24"), 6, 0)
Next t

      For t = 2 To Sheets("druckluftbedarf").Cells(Rows.Count, "B").End(3).Row
      If Sheets("druckluftbedarf").Cells(t, "B") <> "" Then
         aaa = (Sheets("druckluftbedarf").Cells(t, "D") + Sheets("druckluftbedarf").Cells(t, "E")) * Sheets("druckluftbedarf").Cells(t, "C")
         Sheets("druckluftbedarf").Cells(t, "A") = (Sheets("druckluftbedarf").Cells(t, "D") + Sheets("druckluftbedarf").Cells(t, "E")) * Sheets("druckluftbedarf").Cells(t, "C")
      End If
      Next t

ss = s2.Range("A" & Rows.Count).End(3).Row
If ss = 1 Then GoTo 10
s2.Range("I2").Resize(ss - 1, 1).Value = s2.Range("A2:A" & ss).Value
s2.Range("I2:I" & ss).Sort Key1:=s2.Range("I2:I" & ss), Order1:=xlDescending, Header:=xlNo
10


For t = 2 To lz2
s2.Cells(t, "J") = WorksheetFunction.Vlookup(s2.Cells(t, "I"), s2.Range("A2:E50"), 2, 0)
s2.Cells(t, "K") = WorksheetFunction.Vlookup(s2.Cells(t, "I"), s2.Range("A2:E50"), 3, 0)
s2.Cells(t, "L") = WorksheetFunction.Vlookup(s2.Cells(t, "J"), s3.Range("A3:g24"), 2, 0)
Next t

      For t = 2 To Sheets("druckluftbedarf").Cells(Rows.Count, "B").End(3).Row
      If s2.Cells(t, "B") <> "" Then
         s2.Cells(t, "M") = s2.Cells(t, "K") * s2.Cells(t, "L")
      End If
      Next t
      
s2.Range("J2:K14").Copy s1.Range("A8:B20")
s3.Range("N1:O50").Copy s2.Range("N2:O51")

 On Error Resume Next
      For t = 2 To s2.Cells(Rows.Count, "P").End(3).Row
      If s2.Cells(t, "I") <> "" Then
         s2.Cells(t, "P") = s2.Cells(t, "O") * 0.25 * 60          'burada bir hata var, 0.25 olmamalı. Onun yerine Saatler arası fark olmalı
      End If
      Next t

End Sub
 
Merhaba.

Son cevabınızı görmeden bir adet özel mesaj yazmıştım.
Yeni halini deneyeceğim.
 
-- Biraz denemeler yaptım.
-- Bazı düzeltmeler de yaptım
(örneğin saat textboxları üzerinden hesaplanan dakika aralıklarına göre saatler listesini ZEİT sayfasına aktarıp
fiyata göre artan sıralanması, bir tane rastladığım sayfa.select kodunu iptal edip buna uygun bir kod satırı düzeltmesi gibi...
)

-- Gördüğüm bir husus, Druckluftbedarf sayfasında,
A sütunu büyükten küçüğe sıralanmış şekilde, I sütununa aktarılıyor bu tamam,
-- Ancak N sütunu (elektrik fiyatı) ilk konu açılışından bu yana hep küçükten büyüğe sıralı iken
şimdi sıralı değil, bunun DAĞITIM işlemine etkileri olacaktır. bilemiyorum tabi.
.
 
Merhabalar,

Evet haklısınız bende şimdi farkettim. N sütunu bu yazdığımız kodlarda değil Userform içerisindeki "Liste yap" butonu altında düzenleniyor. Orada bir hata var muhtemelen.
 
Sizin stamdaten sayfasında N:O hücreleri için yaptığınız işlemi yaptırmayıp,
aşağıdaki gibi bir kod ile Zeit sayfasında (orası zaten fiyata göre sıralı idi)
uygulanacak GELİŞMİŞ FİLTRE koduyla Druckluftbedarf sayfası N:O sütununa veriler aşağıdaki gibi alınabilir.

Bence doğru işlem bu.
.
Kod:
Sub N_O_LISTE()
Dim sat As Integer
Sheets("Zeit").Range("C1:C" & Rows.Count).AdvancedFilter Action:=xlFilterCopy, _
    CopyToRange:=Sheets("Zeit").Range("E1"), Unique:=True
For sat = 2 To Sheets("Zeit").Cells(Rows.Count, "E").End(3).Row
    Sheets("Zeit").Cells(sat, "F") = _
    WorksheetFunction.CountIf(Sheets("Zeit").[C:C], Sheets("Zeit").Cells(sat, "E"))
[C:C], Sheets("Zeit").Cells(sat, "E"))
Next
Sheets("Zeit").Range("E2:F" & Sheets("Zeit").Cells(Rows.Count, "E").End(3).Row).Copy
Sheets("Druckluftbedarf").[N2].PasteSpecial Paste:=xlPasteValues
End Sub
 
Merhabalar Ömer bey,

Evet haklısınız orada bir sıkıntı vardı bencede. Ayrıca bütün zaman bilgilerinin bir yerde olması daha uygun olacaktır. En mantıklısı yazdığınız şekilde bencede bu yöntem. Tekrar teşekkürler.
 
Tekrar merhaba.
E-posta hesabınızı kontrol ediniz.
 
Merhaba Sizden saniye ve sayı ile çarpma formülünü mesela bir vardiya 480 dakika makine 1 tur 0:01:52,7 sürede döüyor, bir vardiyada 300 tur yaptığı zaman kaç saat/dakika yapar bulamadım. Şimdiden Teşekkürler.
 
Geri
Üst