Sql'de Excel'deki Hücre Değerine Göre Sorgu yaptırmak

Katılım
25 Mart 2010
Mesajlar
340
Excel Vers. ve Dili
2007,2010
Arkadaşlar aşağıdaki kodda
"WHERE (Cari.ay=12) AND (Cari.yil=2010) " _
, "AND (Cari.BolgeId=500)")
kısmında ben rakama eşit olması yerine bir hücre değerine eşit olmasını istiyorum. yani örneğin Cari.Ay=12 yerine Cari.Ay= "Sayfa1'deki M1 hücresi" olsun istiyorum. kodu nasıl düzenleyebilirim?

Sub Sorgu()
'
' Sorgu Makro
'

'
With ActiveSheet.ListObjects.Add(SourceType:=0, Source:= _
"ODBC;DSN=OTOSRV;Description=OTOSRV;UID=sa;;APP=Mic rosoft Office 2010;WSID=MURAT-PC;DATABASE=TRIGONDATAMERKEZ" _
, Destination:=Range("$G$1")).QueryTable
.CommandText = Array( _
"SELECT Cari.YakitTipiId, Cari.Miktari, Cari.Satis, Cari.yil, Cari.ay, Cari.BolgeId" & Chr(13) & "" & Chr(10) & "FROM TRIGONDATAMERKEZ.dbo.Cari Cari" & Chr(13) & "" & Chr(10) & "WHERE (Cari.yil=2010) AND (Cari.ay=12) AND (Cari.BolgeId=500)" _
)
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.ListObject.DisplayName = "Tablo_OTOSRV_kaynağından_sorgula"
.Refresh BackgroundQuery:=False
End With
 
Katılım
15 Haziran 2006
Mesajlar
3,704
Excel Vers. ve Dili
Excel 2003, 2007, 2010 (TR)
Merhabalar

Aşağıdaki gibi deneyiniz.


Kod:
Sub Sorgu()
    Dim rng As Range
    Dim booHata As Boolean
    
    'Sorgu öncesi Hatalı değer kontrolü
    Set rng = Sheets("Sayfa1").Range("M1")
    If Not IsNumeric(rng) Then
        booHata = True
    Else
        If rng < 1 Or rng > 12 Then
            booHata = True
        Else
            If CInt(rng) - rng \ 10 <> 0 Then
                booHata = True
            End If
        End If
    End If
        
    If booHata Then
        MsgBox "M1'de hatalı ay değeri var", vbCritical, "İşlem Durduruldu"
        Exit Sub
    End If
    
    With ActiveSheet.ListObjects.Add( _
            SourceType:=0, _
            Source:="ODBC;" & _
                    "DSN=OTOSRV;" & _
                    "Description=OTOSRV;" & _
                    "UID=sa;;" & _
                    "APP=Microsoft Office 2010;" & _
                    "WSID=MURAT-PC;" & _
                    "DATABASE=TRIGONDATAMERKEZ", _
            Destination:=Range("$G$1")).QueryTable.CommandText = Array _
                ( _
                    "SELECT " & _
                           "Cari.YakitTipiId, " & _
                           "Cari.Miktari, " & _
                           "Cari.Satis, " & _
                           "Cari.yil, " & _
                           "Cari.ay, " & _
                           "Cari.BolgeId" & Chr(13) & "" & Chr(10) & _
                    "FROM " & _
                           "TRIGONDATAMERKEZ.dbo.Cari Cari" & Chr(13) & "" & Chr(10) & _
                    "WHERE " & _
                           "(Cari.yil=2010) AND (Cari.ay=" & [COLOR="Red"][B]rng[/B][/COLOR] & ") " & _
                           "AND (Cari.BolgeId=500)" _
                )
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .PreserveColumnInfo = True
        .ListObject.DisplayName = "Tablo_OTOSRV_kaynağından_sorgula"
        .Refresh BackgroundQuery:=False
    End With
    
    booHata = False
    Set rng = Nothing

End Sub

.
 
Katılım
25 Mart 2010
Mesajlar
340
Excel Vers. ve Dili
2007,2010
"M1 'de Hatalı ay değeri " uyarısı alıyorum.

Saygılarımla.


Merhabalar

Aşağıdaki gibi deneyiniz.


