sql ile iki sayfadaki verileri birleştirme

Katılım
24 Temmuz 2007
Mesajlar
726
Excel Vers. ve Dili
Excel 2010 tr
Selam,
Ekteki örnekte
Ocak ve Şubat sayfalarındaki verileri
Toplam sayfasında dosyadaki gibiSQL ile nasıl birleştirebilirim

NOT: Arkadaşlar veriler ocak ve Subat sayfasından tek bir sorgu ile çekilip toplam sayfasına yazılmalı

Teşekkürler
 

Ekli dosyalar

mancubus

Destek Ekibi
Destek Ekibi
Katılım
6 Ocak 2010
Mesajlar
2,224
Excel Vers. ve Dili
İŞ: 2021 Win Eng
aynı dosyadaki 2 sayfayı 3. sayfada birleştirmek için SQL mi istiyorsunuz?
neden?
 
Katılım
24 Temmuz 2007
Mesajlar
726
Excel Vers. ve Dili
Excel 2010 tr
çünkü asıl veriler database olarak kullandığım bir excel kitabında
ve burda verinin türüne göre farklı sayfalar kullanıyorum uygulama olarak kullandığım excel kitabında bu verileri birleştirilmiş olarak çekmem gerekiyor
 

mancubus

Destek Ekibi
Destek Ekibi
Katılım
6 Ocak 2010
Mesajlar
2,224
Excel Vers. ve Dili
İŞ: 2021 Win Eng
eğer tüm excel sayfalarında veriler aynı formatta ve sütun başlıkları aynı ise aşağıdaki gibi bir şey olabilir.

kendime uyarladığım bir kod idi. şimdi size uyarladım.

Kod:
Sub xl_tablo_import()
'VBE - Tools - References:  Microsoft ActiveX Data Objects 2.8 Library
    
    Dim cn As New ADODB.Connection, rs As New ADODB.Recordset
    Dim wsList As Variant, dbPath As String, dbFile As String, xlTbl As String
    Dim i As Integer, j As Integer
    
    With Application
        .DisplayAlerts = False
        .ScreenUpdating = False
    End With
    
    dbPath = "C:\VERI\DOSYALAR\AYLIK_DOSYALAR"
    dbFile = dbPath & "\veri_tabani_olan_dosya.xlsm"
    
    cn.Open ("Provider=Microsoft.ACE.OLEDB.12.0;" _
            & "Data Source=" & dbFile & ";" _
            & "Extended Properties=""Excel 12.0;HDR=Yes;IMEX=1""")
    
    wsList = Array("ocak", "şubat") 'mart, nisan, mayıs, vs
    
    With Worksheets("Toplam")
        .Cells.Clear
        For i = LBound(wsList) To UBound(wsList)
            xlTbl = wsList(i)
            strSQL = "SELECT * FROM [" & xlTbl & "$]"
            rs.Open strSQL, cn, adOpenStatic, adLockReadOnly
            For j = 1 To rs.Fields.Count
                .Cells(1, j).Value = rs.Fields(j - 1).Name
            Next j
            .Range("A" & .Rows.Count).End(xlUp).Offset(1).CopyFromRecordset rs
            rs.Close
        Next i
    End With
    
    cn.Close

End Sub
 
Katılım
24 Temmuz 2007
Mesajlar
726
Excel Vers. ve Dili
Excel 2010 tr
öncelikle cevabınız için teşekkür ederim,
mutlaka bu kodlardan faydalanacağım arşivimede alıyorum

fakat inner join ile iki excel sayfasının birleştirilerek verilerin tek bir sorguda çekildiği örneği görmüştüm, maalesef ki arşivime almamamışım ve arayıncada bulunmuyor ne yazıkki
 

mancubus

Destek Ekibi
Destek Ekibi
Katılım
6 Ocak 2010
Mesajlar
2,224
Excel Vers. ve Dili
İŞ: 2021 Win Eng
aslında hızlı olsun diye elimdekini koydum buraya.
yoksa bu şekilde olmaz.

"sql 2 tabloyu birleştir" şeklinde aratın.

biraz ingilizce ile "sql join two tables" deyin.

veya (temel bilginiz var ise) access açın. bu 2 sayfayı import edin. oradan sorgu oluşturma adımlarını izleyin.
sql görünümünde sql kodları gelecektir.
 
Son düzenleme:

mancubus

