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….
Üstad benzer bir uygulama yapıyorum fakat takıldım benim uygulamam şöyle,
bir müşteri listem var excelde hücrede hangi müşterinin üstüne tıklarsam yani hangi hücreyi seçersem butona basınca ilgili hücredeki müşterinin SQL kayıtlarında x bir alanını değiştireceğim ama olmuyor sayfa adından mıdır SQL OLEDB baglantısından mıdır çözemedim sizce nerede hata yapıyorum
Metin bey, sırası ile gidersek;
1. Sayfa2 yada Analiz farketmez
2. Range(“A2″).Select demişsiniz bu yanlış olmuş. Gönderdiğiniz fotoğraftan A2 hücresinde verilerinizin olmadığını görüyorum
3. .CommandText = Array(” ile devam eden kısımda yazdığınız sorguda hata var. Update sorgusu database de veri güncellemek için. Oysa siz c2 deki firma ismine göre veri getirmek istiyorsunuz. O yüzden select sorgusu yazmanız icap eder.
4. Veriyi getirmek istediğiniz sayfada sanki pivottable var gibi geldi bana. Pivottable a db den veri getirmeyiz. Başka bir yere veri getirir pivottable a ise o veriyi çekeriz. Macrolarla olsa olsa pivottable ı yenileriz yada filtreler uygularız vs…..
5. Yapmak istediğiniz şey, excelin hücrelerinde ki değerleri db ye yollamak ise bu başka bir konu.
6. Gönderdiğiniz görsel üzerinden probleminizi anlayamadığımı düşünüyor iseniz cuneytbayrak@hotmail.com üzerinden benimle irtibata geçebilirsiniz.
Bir sorum var mail adresime mail atabilir misiniz iletişimden ulaşamıyorum size ahta veriyor. Çok acil cüneyt bey :/ mail adresim vertigo4125@gmail.com
Furkan Bey size mail ile dönüş yaptım.
OLMADI 🙁
Olmayan kısmı hakkında bilgi verirseniz yardımcı olmaya çalışırım
Yaptım üstadım emeğiniz dert görmesin. Ellerinize sağlık.
Faydası oldu ise ne mutlu bana.