Excel VBA Blog

2011-02-26

E-posta adresi sınama- RegExp nesnesi

Filed under: Uncategorized — Etiketler:, , , , , , , — dutali @ 6:48 am

Bu yazıyı exceltr.net altında okumak için  tıklayın


 

Merhaba,
Bu yazıda sizinle bir e-posta alanına girilen metnin e-posta kurallarına uygun olup olmadığını kontrol eden bir fonksiyon yazıcaz.
Herhangi bir dille böyle bir kontrol yapmak isteseydiniz bulacağınız en etkili araç “düzenli ifadeler” (regular expression) olurdu. VBA içerisinde de bu amaçla bir nesne var : VBScript RegExp

Fonksiyonumuz da , e-posta adresinin kurallı olup olmadığını kontrol etmek için regular expression kullanıyor.
Regular Expression hakkında bilgi sahibi değilseniz : http://en.wikipedia.org/wiki/Regular_expression .

ve fonksiyonumuz :

Private Function EPostaDogrula(Value As String) As Boolean  
    Dim RE As Object
    Set RE = CreateObject("vbscript.RegExp")
    RE.Pattern = "^[a-zA-Z0-9\._-]+@([a-zA-Z0-9_-]+\.)+([a-zA-Z]{2,3})$"
    EPostaDogrula = RE.Test(Value)
    Set RE = Nothing
End Function

Birleşik range’den dizi veya matris oluşturma

Filed under: Excel, VBA — Etiketler:, , , , — dutali @ 6:28 am

Bu yazıyı exceltr.net altında okumak için  tıklayın


 

Merhaba,
Şöyle bir durum düşünün; Elinizde range türünden bir değişken var.Farzedelim kullanıcının fare imleci ile seçtiği birkaç sütunun birleşimi bir alan olsun.
Doğal olarak tek parçadan oluşmak zorunda değil. Böyle bir durumda VBA içerisinde bu alan içerisindeki değerleri ağız tadı ile kullanmak zor.
Çünkü hiç bir elemana indis kullanarak ulaşamayacaksınız. Ayrıca sonradan boyutu belirlenmiş bir değişken olan alanımızın içerisinde dolaşabilmek için önce kaç parçadan oluştuğunu sorgulamamız, sonra her alan içerisinde indis kullanmadan tüm hücreler üzerinde dolaşmak zorundasınız. 2. parçanın 3. elemanı diye bir ifade olamayacak. Parçaların satır sayılarının aynı olduğu bir durumda bir matris elde etmiş oluruz. Örneğimizde de öyle zaten

hiç bir yaratıcılık ve zeka pırıltısı içermese de çok işe yarayan fonksiyonumuz şöyle:


Function RangeToArray(rgInput As Range, Optional booTekBoyutIseArray As Boolean = False)

' Programcı: Ebubekir Çelik .
' https://exceltr.wordpress.com

    Dim i As Integer, j As Integer, k As Integer, m As Integer, n As Integer

    Dim booTekBoyut As Boolean
    Dim iColCnt As Integer, iRowCnt As Integer, iAreasCnt As Integer
    Dim GArray, cl As Object

    iColCnt = rgInput.Columns.Count
    iAreasCnt = rgInput.Areas.Count

    iRowCnt = 0
    For i = 1 To iAreasCnt
        iRowCnt = iRowCnt + rgInput.Areas(i).Rows.Count
    Next

    If iColCnt = 1 Or iRowCnt = 1 Then
        booTekBoyut = True
    Else
        booTekBoyut = False
    End If

    If booTekBoyutIseArray = False Or booTekBoyut = False Then
        ReDim GArray(1 To iRowCnt + 1, 1 To iColCnt)
        m = 2
        For k = 1 To iColCnt
            GArray(1, k) = ""
        Next
        For i = 1 To iAreasCnt
            For j = 1 To rgInput.Areas(i).Rows.Count
                n = 1
                For k = 1 To iColCnt
                    GArray(m, n) = rgInput.Areas(i).Cells(j, k)
                    n = n + 1

                Next
                m = m + 1
            Next

        Next
    Else
        ReDim GArray(1 To rgInput.Cells.Count)
        i = 1
        For Each cl In rgInput.Cells
            GArray(i) = cl.Value
            i = i + 1
        Next
    End If

    RangeToArray = GArray

End Function

TC Kimlik numarası sınama

Filed under: Excel, VBA — Etiketler:, , , , — dutali @ 6:03 am

Bu yazıyı exceltr.net altında okumak için  tıklayın


 

Merhaba,

