• DİKKAT

    DOSYA İndirmek/Yüklemek için ÜCRETLİ ALTIN ÜYELİK Gereklidir!
    Altın Üyelik Hakkında Bilgi

Makro ile Sql den bilgi almak

Katılım
14 Ocak 2005
Mesajlar
807
Excel Vers. ve Dili
Microsoft Office Professional Plus 2021
Selam Arkadaşlar Formda aradım bulumadım. Yardım edebileceğinizi düşündüm.

ben Veri - Dış Veri Al - Yeni SQL Server bağlantısı ile manuel olarak serverimizde bulunan SQL serverden aşağıdaki gibi bilgilerimi alabiliyorum.
BAĞLANTI:

Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=True;Initial Catalog=DATA06;Data Source=192.168.0.7;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=OZCANBLG;Use Encryption for Data=False;Tag with column collation when possible=False

KOMUT TÜRÜ : SQL

KOMUT :

SELECT ADSDOS_MLZ_KOD, ADSDOS_ACK, SUM(ADSDOS_STK_MIK) AS MIKTAR, SUM(ADSDOS_NET_TLL) AS TLTUTAR FROM ADSDOS WHERE ADSDOS_TAR BETWEEN '2007-09-24' AND '2007-10-03' AND ADSDOS_PAK_KOD = '' AND ADSDOS_SAT_TIP <> '5' GROUP BY ADSDOS_MLZ_KOD, ADSDOS_ACK

Bu komutlarla bilgilerim iste&#287;im gibi geliyor.

Benim Yapmak istedi&#287;im sayfaya ekleyece&#287;im bir buton ile bana hangi tarihler aras&#305;nda alaca&#287;&#305;m&#305; soracak ve ona g&#246;re bu bilgileri getirebilmesi gerekiyor. A&#231;aba bu &#351;ekilde bir macro ile yapabilirmiyiz. Te&#351;ekk&#252;rler
 
&#199;ok emin cevaplayam&#305;yorum ama a&#351;a&#287;&#305;daki gibi denerseniz olabilir. E&#287;er olmazsa ba&#351;ka yollar da deneyebiliriz.

VARSAYIMLAR : Tarih aral&#305;&#287;&#305; A1 ve A2'de belirtilmek &#252;zere:

(1) A1 h&#252;cresi : &#304;lk Tarih
(2) A2 h&#252;cresi : Son Tarih

a&#351;a&#287;&#305;daki stringi SQL'e g&#246;nderebilirsiniz.

Kod:
SQLString = "SELECT ADSDOS_MLZ_KOD, " _
                & "ADSDOS_ACK, " _
                & "SUM(ADSDOS_STK_MIK) AS MIKTAR, " _
                & "SUM(ADSDOS_NET_TLL) AS TLTUTAR " _
          & "FROM ADSDOS " _
          & "WHERE ADSDOS_TAR BETWEEN '" & Year(Range("A1")) & "-" & Month(Range("A1")) & Day(Range("A1")) & "' AND " _
                                   & "'" & Year(Range("A2")) & "-" & Month(Range("A2")) & Day(Range("A2")) & "' AND " _
                                   & "ADSDOS_PAK_KOD = '' AND ADSDOS_SAT_TIP <> '5' GROUP BY ADSDOS_MLZ_KOD, ADSDOS_ACK"
 
Say&#305;n fpc bu t&#252;r kod hi&#231; yazmad&#305;m. SQL e g&#246;ndereilirsiniz demi&#351;siniz bunu nas&#305;l yap&#305;ca&#287;&#305;m yard&#305;m ederseniz sevinirm.
 
Selam,
http://www.excel.web.tr/showthread.php?t=14771
bu linki bir kontrol edebilirmisiniz? Bu linkte SQL'e ba&#287;lant&#305;y&#305; nas&#305;l yapaca&#287;&#305;n&#305;z anlat&#305;lm&#305;&#351;. Linkteki sorgu c&#252;mlesinin yerine @fpc'nin sorgu c&#252;mlesini yazarsan&#305;z, d&#305;&#351; veri al'a gerek kalmaz.
Kolay gelsin.
 
Son düzenleme:
Say&#305;n Red lion 72 &#304;nceledim ama benim i&#231;in &#231;ok kar&#305;&#351;&#305;k bir yard&#305;mc&#305; olursan&#305;z &#231;ok sevinece&#287;im. Hem ilersi i&#231;in kendimi geli&#351;tirmi&#351; olurum. Ger&#231;ekten &#231;ok ihtiyac&#305;m var bu &#246;rne&#287;e. Te&#351;ekk&#252;r ederim.
 