Kod:
Sub Sorgu()
    Dim rng As Range
    Dim booHata As Boolean
    
    'Sorgu öncesi Hatalı değer kontrolü
    Set rng = Sheets("Sayfa1").Range("M1")
    If Not IsNumeric(rng) Then
        booHata = True
    Else
        If rng < 1 Or rng > 12 Then
            booHata = True
        Else
            If CInt(rng) - rng \ 10 <> 0 Then
                booHata = True
            End If
        End If
    End If
        
    If booHata Then
        MsgBox "M1'de hatalı ay değeri var", vbCritical, "İşlem Durduruldu"
        Exit Sub
    End If
    
    With ActiveSheet.ListObjects.Add( _
            SourceType:=0, _
            Source:="ODBC;" & _
                    "DSN=OTOSRV;" & _
                    "Description=OTOSRV;" & _
                    "UID=sa;;" & _
                    "APP=Microsoft Office 2010;" & _
                    "WSID=MURAT-PC;" & _
                    "DATABASE=TRIGONDATAMERKEZ", _
            Destination:=Range("$G$1")).QueryTable.CommandText = Array _
                ( _
                    "SELECT " & _
                           "Cari.YakitTipiId, " & _
                           "Cari.Miktari, " & _
                           "Cari.Satis, " & _
                           "Cari.yil, " & _
                           "Cari.ay, " & _
                           "Cari.BolgeId" & Chr(13) & "" & Chr(10) & _
                    "FROM " & _
                           "TRIGONDATAMERKEZ.dbo.Cari Cari" & Chr(13) & "" & Chr(10) & _
                    "WHERE " & _
                           "(Cari.yil=2010) AND (Cari.ay=" & [COLOR="Red"][B]rng[/B][/COLOR] & ") " & _
                           "AND (Cari.BolgeId=500)" _
                )
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .PreserveColumnInfo = True
        .ListObject.DisplayName = "Tablo_OTOSRV_kaynağından_sorgula"
        .Refresh BackgroundQuery:=False
    End With
    
    booHata = False
    Set rng = Nothing

End Sub

.
 
Katılım
15 Haziran 2006
Mesajlar
3,704
Excel Vers. ve Dili
Excel 2003, 2007, 2010 (TR)
Evet alabilirsiniz.

Eğer ;

  • M1'deki değer bir sayı değilse,
  • M1'deki değer sayı olupta 1 ila 12 arasında değilse,
  • M1'deki değer, 1 ila 12 arasında olup, küsüratlı bir değer ihtiva ediyorsa
bu hatayı alırsınız.

Eğer yine de ben böyle kontrollerle uğraşamam diyorsanız, kodun aşağıdaki bölümünü silip yeniden deneyiniz.

Kod:
    If Not IsNumeric(rng) Then
        booHata = True
    Else
        If rng < 1 Or rng > 12 Then
            booHata = True
        Else
            If CInt(rng) - rng \ 10 <> 0 Then
                booHata = True
            End If
        End If
    End If
        
    If booHata Then
        MsgBox "M1'de hatalı ay değeri var", vbCritical, "İşlem Durduruldu"
        Exit Sub
    End If
.
 
Katılım
25 Mart 2010
Mesajlar
340
Excel Vers. ve Dili
2007,2010
M1 deki değerim = 5

Evet alabilirsiniz.

Eğer ;

  • M1'deki değer bir sayı değilse,
  • M1'deki değer sayı olupta 1 ila 12 arasında değilse,
  • M1'deki değer, 1 ila 12 arasında olup, küsüratlı bir değer ihtiva ediyorsa
bu hatayı alırsınız.

Eğer yine de ben böyle kontrollerle uğraşamam diyorsanız, kodun aşağıdaki bölümünü silip yeniden deneyiniz.

Kod:
    If Not IsNumeric(rng) Then
        booHata = True
    Else
        If rng < 1 Or rng > 12 Then
            booHata = True
        Else
            If CInt(rng) - rng \ 10 <> 0 Then
                booHata = True
            End If
        End If
    End If
        
    If booHata Then
        MsgBox "M1'de hatalı ay değeri var", vbCritical, "İşlem Durduruldu"
        Exit Sub
    End If