Destek Ekibi
Destek Ekibi
Katılım
6 Ocak 2010
Mesajlar
2,224
Excel Vers. ve Dili
İŞ: 2021 Win Eng
excel sayfaları sistem tablosu olarak değerlendirildiğinden sonuna $ işareti konulması gerekmektedir.

Kod:
Sub xl_tablo_import()
'VBE - Tools - References:  Microsoft ActiveX Data Objects 2.8 veya 6.1 Library
    
    Dim cn As New ADODB.Connection, rs As New ADODB.Recordset
    Dim dbPath As String, dbFile As String
    Dim j As Integer
    
    With Application
        .DisplayAlerts = False
        .ScreenUpdating = False
    End With
    
    dbPath = "C:\VERI\DOSYALAR\AYLIK_DOSYALAR"
    dbFile = dbPath & "\veri_tabani_olan_dosya.xlsm"
    
    cn.Open ("Provider=Microsoft.ACE.OLEDB.12.0;" _
            & "Data Source=" & dbFile & ";" _
            & "Extended Properties=""Excel 12.0;HDR=Yes;IMEX=1""")
    
    strSQL = "SELECT [Ocak$].*, [Şubat$].Şubat FROM [Ocak$] INNER JOIN [Şubat$] ON [Ocak$].id = [Şubat$].id;"
    
    With Worksheets("Toplam")
        .Cells.Clear
        rs.Open strSQL, cn, adOpenStatic, adLockReadOnly
        For j = 1 To rs.Fields.Count
            .Cells(1, j).Value = rs.Fields(j - 1).Name
        Next j
        .Range("A2").CopyFromRecordset rs
    End With
    
    rs.Close
    cn.Close

End Sub
 

Zeki Gürsoy

Uzman
Uzman
Katılım
31 Aralık 2005
Mesajlar
4,389
Excel Vers. ve Dili
Office 365 (64 bit) - Türkçe
Merhaba,

Hatırlatmakta fayda var. 2' den fazla excel çalışma sayfası için join işlemine izin verilmiyor.
 
Katılım
24 Temmuz 2007
Mesajlar
726
Excel Vers. ve Dili
Excel 2010 tr
sayın mancubus çok teşekkür ederim aradığım buydu,
Sayın Zeki bey uyarı için teşekkürler
 
Katılım
24 Temmuz 2007
Mesajlar
726
Excel Vers. ve Dili
Excel 2010 tr
Sayın mancubus
kodu aşağıdaki gibi düzenlediğinizde sutun başlıklarını getirmek için ayrı bir kod yazmanıza gerek kalmıyor sql ile birlikte geliyor, paylaşmak istedim

Sub xl_tablo_import()
'VBE - Tools - References: Microsoft ActiveX Data Objects 2.8 veya 6.1 Library

Dim cn As New ADODB.Connection, rs As New ADODB.Recordset
Dim dbPath As String, dbFile As String
Dim j As Integer

With Application
.DisplayAlerts = False
.ScreenUpdating = False
End With

dbPath = ThisWorkbook.Path '"C:\VERI\DOSYALAR\AYLIK_DOSYALAR"
dbFile = dbPath & "\" & ThisWorkbook.Name '"\veri_tabani_olan_dosya.xlsm"


strsql = "SELECT [Ocak$].*, [Şubat$].[f2] FROM [Ocak$] INNER JOIN [Şubat$] ON [Ocak$].[F1] = [Şubat$].[F1];"
Set cn = CreateObject("ADODB.Connection")

cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & dbFile & _
";Extended Properties=""Excel 8.0;HDR=no;IMEX=1"";"

Set rs = cn.Execute(strsql) 'Alan adları yerine F1,F2.. yazılır

With Worksheets("Toplam")
.Cells.Clear '
.Range("A1").CopyFromRecordset rs
End With

rs.Close
cn.Close

End Sub
 

mancubus

Destek Ekibi
Destek Ekibi
Katılım
6 Ocak 2010
Mesajlar
2,224
Excel Vers. ve Dili
İŞ: 2021 Win Eng
rica ederim.

"connection string"deki HDR "header" (xl için başlık, acc için alan ismi), demek. yes derseniz tablom alan ismi (field name) içeriyor, no derseniz içermiyor demek. IMEX ise başlıklarda numerik değer olması ihtimali için 1.

siz yine de benim önerdiğim gibi kullanın.

With - End With, If - End If, vb bloklarda aralardaki satırları girintili yazın. kodun daha kolay okunabilir va anlaşılabilir olmasını sağlar.
 
Üst