E&#287;er Sql'den veri &#231;ekti&#287;iniz makro kayd&#305;n&#305;z varsa, kodlar&#305;n&#305;z&#305; bu ba&#351;l&#305;k alt&#305;na koyun. ADO ba&#287;lant&#305;lar&#305;n&#305; kullanmadan &#231;&#246;zmeye &#231;al&#305;&#351;al&#305;m.
 
Sub Makro1()
'
' Makro1 Makro
' Makro &#214;zcan &#214;zarslan taraf&#305;ndan 05.10.2007 tarihinde kaydedildi.
'

'
With ActiveSheet.QueryTables.Add(Connection:=Array( _
"OLEDB;Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=True;Data Source=192.168.0.7;Use Procedure for Prepare=1;Auto" _
, _
" Translate=True;Packet Size=4096;Workstation ID=OZCANBLG;Use Encryption for Data=False;Tag with column collation when possible=F" _
, "alse;Initial Catalog=DATA06"), Destination:=Range("A1"))
.CommandType = xlCmdSql
.CommandText = Array( _
"SELECT ADSDOS_MLZ_KOD, ADSDOS_ACK, SUM(ADSDOS_STK_MIK) AS MIKTAR, SUM(ADSDOS_NET_TLL) AS TLTUTAR FROM ADSDOS WHERE ADSDOS_TAR BETWEEN '2007-09-24' AND '2007-10-03' AND ADSDOS_PAK_KOD = '' AND ADSDOS_SAT_TIP <> '5' GROU" _
, "P BY ADSDOS_MLZ_KOD, ADSDOS_ACK")
.Name = "+Yeni SQL Server Ba&#287;lant&#305;s&#305;_3"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.SourceConnectionFile = _
"C:\Documents and Settings\ozcan.GARDENIA\Belgelerim\Veri Kaynaklar&#305;m\192.168.0.7 DATA06 ADSDOS.odc"
.Refresh BackgroundQuery:=False
End With
End Sub

D&#305;&#351; veri al i&#351;lemini macro1 olarak kaydettim san&#305;r&#305;m bunu diyorsunuz.
 
Aşağıdaki kodu deneyiniz.

VARSAYIM : "Sayfa2" adlı sheet'in A1 hücresine ilk tarihin, A2 hücresine son tarihin yazılacağı, sonra Sayfa1'e geçileceği ve makronun çalıştırılacağı varsayılmıştır.

NOT : İlk seferde düzgün çalışmayabilir. Eğer hata oluşursa bildiriniz.

Kod:
Sub Makro1()
'
' Makro1 Makro
' Makro Özcan Özarslan tarafından 05.10.2007 tarihinde kaydedildi.
'
Set sh = Sheets("Sayfa2")
SQLstring = "SELECT ADSDOS_MLZ_KOD, " _
                & "ADSDOS_ACK, " _
                & "SUM(ADSDOS_STK_MIK) AS MIKTAR, " _
                & "SUM(ADSDOS_NET_TLL) AS TLTUTAR " _
          & "FROM ADSDOS " _
          & "WHERE ADSDOS_TAR BETWEEN '" & Year(sh.Range("A1")) & "-" & Month(sh.Range("A1")) & Day(sh.Range("A1")) & "' AND " _
                                   & "'" & Year(sh.Range("A2")) & "-" & Month(sh.Range("A2")) & Day(sh.Range("A2")) & "' AND " _
                & "ADSDOS_PAK_KOD = '' AND " _
                & "ADSDOS_SAT_TIP <> '5' " _
          & "GROUP BY ADSDOS_MLZ_KOD, ADSDOS_ACK"
With ActiveSheet.QueryTables.Add(Connection:=Array("OLEDB;Provider=SQLOLEDB.1;" _
                                            & "Integrated Security=SSPI;" _
                                          & "Persist Security Info=True;" _
                                                    & "Data Source=192.168.0.7;" _
                                      & "Use Procedure for Prepare=1;Auto", _
                                                       " Translate=True;" _
                                                    & "Packet Size=4096;" _
                                                 & "Workstation ID=OZCANBLG;" _
                                        & "Use Encryption for Data=False;" _
                        & "Tag with column collation when possible=False;" _
                                                & "Initial Catalog=DATA06"), _
                                                      Destination:=Range("A1"))
    .CommandType = xlCmdSql
    .CommandText = Array(SQLstring)
    .Name = "+Yeni SQL Server Bağlantısı_3"
    .FieldNames = True
    .RowNumbers = False
    .FillAdjacentFormulas = False
    .PreserveFormatting = True
    .RefreshOnFileOpen = False
    .BackgroundQuery = True
    .RefreshStyle = xlInsertDeleteCells
    .SavePassword = False
    .SaveData = True
    .AdjustColumnWidth = True
    .RefreshPeriod = 0
    .PreserveColumnInfo = True
    .SourceConnectionFile = "C:\Documents and Settings\ozcan.GARDENIA\Belgelerim\Veri Kaynaklarım\192.168.0.7 DATA06 ADSDOS.odc"
    .Refresh BackgroundQuery:=False