Bu yazıda size TC Kimlik numarası için bir iki basit kontrol yöntemi göstereceğim.
Sınamadan kastım resmi makamlarla bağlantı kurarak sınamak değil tabii ki. Her TC Kimlik numarasının sağladığı basit birkaç matematiksel şart var.
Bu şartlara bakarak bir sayının TC Kimlik numarası olup olamayacağını görebilirsiniz. Fakat tabii ki ilgili şartları sağlayan her sayı, bir şahsa verilmiş TC Kimlik no değildir. Biz algoritmaya uymayanları eliyoruz.

Peki ne derecede işimize yarar bu algoritma? Kafadan uydurulmuş bir numara çoook büyük olasılıkla testi geçemez. Bir iki rakamı hatalı verilmiş gerçek bir TC Kimlik numarası da çok küçük bir olasılıkla algoritmayı geçecek şansa sahip olabilir. Özellikle veri girişi hatalarını önemli ölçüde azaltacaktır.

Lafı fazla uzatmadan algoritmayı kısaca anlatayım ve fonksiyonu vereyim:
Fonksiyona, TCKimlik numarası olup olmadığı kontrol edilmek istenen sayı, string olarak veriliyor (string olacak tabii. sebebini sormayın)
TCKimlik numarası 11 haneli olmalıdır
TCKimlik numarasının son hanesi tek sayı olamaz
TCKimlik numarasının ilk 10 rakamının toplamının 10 a bölümünden kalan sayı, 11. rakamı verir
bir iki şartı daha var ama fonksiyonda yok. Talep gelirse eklerim

Ayrıca fonksiyonun altında bir de yardımcı fonksiyon var. onun amacı da stringin içinde dışında boşluklar var ise onları kırpmak. böylece temiz bir string oluşturmuş oluruz.

tc kimlik test:

Private Function TCKimlikSinama(strTc As String) As Boolean   
 ' Programcı: Ebubekir Çelik .
' https://exceltr.wordpress.com
    TCKimlikSinama = True
    If Len(strTc) = 0 Then
        TCKimlikSinama = True
        Exit Function
    End If

    If Len(strTc)  11 Then
        TCKimlikSinama = False
        Exit Function
    End If


    Dim iTop As Integer, i As Integer
    iTop = 0
    For i = 1 To 10
        iTop = iTop + CInt(Mid(strTc, i, 1))
    Next


    If iTop Mod 10  CInt(Right(strTc, 1)) Then
        TCKimlikSinama = False
        Exit Function

    End If

    If CInt(Right(strTc, 1)) Mod 2 = 1 Then
        TCKimlikSinama = False
        Exit Function
    End If

End Function

metin içerisindeki boşluk karakterlerini kırpmak için :

Function BoslukKirp(str As String) As String

    Dim i As Integer
    Dim strKr As String, strLeft As String, strRight As String
    Dim strBosluk As String
    Dim iLngt As Integer

    strBosluk = " "
    strLeft = ""
    strRight = ""

    iLngt = Len(str)

    If Len(str) > 0 Then
        For i = 2 To iLngt
            If Mid(str, i, 1) = strBosluk Then
                strLeft = Left(str, i - 1)
                strRight = Mid(str, i + 1)
                str = strLeft & strRight
                iLngt = iLngt - 1

            End If
        Next

    End If

    BoslukKirp = str
End Function

2011-02-23

son satır bulma yöntemleri ve farkları

Filed under: Uncategorized — dutali @ 1:55 pm

Bu yazıyı exceltr.net altında okumak için  tıklayın


Bana sorulan bir soru üzerine Excel’de son satırı bulmak için kullanılan yöntemleri açıklamak ishtiyacı hissettim.

Son satırdan kasıt ne olabilir?

worksheet’in son kullanılan hücresininin bulunduğu satır.

belirli bir sütun için kullanılan son satırdan kastediliyor olabilir

bu iki seçenek için de kullanılan son hücreden kasıt çoğu durumda veri içeren son hücredir.

Öncelikle vba kullanmadan bir sayfada son hücreye gitmenin iki basit yolu var

1- CTRL+END tuş kombinasyonu

2- F5 e basıldığında açılan menüden Özel butonuna basılarak ulaşılan menüden Son hücreyi işaretleyim tamam a tıklamak. Aşağıdaki ekran görüntülerine bakın

Birkaç deneme yaparsanız Excel’in son hücreden kastının veri içeren son hücre olmadığını göreceksiniz.  Bir hücrede veri olmayabilir fakat üzerinde işlem yapılmış ise Excel için o dolu bir hücredir. Fakat son hücre her zaman dolu olan en son hücre değildir.

şu örneğe bir bakın. Taze açılmış bir excel çalışma sayfası. Sadece ilk satır ve sütunlara veri girilmiş ve başka hiçbir işlem yapılmamış.Seçili olan hücre yukarıda bahsedilen iki şekilde de ulaşılabilen son hücredir. Ama veri yok. şekillendirme yok. Görünmeyen karakter yok. Peki neden o hücre ? Cevap açık: dolu olan en son satır ile dolu olan en son sütunun kesişimi.

