ADO yönteminde Tanımlanmış Tablo ya da AD kullanmak

ÖmerFaruk

Destek Ekibi
Destek Ekibi
Katılım
22 Ekim 2017
Mesajlar
4,779
Excel Vers. ve Dili
Microsoft 365 Tr-64
Tablo olarak tanımlanmış aralığı ya da tanımlı AD ları, ADO sorgusunda kullanabiliyor muyuz?
"Select [Sütun1],[Sütun2] from [Sayfa1] Where [Sütun2]=5" gibi bir cümlede, Sayfa1 yerine Tablo ismini ve Sütunlar yerine tablonun alanlarını verebiliyor muyuz?
Örnek var mıdır?
 

YUSUF44

Destek Ekibi
Destek Ekibi
Katılım
4 Ocak 2006
Mesajlar
12,073
Excel Vers. ve Dili
İş : Ofis 365 - Türkçe
Ev: Ofis 365 - Türkçe
Tahmin ediyorum hdr=no yerine hdr = yes kullanılırsa tablodaki başlıkları kullanabiliyorsunuz. Sayfa adı yerine tabloyu kullanmak için de tablonun adını $ olmadan kullanmak gerekebilir.
con.Open "provider=microsoft.ace.oledb.12.0;data source=" & _
ThisWorkbook.FullName & ";extended properties=""Excel 12.0;hdr=yes"""
"Select [ad],[soyad] from [Personel] Where [unvan]='Mühendis'"


gibi.
 

ÖmerFaruk

Destek Ekibi
Destek Ekibi
Katılım
22 Ekim 2017
Mesajlar
4,779
Excel Vers. ve Dili
Microsoft 365 Tr-64
Denedim ancak olmadı Yusuf Bey,
Sorgu cümlesinde direkt [TablomunAdı] şeklinde yazınca nesneye erişemediğini belirtiyor.
Tablonun bulunduğu sayfanın adını da çeşitli şekillerde denemeye çalıştım. Başaramadım
 

YUSUF44

Destek Ekibi
Destek Ekibi
Katılım
4 Ocak 2006
Mesajlar
12,073
Excel Vers. ve Dili
İş : Ofis 365 - Türkçe
Ev: Ofis 365 - Türkçe
Gerçi tablo için köşeli parantez kullanılmamış, şimdi farkettim.
 

ÖmerFaruk

Destek Ekibi
Destek Ekibi
Katılım
22 Ekim 2017
Mesajlar
4,779
Excel Vers. ve Dili
Microsoft 365 Tr-64
Halen deniyorum ve kabul ettiremiyorum.
 

YUSUF44

Destek Ekibi
Destek Ekibi
Katılım
4 Ocak 2006
Mesajlar
12,073
Excel Vers. ve Dili
İş : Ofis 365 - Türkçe
Ev: Ofis 365 - Türkçe
Örnek dosya paylaşırsanız daha iyi olur bence.
 

ÖmerFaruk

Destek Ekibi
Destek Ekibi
Katılım
22 Ekim 2017
Mesajlar
4,779
Excel Vers. ve Dili
Microsoft 365 Tr-64
Biraz karıştırınca, ilgili tabloyu Range olarak alınca sorgu çalıştı.
Tam olarak kullandığım hali aşağıdadır.
Desteğin için teşekkürler @YUSUF44

C++:
Private Sub UserForm_Initialize()
Dim Con As ADODB.Connection
Dim Rs As ADODB.Recordset
Dim myQuery As String, myWhere As String
Dim Sh As Worksheet
    Set Con = New ADODB.Connection
    Set Rs = New ADODB.Recordset
    Con.Open "provider=microsoft.ace.oledb.12.0;" & "data source = " & ThisWorkbook.FullName & ";" & "extended properties=""excel 12.0;hdr=Yes"""
    Set Sh = Worksheets("Data")
    myTable = Sh.Name & "$" & Sh.ListObjects("TblAsnList").Range.Address(False, False)
    myWhere = "Where [Ada] = '" & UserForm1.ComboBox2.Value & "' and [Bina]= '" & UserForm1.ComboBox3.Value & " Blok'"
    myQuery = "Select [Proje Kodu],[Ekipman No],[Tip],[Kapasite]  from [" & myTable & "]" & myWhere
    Rs.Open myQuery, Con, 1, 1
    If Rs.RecordCount > 0 Then ListBox1.Column = Rs.GetRows
    Rs.Close
    myQuery = vbNullString: myWhere = vbNullString: myTable = vbNullString: Set Rs = Nothing: Set Con = Nothing: Set Sh = Nothing