End With
Set sh = Nothing
End Sub
 
.Refresh BackgroundQuery:=False

Aynen dedi&#287;in gibi yapt&#305;m say&#305;n fpc ama bu sat&#305;rda hata verdi.
 
Blok &#351;eklinde bir kod oldu. Hata en son sat&#305;rda ama ayn&#305; zamanda en &#246;l&#252;mc&#252;l sat&#305;rda ... Hatan&#305;n neden ve nerden kaynakland&#305;&#287;&#305;n&#305; anlayam&#305;yorum. Makro kayd&#305; harici kodlarla, ba&#351;ka bir yol deneyelim.
 
Evet san&#305;r&#305;m &#246;yle yapsak iyi olucak ama ben daha &#246;nce hi&#231; bu &#351;ekilde bir veri almad&#305;m. SQL c&#252;mleci&#287;imiz belli serverimiz belli kullan&#305;c&#305;m&#305;z belli taplomuz da belli acaba ba&#351;ka ne t&#252;rl&#252; bir &#351;ekilde bu verileri vb ile excel e alabiliriz.
 
Yine aynı şekilde aşağıdaki kodları dener misiniz?

NOT : VBE Menüden: Tools->References'a basın. Listeden; Microsoft Activex Data Object 2.x Library ve Microsoft ADO Ext. 2.8 for DLL and Security işaretlenmiş olmalıdır.

NOT : Kodlarda kırmızı olarak işaretlenen kısımlara, kendi Username ve Passwordunuzu yazınız.

Kod:
Sub VeriAl()
Dim conn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Dim SQLString As String
Dim sh As Worksheet
Dim y As Long, i As Integer
Set conn = New ADODB.Connection
Set rs = New ADODB.Recordset
Set sh = Sheets("Sayfa2")
conn.ConnectionString = "Provider=sqloledb;" _
                   & "Data Source=192.168.0.7;" _
               & "Initial Catalog=DATA06;" _
                       & "User Id=User;" _
                      & "Password=Pass;"
conn.Open
SQLString = "SELECT ADSDOS_MLZ_KOD, " _
                & "ADSDOS_ACK, " _
                & "SUM(ADSDOS_STK_MIK) AS MIKTAR, " _
                & "SUM(ADSDOS_NET_TLL) AS TLTUTAR " _
          & "FROM ADSDOS " _
          & "WHERE ADSDOS_TAR BETWEEN '" & Year(sh.Range("A1")) & "-" & Month(sh.Range("A1")) & Day(sh.Range("A1")) & "' AND " _
                                   & "'" & Year(sh.Range("A2")) & "-" & Month(sh.Range("A2")) & Day(sh.Range("A2")) & "' AND " _
                & "ADSDOS_PAK_KOD = '' AND " _
                & "ADSDOS_SAT_TIP <> '5' " _
          & "GROUP BY ADSDOS_MLZ_KOD, ADSDOS_ACK"
rs.Open SQLString, conn, adOpenKeyset, adLockOptimistic
Do Until rs.EOF
    y = y + 1
    For i = 1 To 4
        Cells(y, i) = rs(i - 1)
    Next i
Loop
rs.Close
Set conn = Nothing
Set rs = Nothing
Set sh = Nothing
End Sub
 
Selamlar, Aynı şekilde benimde bir rapor çalışmam olmuştu, ve tarih aralığını Takvim öğesi Kullanarak çözdüm,

Yapmış olduğum raporda Takvimi birden fazla kullandığımdan dolayı öncelikle makroya takvim verilerini bir alana yazdırmasını ve bu işlemden sonra rapora ait makroyu çalıştırmasını sağladım bu şekilde istediğim tarih veya başka aralıkta rapor almam mümkün oldu,

Ekteki Takvim Denetimi ile ilgili Dosyayı inceleyiniz sanırım İşinizi Görecektir. SQL ile ilgili alanlara tablo ve Başlıklara kendi tablonuza ait verileri girmeniz gerekmektedir. Aksi halde çalışmayacaktır.

Not : VBA Referans bölümünden Takvim denetimi 11 i etkinleştirmeniz gerekmekte.
 
Son düzenleme:
Paylaşım için teşekkürler.
 
Geri
Üst