.
 
Katılım
25 Mart 2010
Mesajlar
340
Excel Vers. ve Dili
2007,2010
Silip denediğimde ise "Invalid Procedure, Call Or Argument " Hatası alıyorum ve kodun aşağıdaki kısmı sarı renk oluyor debug yaptığımda.

saygılarımla.

With ActiveSheet.ListObjects.Add( _
SourceType:=0, _
Source:="ODBC;" & _
"DSN=OTOSRV;" & _
"Description=OTOSRV;" & _
"UID=sa;;" & _
"APP=Microsoft Office 2010;" & _
"WSID=MURAT-PC;" & _
"DATABASE=TRIGONDATAMERKEZ", _
Destination:=Range("$G$1")).QueryTable.CommandText = Array _
( _
"SELECT " & _
"Cari.YakitTipiId, " & _
"Cari.Miktari, " & _
"Cari.Satis, " & _
"Cari.yil, " & _
"Cari.ay, " & _
"Cari.BolgeId" & Chr(13) & "" & Chr(10) & _
"FROM " & _
"TRIGONDATAMERKEZ.dbo.Cari Cari" & Chr(13) & "" & Chr(10) & _
"WHERE " & _
"(Cari.yil=2010) AND (Cari.ay=" & rng & ") " & _
"AND (Cari.BolgeId=500)" _
)

Evet alabilirsiniz.

Eğer ;

  • M1'deki değer bir sayı değilse,
  • M1'deki değer sayı olupta 1 ila 12 arasında değilse,
  • M1'deki değer, 1 ila 12 arasında olup, küsüratlı bir değer ihtiva ediyorsa
bu hatayı alırsınız.

Eğer yine de ben böyle kontrollerle uğraşamam diyorsanız, kodun aşağıdaki bölümünü silip yeniden deneyiniz.

Kod:
    If Not IsNumeric(rng) Then
        booHata = True
    Else
        If rng < 1 Or rng > 12 Then
            booHata = True
        Else
            If CInt(rng) - rng \ 10 <> 0 Then
                booHata = True
            End If
        End If
    End If
        
    If booHata Then
        MsgBox "M1'de hatalı ay değeri var", vbCritical, "İşlem Durduruldu"
        Exit Sub
    End If
.
 
Katılım
15 Haziran 2006
Mesajlar
3,704
Excel Vers. ve Dili
Excel 2003, 2007, 2010 (TR)
Sizin ilk mesajda verdiğiniz sorgu çalışıyorsa; o kodunuzda aşağıda gösterdiğim şekilde değişiklik yapın.

Tam olarak kırmızı olan alanı, sizin 1 nolu mesajda verdiğiniz koda ekleyin. Benim verdiğim kodları şimdilik unutun.

