Excel'de ProgressBar Nesnesi / Bir İşlemi Yaparken Kalan Süre Gösterme Objesi

'Resimli Program Anlatımı' forumunda Siraç tarafından 16 Nisan 2009 tarihinde açılan konu

  1. Siraç

    Siraç Site Yetkilisi Admin Editör

    Excel'de ProgressBar Nesnesi / Bir İşlemi Yaparken Kalan Süre Gösterme Objesi konusu ProgressBar Nesnesi / Bir İşlemi Yaparken Kalan Süre Gösterme Objesi

    Bir işlem yapılırken kalan sürenin ne kadar olduğunu gösteren görsel bir objedir. Bunun yanında bu zamanı yüzde değeri ile de göstermek mümkündür.

    ProgresBar VBA’nın Toolbox penceresinin kontrolünde standart olarak bulunmaz. Bunu eklemek için Additional Controls penceresinden Microsoft ProgressBar’ın en son versiyonunu işaretleyin.

    [​IMG]
    Şekil-1: Microsoft ProgressBar’ı eklemek.

    Daha sonra bir tane UserForm ekleyin ve UserForm’un üzerine bir tane ProgressBar bir tane de CommandButton çizin (Şekil-2)

    [​IMG]
    Şekil-2: UserFormu’n görüntüsü

    Formun initialize olayına ProgressBar’ın maksimum ve minimum değerlerini şu kodu yazarak girelim.

    Private Sub UserForm_Initialize()
    ProgressBar1.Max = 1000
    ProgressBar1.Min = 1
    End Sub

    CommandButton’nun click olayına da şu kodları yazalım.

    Private Sub CommandButton1_Click()
    Dim i As Integer

    For i = 1 To 1000
    ProgressBar1.Value = i
    Next i
    End Sub

    Kodları çalıştırın ve bir deneyin.


    İLİŞKİLER

    ProgresBar.Value
    ProgresBar.Max

    Burada şunu belirtmek isterim ProgressBar’ın maksimum değeri ile ProgressBar’ın valuesinin son sayısına eşit olduğunu görüyorsunuz. Genelde bir işlemin ne kadar süreceği %100 şeklinde gösterildiğinden ProgressBar’ın maksimum değeri genel olarak 100 belirlenir. Bu şekilde olursa ProgressBar’ın value'sinin son değerini 100’e tamamlamak gerekir.

    Küçük bir örnek verip açıklamaya çalışırsak.

    ProgressBar.max = ProgressBar.value

    ProgresBar.max=100 olursa ProgressBar.value= ? kaç olmalıdır. İşte burada i döngüsünün son sayısını kaça bölmek gerekir ki sonuç ProgressBar’ın maksimum değerine eşit olsun aranır. Sonuç 10’dur. Ve ProgressBar’ın değeri ProgressBar.value=i/10 olur. Bunu sürekli hesaplamaktansa bu değeri standart hale getirip yazacak olursak sonuç şu şekilde olur.

    ProgressBar.value=(i/i döngüsünün son değeri)*ProgressBar’ın maksimum değeri yani;

    ProgressBar.value=(i/1000)*100

    ProgressBar’ın valuesi ile ProgressBar’ın maksimum değeri arasındaki ilişkiyi anladıysak kodları değiştirin ve tekrar çalıştırın. Ekrana şu hata mesajını alacaksınız (Şekil 3).

    [​IMG]
    Şekil-3: ProgressBar minimum değer hatası

    ProgressBar’ın Minimum değeri ile Döngünün Son Değeri ilişkisi

    Şimdide ProgressBar’ın minimum değeri ile ilgili hata mesajını aldık. Çünkü ProgressBar’ın değerinin her artışı (i/1000)*100=0,1 dir. Oysaki bizim ProgressBar’ın minimum değeri 1 dir. Burada yapacağınız tek şey var ya maksimum değeri artırarak yada minimum değeri düşürerek minimum değer ile maksimum değerin çarpımını döngünün son sayısına eşitlemek. Buradan şu sonuç çıkıyor. ProgressBar’ın minimum değeri ile ProgressBar’ın maksimum değerinin çarpımı döngünün son sayısına eşit olmak zorunda. Yukarıda genellikle maksimum değer için 100 kullanıldığı için minimum değeri düşürelim. Kaç yazmamız gerekir. 100’ü 1000’e bölersek sonuç 0,1 olur. Buda ProgressBar’ın minimum değerine eşittir.

    Sayısal Olarak Artışı Görmek

    Artışı sayısal bir değer yani %100 cinsinden görmek için birkaç değişik yöntem mevcut Frame’nin Caption’u yada Label’in Caption’u kullanabiliriz. Biz Label’i kullanalım ve Userform’un üzerine bir Label çizelim. Döngünün içerisine şu kodu ekleyelim ve makroyu çalıştıralım.

    Label1.Caption = (i / 1000) * 100

    Dikkat ettiyseniz ProgressBar ilerlemiş fakat Label’in değeri artmamıştır. Sadece en sonda 100 değerini vermiştir. Aslında değer arttı fakat UserForm yenilenmediğinden bunu bize göstermedi. Bunun için ise Next i satırından bir önceki satıra DoEvents yazalım ve bir daha makroyu çalıştıralım. Hala bir eksiklik var değil mi? Hatta iki eksiklik var. Birincisi yüzdelik değer tam sayı değil. İkincisi % işareti yok. Bunların yapılması da çok basit. Tam sayıyı int kodu ile yüzdelik değeri de format ile halledeceğiz.

    Label1.Caption = Format(Int((i / 1000) * 100), "%0")

    İşte şimdi oldu artık yaptığımız işi hem sayısal hem de görsel olarak göreceğiz. En son ki kod eklememizden sonra tüm kodlarımız şu şekilde oldu.

    Private Sub CommandButton1_Click()
    Dim i As Integer

    For i = 1 To 1000
    ProgressBar1.Value = (i / 1000) * 100
    Label1.Caption = Format(Int((i / 1000) * 100), "%0")
    DoEvents
    Next i
    End Sub

    Private Sub UserForm_Initialize()
    ProgressBar1.Max = 100
    ProgressBar1.Min = 0.1
    End Sub

    Kaynak
     

Bu Sayfayı Paylaş