End Sub
 

YUSUF44

Destek Ekibi
Destek Ekibi
Katılım
4 Ocak 2006
Mesajlar
12,073
Excel Vers. ve Dili
İş : Ofis 365 - Türkçe
Ev: Ofis 365 - Türkçe
Amacını son dolu satıra göre işlem yapmak a ben şöyle kullanıyorum.

Önce

son=Sheets("Data").cells(Rows.Count,"A").End(3).row

İle son satır numarasını buluyorum.

Sonra da sorguda

From [Data$A1:M" & son & "]

Şeklinde adres belirtiyorum.
 

ÖmerFaruk

Destek Ekibi
Destek Ekibi
Katılım
22 Ekim 2017
Mesajlar
4,779
Excel Vers. ve Dili
Microsoft 365 Tr-64
From [Data$A1:M" & son & "]

Amacım bir sürü tanımlı tablom ve adlarım var. Bunları direkt kod içinde ve ADO içinde kullanmak istiyordum.
Aynı [Data&] ifadesi gibi. MS yardımda dediğiniz gibi "Select * from Tablo1" yazınca olur demesi rağmen VBA bunu kabul etmiyor.

Gerçi benim bulduğum kod da bunu yapmadı ancak işimi gördü.
 

Haluk

Özel Üye
Katılım
7 Temmuz 2004
Mesajlar
12,406
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
ListObjects 'in görünen adları ADO' da çalışmaz.....

MS Help'in bahsettiği;

Söz konusu ListObject nesnesinin ya adresini ADO'ya gösterin .... ki; bunu zaten yapmışınız ve sonuç almışınız, ya da Baba'dan kalma yöntemlerle söz konusu aralığı adlandırın, onu kullanın....

Diyor.....


.
 

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
42,190
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
Bu şekilde de oluyor..

C++:
Option Explicit

