Excelde Hücreden Sql Sorgusu Yapmak

Bazı çalışmalarda excele dışardan datalar çekmek isteyebiliriz. Bu veriler herhangi bir database’den olabileceği gibi bir başka excel dosyasından da olabilir. Genelde bir database’e bağlanıp verileri oradan çekmek isteriz. Verileri excel sayfalarına alıp gerekli düzenlemeleri yaparız. Bazı durumlarda hücreden dinamik sql sorguları yapmak pratik çözümler sunabilir. Tabi bunun metodunu ve syntax’ını iyi bilmek gerekir. Normalde veriyi aldıktan sonra tablomuz üzerinde sağ tıklayıp açılan menüden Tablo->Sorgu Düzenle’ye basınca önümüze “OLE DB Sorgusu Düzenle” penceresi gelir. Bu pencere 3 bölümden oluşmaktadır. Bağlantı, Komut Türü, Komut Metni. Bu makalemizin konusu Komut Metni olduğu için sadece bu kısmına odaklanacağım. Komut Türünü “SQL” olarak seçip Komut Metni alanına istediğimiz Sql sorgusunu yazar ve verilerimizi bu sorguya göre çekebiliriz. Örnek vermek gerekirse aşağıda ki gibi bir sorgu yazdığımızda,

select * from satisverileri where yil=2015

satisverileri tablosundan 2015 yılının verilerini çekip alırız.

select * from satisverileri where yil=2015 and firmaismi="abc"

Yada yukarıda ki gibi bir sorgu yazdığımızda, satisverileri tablomuzdan abc firmasının 2015 yılı verilerini çekip alırız. Bu gibi sorguları artırmak mümkün. Konumuz bu değil. Asıl konumuz, her defasında tabloda sağ tıklayıp komut metni ekranını açıp sorgu yazmaktansa bunu herhangi bir hücreden değer alarak yapmak. Asıl konumuz bu. Örneğin; firma ismini hücreden değiştirdikçe tablomuz o firma ismine göre yeniden refresh olsa. Bu çok daha selektif bir yapı sunacaktır bize. Peki hücredeki değeri sorgumuza nasıl dahil edeceğiz. Hiç uzatmadan size aşağıda ki kodu veriyorum.

Sub hucredensorguyap()

 On Error Resume Next
 Range("A2").Select
 With Selection.ListObject.QueryTable
 .Connection = Array( _
 "OLEDB;Provider=SQLOLEDB.1;Persist Security Info=True;User ID=*****;Password=********;Initial Catalog=*****;Data Source=*********;Use Procedure for" _
 , _
 " Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=CBAYRAK;Use Encryption for Data=False;Tag with column collation w" _
 , "hen possible=False")
 .CommandType = xlCmdSql
 .CommandText = Array("select * from dbo.Av_Satis_100 where CariUnvan like '%" & Worksheets("Sayfa1").Range("A1").Value & "%'")
 .Refresh BackgroundQuery:=False
 End With
End Sub

Bu kodu biraz açıklayayım. Kod başlangıcında “Range(“A2″).Select” işlemi, tablomuzun 2. satırdan itibaren başladığı,”A1″ hücresinde ise sorgulama yapacağımız  varsayımından kaynaklanmaktadır. “Range(“A2″).Select” yaparak bir şekilde tablo üzerinde bir hücrenin select olmasını sağlamak ve böylece with…..end with bloğunda Selection (seçili olan) ile başlayan kod kısmının hata vermesini engellemek. Aksi takdirde tablo üzerinde bir alan select olmazsa “with…..end with” bloğu hata verir. Burada illa “A2” hücresi select edilmek zorunda değildir. Tablo üzerine denk gelecek herhangi bir hücrede olabilir pekala. “With……. End With” bloğuna bakacak olursak, seçili olan querytable (sorgu sonucu elde edilen tablo demek bu) ‘ın Connection ayarlarını içeren bir bloktur. “Array parantez” içinde ki ifadeler bizim sql databasemiz ile olan bağlantımızı sağlayan connectionstring ifadelerdir. Bu ifadeleri elbette ezberlemek yersiz. Burada ufak çaplı bir kurnazlık yapmak mümkün. Tablomuz üzerinde sağ tıklayıp açılan menüden Tablo->Sorgu Düzenle’ye basıp önümüze gelen “OLE DB Sorgusu Düzenle” penceresinden “Bağlantı” bölmesinden bu ifadeyi copy-paste yapabiliriz. “Selection.ListObject.QueryTable.Connection = Array(“OLEDB;” den sonra yapıştır diyeceğiz buna dikkat edelim. Bu adımları izah ettikten sonra esas konumuz olan hücreden alınan değere göre sorgulama kısmına gelebiliriz. “With……End With” bloğu içerisinde ki “CommandText=” alanına tanımlanan sorgu bizim asıl işimizi yapacak olan kısımdır. Buraya dikkat ettiğinizde aslında klasik bir sql sorgusu ile karşı karşıya olduğumuzu farkedeceksiniz. ” select * from satisverileri where firmaismi like ‘%” & Worksheets(“Sayfa1”).Range(“A1”).Value & “%’ ” bu ifade, satisverileri tablosunun firmaismi kolunu altında ki verilerden içinde “Sayfa1” de ki “A1” hücresinde yer alan string ifade geçen verileri çekip almaktadır. Bu sorguyu normal bir şekilde yazacak olsa idik ” select * from satisverileri where firmaismi like ‘%abc%’ ” şeklinde yazmamız gerekecekti. Yani içinde abc ifadesi geçen firma isimlerini seçip getir demiş olacaktık. Bu iki sorgu aslında birbirinin aynısı. ‘%…….%’ ifadesinin içine yazılan kısımlarında fark oluşmaktadır. İşte hücrede ki değere göre sorgu yapmak istediğimiz de bu alana “& Worksheets(“Sayfa1”).Range(“A1″).Value &” yazarsak artık hücrede ki değere göre sorgumuzu dinamik bir şekilde yapmış oluruz.

Kolay gele….

Paylaşmayı unutmayın!