Kod:
.... AND (Cari.ay=[COLOR="Red"]" & Sheets("Sayfa1").Range("M1").Value & "[/COLOR] AND (Cari....
.
 
Katılım
25 Mart 2010
Mesajlar
340
Excel Vers. ve Dili
2007,2010
yine hata alıyorum Kodu şu şekilde düzenledim . Rica etsem inceleyebilir misiniz, belki bir yerde yanlışlık yapıyorumdur?

Sub sorgu()
'
' sorgu Makro
'

'
ActiveWorkbook.Worksheets.Add
With ActiveSheet.QueryTables.Add(Connection:= _
"ODBC;DSN=OTOSRV;Description=OTOSRV;UID=sa;;APP=Microsoft Office 2003;WSID=MURAT-PC;DATABASE=TRIGONDATAMERKEZ;Network=DBMSSOCN" _
, Destination:=Range("g1"))
.CommandText = Array( _
"SELECT Cari.YakitTipiId, Cari.Miktari, Cari.Satis, Cari.ay, Cari.yil, Cari.BolgeId" & Chr(13) & "" & Chr(10) & "FROM TRIGONDATAMERKEZ.dbo.Cari Cari" & Chr(13) & "" & Chr(10) & "WHERE (Cari.ay=" & Sheets("Sayfa1").Range("M1").Value & " AND (Cari.yil=2010) AND (Cari.BolgeId=500)" _
)
.Name = "OTOSRV kaynağından sorgula"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.Refresh BackgroundQuery:=False
End With
End Sub



Sizin ilk mesajda verdiğiniz sorgu çalışıyorsa; o kodunuzda aşağıda gösterdiğim şekilde değişiklik yapın.

Tam olarak kırmızı olan alanı, sizin 1 nolu mesajda verdiğiniz koda ekleyin. Benim verdiğim kodları şimdilik unutun.

Kod:
.... AND (Cari.ay=[COLOR="Red"]" & Sheets("Sayfa1").Range("M1").Value & "[/COLOR] AND (Cari....
.
 
Katılım
25 Mart 2010
Mesajlar
340
Excel Vers. ve Dili
2007,2010
ayrıca bu kod ile şu hatayı alıyorum :

"YAPILANDIRILMIŞ SORGU DİLİ HATASI"
ve Debug dediğimde,

.Refresh BackgroundQuery:=False kısmı Sarı oluyor

saygılarımla
 
Katılım
15 Haziran 2006
Mesajlar
3,704
Excel Vers. ve Dili
Excel 2003, 2007, 2010 (TR)
Bu tür kodları, ikinci şahısların deneme şansı yok. Çünkü database'e sadece siz bağlısınız.

Sizin ilk mesajınızda "...(Cari.ay=12)..." içeren kod, pratikte hata vermeden çalışıyor muydu ?


.
 
Katılım
25 Mart 2010
Mesajlar
340
Excel Vers. ve Dili
2007,2010
Evet Ferhat Bey çalşıyordu. ancak ben o kodu evdeki Office2010 yüklü bilgisayarımda hazrılayıp yollamıştım. şimdi ise işyerimdeyim ve silbaştan aynı makroyu size yolladığım son mesajda Office2003 kullanarak hazırladım. Çalşmasında bir sorun yok Ferhat Bey.

Saygılar.

Bu tür kodları, ikinci şahısların deneme şansı yok. Çünkü database'e sadece siz bağlısınız.

Sizin ilk mesajınızda "...(Cari.ay=12)..." içeren kod, pratikte hata vermeden çalışıyor muydu ?


.
 
Katılım
15 Haziran 2006
Mesajlar
3,704
Excel Vers. ve Dili
Excel 2003, 2007, 2010 (TR)
Anladığım kadarıyla, bu kodlar Office 2010'da yapılan bir makro kaydı ..

Eğer makroyu siz kaydettiyseniz veya makro kaydetmeyi biliyorsanız, işyerinizdeki Office 2003 üzerinden aynı makro kaydını tekrar yapın.

İkisini mukayese edelim.


.
 
Katılım
25 Mart 2010
Mesajlar
340
Excel Vers. ve Dili
2007,2010
Tekrar yolluyorum Öyleyse... şu an yaptğımı
Ayrıca şöyle bir sorunum daha var her yeni sorgu yaptığımda yeni çalışma sayfası açıyor , oysa ben aynı aralığın üzerine yazmasını istiyorum , neyse bu sonra hallolabilir bir husus, Ferhat Bey Office 2003 ile tekrar makroyu kaydettim buyurun

Sub SORGU()
'
' SORGU Makro
' Makro MURAT tarafından 08.01.2011 tarihinde kaydedildi.
'

'
ActiveWorkbook.Worksheets.Add
With ActiveSheet.QueryTables.Add(Connection:= _
"ODBC;DSN=OTOSRV;Description=OTOSRV;UID=sa;;APP=Microsoft Office 2003;WSID=MURAT-PC;DATABASE=TRIGONDATAMERKEZ;Network=DBMSSOCN" _
, Destination:=Range("A1"))
.CommandText = Array( _
"SELECT Cari.Miktari, Cari.Satis, Cari.ay, Cari.yil, Cari.BolgeId" & Chr(13) & "" & Chr(10) & "FROM TRIGONDATAMERKEZ.dbo.Cari Cari" & Chr(13) & "" & Chr(10) & "WHERE (Cari.ay=12) AND (Cari.yil=2010) AND (Cari.BolgeId=500)" _
)
.Name = "OTOSRV kaynağından sorgula"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.Refresh BackgroundQuery:=False
End With
End Sub


Anladığım kadarıyla, bu kodlar Office 2010'da yapılan bir makro kaydı ..

Eğer makroyu siz kaydettiyseniz veya makro kaydetmeyi biliyorsanız, işyerinizdeki Office 2003 üzerinden aynı makro kaydını tekrar yapın.

İkisini mukayese edelim.


.
 
Katılım
25 Mart 2010
Mesajlar
340
Excel Vers. ve Dili
2007,2010
Ferhat Bey, sorunum çözüldü çok teşekkürler ancak sormak istediğim bir husus daha var:

makroyu her çalıştırdığımda, otomatik olarak yeni bir sayfa açılıyor ve veriler oraya yazılıyor . yani her sorgu yaptığımda yeni bir sayfaya gidiyor sorgular. oysa ben sorguyu yaptığımda verilerin her zaman Sayfa3'ün A1 hücresinden başlayarak aktarılmasını, yeni bir sorgu yaptığımda ise Sayfa3'ün içeriğinin silinip bu yeni yapılan sorgunun verilerinin aktarılmasını istiyorum.

ClearContents gibi birşeydi ama tam olarak bilmiyorum kodu.

Destination:=Range("A1"))

kısmı ile ilgili sanırım.

Teşekkür ederim.
 
Katılım
11 Temmuz 2006
Mesajlar
36
Excel Vers. ve Dili
2010 TR
Merhaba ,

Bu sorunu Ms.SQL sorgusunu tasarlarken değer yazdığınız yere "[]" işaretlerini koysaydınız excele geri dödüğünde query hangi hücrelere eşitlemek istediğini kendisi size soracaktı. Mesela 2010 yazacağınız yere [] simgelerini koyup sorgudan excele dönerseni istediğiniz şey olur. Yanlız size hangi hücreye eşitlemek istediğinizi soran yerin altında bulunan "bundan sonra aynı hücreyi kullan" tarzı açıklamanın başındaki alanı işaretlemeniz gerekiyor.

Bilginize...
 
Katılım
9 Mayıs 2006
Mesajlar
1
Sub yenile()
Dim a As Date
Dim b As Date
a = Range("aa1").Value
Range("A2").Select
With ActiveWorkbook.Connections("fmakinesi kaynağından sorgula").ODBCConnection
.BackgroundQuery = True
.CommandText = Array( _
"SELECT f_0.Id, f_0.tarih, f_0.hiz, f_0.devir,f_0.boydegeri, f_0.AnaMotor, f_0.operatör, f_0.borutipi, f_0.sipkodu, f_0.ürüntip, f" _
, _
"_0.cap, f_0.boy" & Chr(13) & "" & Chr(10) & "FROM f.f f_0" & Chr(13) & "" & Chr(10) & "WHERE (f_0.tarih Between " & Sheets("Sayfa1").Range("aa2").Value & " And '17/12/2014 23:59:59')" _
)
.CommandType = xlCmdSql
.Connection = _
"ODBC;DATABASE=f;DSN=fmakinesi;OPTION=0;;PORT=0;SERVER=192.168.2.21;UID=root;"
.RefreshOnFileOpen = False
.SavePassword = False
.SourceConnectionFile = ""
.SourceDataFile = ""
.ServerCredentialsMethod = xlCredentialsMethodIntegrated
.AlwaysUseConnectionFile = False
End With
With ActiveWorkbook.Connections("fmakinesi kaynağından sorgula")
.Name = "fmakinesi kaynağından sorgula"
.Description = ""
End With
ActiveWorkbook.Connections("fmakinesi kaynağından sorgula").Refresh
Application.DisplayStatusBar = True
Application.StatusBar = "...F makinesinin verileri getiriliyor. Lütfen bekleyiniz! "
Application.DisplayStatusBar = Application.DisplayStatusBar
Application.OnTime Now + TimeValue("00:00:05"), "statusbarnormal"
Application.OnTime Now + TimeValue("00:00:05"), "hesapla"

End Sub



bu kodda ki f_0.tarih Between " & Sheets("Sayfa1").Range("aa2").Value & " kısmı çalışmıyor. aa2 hücresinde gg.aa.yyyy ss:dd:nn formatında tarih var. sorun ne anlayamadım bir türlü. yardımcı olursanız çok memnun olurum.
 
Üst