Sub ADO_Tanimli_Ad_Kullanimi()
    Dim Baglanti As Object, Kayit_Seti As Object, Tablo As Range

    Set Baglanti = CreateObject("AdoDb.Connection")

    Baglanti.Open "Provider=Microsoft.Ace.OleDb.12.0;Data Source=" & _
    ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0;Hdr=Yes"""
    
    Sheets("Sayfa1").Range("A1:E100").Name = "Tablo"
    
    Set Kayit_Seti = Baglanti.Execute("Select * From Tablo")
    
    Sheets("Sayfa2").Range("A1").CopyFromRecordset Kayit_Seti

    Baglanti.Close
    
    Set Baglanti = Nothing

    MsgBox "Veriler aktarılmıştır.", vbInformation
End Sub
 

ÖmerFaruk

Destek Ekibi
Destek Ekibi
Katılım
22 Ekim 2017
Mesajlar
4,779
Excel Vers. ve Dili
Microsoft 365 Tr-64
Sheets("Sayfa1").Range("A1:E100").Name = "Tablo"
Set Kayit_Seti = Baglanti.Execute("Select * From Tablo")

Ben bunu excel üzerinden tanımladığım TABLO için nasıl revize etmeliyim.
Excelde tanımlı tablolar ListObject olarak VBA tarafından tanınıyor.
 

Haluk

Özel Üye
Katılım
7 Temmuz 2004
Mesajlar
12,406
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
Evet.... Korhan Bey'in önerdiği alternatif de, bir önceki mesajda bahsettiğim "Baba'dan kalma alan adlandırma" kısmının VBA'ye uyarlanmış şekli.

.
 

Haluk

Özel Üye
Katılım
7 Temmuz 2004
Mesajlar
12,406
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
Sheets("Sayfa1").Range("A1:E100").Name = "Tablo"
Set Kayit_Seti = Baglanti.Execute("Select * From Tablo")

Ben bunu excel üzerinden tanımladığım TABLO için nasıl revize etmeliyim.
Excelde tanımlı tablolar ListObject olarak VBA tarafından tanınıyor.

VBA ListObject'i tanımazsa, zaten ortalık karışır.... deyim yerindeyse, kan çıkar.

Önemli olan ADO'nun kabul etmesi .... ama, ADO kabul etmez.

.
 

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
42,190
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
Haluk beyin dediği gibi ADO "ListObject" yani Ekle-Tablo ile oluşturulmuş ad tanımlamasını kabul etmiyor.

Bunun yerine hücre aralığına normal AD-TANIMLAMA yapılırsa bunu tanıyor. Sayfada hücre aralığını elle AD tanımlama yaptıktan sonra aşağıdaki kod ile sonuç aldım.

C++:
Option Explicit

Sub ADO_Tanimli_Ad_Kullanimi()
    Dim Baglanti As Object, Kayit_Seti As Object

    Set Baglanti = CreateObject("AdoDb.Connection")

    Baglanti.Open "Provider=Microsoft.Ace.OleDb.12.0;Data Source=" & _
    ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0;Hdr=Yes"""
    
    Set Kayit_Seti = Baglanti.Execute("Select * From Tablo")

    Sheets("Sayfa2").Range("A1").CopyFromRecordset Kayit_Seti

    Baglanti.Close
    
    Set Baglanti = Nothing

    MsgBox "Veriler aktarılmıştır.", vbInformation
End Sub
 

ÖmerFaruk

Destek Ekibi
Destek Ekibi
Katılım
22 Ekim 2017
Mesajlar
4,779
Excel Vers. ve Dili
Microsoft 365 Tr-64
Korhan bey öncelikle emeğin için teşekkürler.

Şöyle bir durum var.
Ben özellikle dosyanın tasarımı esnasında sürekli olarak alanların sayfasını veya aralığını değiştiriyorum. Bu sebeple direkt Ad tanımlamak yerine, ilgili aralığımı Tablo olarak tanımlayıp, sonrasında AD tanımlarken formül kullanmak yerine =Tablo diyorum
Bunu yapma sebebim de Tablom olarak belirlediğim aralığa yeni veri eklerken kodlamada kolaylık sağlamasındandır.

Sizin gönderdiğiniz dosya üzerinde, Sayfa1 A1:E26 aralığını R1:V26 aralığına değerleri kopyaladım ve Tablo Ekle diyerek Tablo2 adıyla kaydettim
AD ekleyerek de formülüe =Tablo2 dedim.

Sizin verdiğiniz 1.yöntemde aşağıdaki satırı değiştirdiğimde resimdeki uyarıyı alıyorum.
Set Kayit_Seti = Baglanti.Execute("Select * From adTablo2")

226757


Sonuç olarak anladığım şu. AD taımlarken direkt aralık belirtmek yerine dolaylı yöntem kullanırsam ADO bunu anlamıyor.
 

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
42,190
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
Haluk bey bunun cevabını önceki mesajlarda vermişti.

Eğer ekle menüsünden TABLO özelliğini kullanırsanız evet ADO bu yöntemde sorun çıkarıyor.

Ama klasik yöntemle AD-TANIMLAMA yaptığınızda ister sayfada ister kod için bunda sorun çıkarmıyor.
 

Korhan Ayhan

Administrator
Yönetici
Admin
Katılım
15 Mart 2005
Mesajlar
42,190
Excel Vers. ve Dili
Microsoft 365 Tr-En 64 Bit
Ayrıca verdiğiniz örnekte yazım hatası var. Çalışmayacak ama yine de belirtmek istedim.

AD ekleyerek de formülüe =Tablo2 dedim.
Set Kayit_Seti = Baglanti.Execute("Select * From adTablo2")
 
Üst