şimdi aynı sayfada g8 hücresini kırmızıya boyuyorum. Tekrar son hücreye gittiğimde bu sefer g8 hücresi seçilecek. kırmızıya boyamak yerine sadece yazı tipini de değiştirebilirdim (yazı içermese de ).Sonuç aynı olurdu.  Demek ki son hücre bi çeşit değilmiş. Şimdi bir tavsiye verip VBA ile son hücre kısmına geçelim.

Zaman zaman excel hücrelerinin içeriğiyle orantısız şekilde büyük boyutlarda olduğunu görürsünüz. Genelde suçlusu boş görünse de son hücrenin sağında ve üstünde kalan alanların boş veri içerseler bile yer kaplamasıdır. Bu ayrı bir konu ve çözümü var.

Şimdi VBA ile son hücre , son satır ve son sütun nasıl bulunur nasıl bulunmaz görelim. Çok çeşitli yollar var. Bütün seçenekleri göstermek yerine öğretici bir iki tane ile yetinmeyi düşünüyorum. Örneklerde hem son hücreyi hem son satır ve sütunu bulmayı tek seferde gösterebilmek için hep son satırı arıyorum.

Örnek 1

  1. sütundaki son satır. cells içerisindeki 1 değiştirilerek başka sütunlar üzerinden de  son satır bulunabilir. Bu fonksiyonu biraz evirdiğimizde çok başarılı olacak.

 

SonSatir = Cells(Rows.Count, 1).End(xlUp).Row    //tam sayı

SonSutun=Cells(Rows.Count, 1).End(xlUp).Column    // tam sayı

SonHucre=Cells(Rows.Count, 1).End(xlUp)

 

Örnek 2: Kötü örnek

  1. sütundaki son satır. Bu sefer cells yerine range var. 2. sütun için A yerine B yazılmalı.

Dezavantajları: alt snır elle yazılmış.Excel 2003 için doğru sonucu verir, 2007 ve 2010 için alt sınırı çoook ileride.yukarıdaki örnekler alt sınırı rows.count ile son mümkün satır olarak belirliyorlar.

range kullanılması parametrik bir fonksiyona çevrilmesini zorlaştırır. doğrudan sütun numarası yerine string birleştirmeyi zorunlu kılar

yavaş çalışır. Sık kullanmıyor iseniz problem sayılmaz

 

SonSatir= Range("A65536").End(xlup).Row

Örnek 3:
Tüm sayfadaki son satırı buluyor. Fakat excel’in anladığı anlamda son hücreyi buluyor. Gerçek son hücre buna eşit veya bundan daha küçüktür.
Performans sıkıntınız veya kesin sonuç derdiniz yoksa bu fonksiyonun tüm verileri kapsayan bir alanı vereceğine güvenebilirsiniz
Cells yerine range kullanılması mümkündür. Dezavantajlarını yukarıda saydık.


SonSatir = Cells(1, 1).SpecialCells(xlCellTypeLastCell).Row

 

Örnek 4:

Sayfadaki veri içeren son satırı bulur.ilk örnekten bazı durumlarda yavaş çalışır. sütun belirlemenize gerek yok

LastRow = Cells.Find(What:="*", After:=Cells(1, 1), SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row

 

Örnek 5:

  1. hücrede ilk boş hücrenin konumunu verir. . Eğer id sütunu gibi boş olamaycak sütunlarda kullanacak olsanız bile asla bunu kullanmayın.
SonSatir= Cells(1,1).End(xlDown).Row

 

 

Bu kadar örnek yeter. Benim favorim 1. örnekteki.  Şimdi bunu fonksiyon haline getirelim. integer sınırını yetersiz görüp long kullanıyorum

 

Public Function SonSatir( ws as Worksheet, iSutun As Long) As Long

SonSatir = ws.Cells(Rows.count, iSutun).End(xlUp).Row

End Function

 

Fakat dikkat edin. Bu fonksiyon bazı durumlarda hata verecek. eğer bu fonksiyon çalışırken bir grafik sayfası aktif ise Rows.count işlemi grafik sayfasında gerçekleştirilmeye çalışılacak ve hata oluşacak. Tüm range atamalarını worksheet hata workbook ile yapmak en sağlıklısı.

Küçük bir düzeltme yapalım:

 

Public Function SonSatir( ws as Worksheet, iSutun As Long) As Long

SonSatir = ws.Cells(ws.Rows.count, iSutun).End(xlUp).Row

End Function

Görüşmek üzere

 

 

 

 

 

 

 

 

 

WordPress.com'da ücretsiz bir web sitesi ya da blog oluşturun.