• DİKKAT

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

Kapalı Dosyadan İki sütuna göre veri alma

Katılım
24 Şubat 2009
Mesajlar
1,077
Excel Vers. ve Dili
2016
Merhaba arkadaşlar; herkese iyi geceler; elimde iki dosya var biri açık biri kapalı, açık olan dosyamda AD VE SOYAD yazınca bu personele ait KAPALI dosyada bulunan B ve G sütunlarındaki verilerin gelmesini istiyorum, personelin ismi hatırlanıyor, ama SİCİLİ ve TC. bilmek hafızada tutmak zor oluyor, bu verileri getirmek için bana bir kod yazabilir seniz çok sevinirim. Örnek dosyam da ektedir. Teşekkür ederim
 

Ekli dosyalar

Deneyiniz.

C++:
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim Baglanti As Object, Kayit_Seti As Object, Sorgu As String
    Dim Dosya As String, Ad As String, Soyad As String
    
    If Intersect(Target, Range("B2")) Is Nothing Then Exit Sub
    If Target.Cells.Count > 1 Then Exit Sub
    
    Set Baglanti = CreateObject("ADODB.Connection")
    
    Dosya = ThisWorkbook.Path & "\KAPALI.xlsm"
    
    Range("D5,E3").ClearContents
    
    Baglanti.Open "Provider=Microsoft.Ace.OleDb.12.0;Data Source=" & _
                   Dosya & ";Extended Properties=""Excel 12.0;Hdr=No"""
    
    If InStr(1, Target, " ") > 0 Then
        Ad = Left(Target, InStr(1, Target, " ") - 1)
        Soyad = Replace(Target, Ad & " ", "")
        Sorgu = "Select F2,F7 From [LİSTE$] Where F3 = '" & Ad & "' And F4 = '" & Soyad & "'"
        Set Kayit_Seti = Baglanti.Execute(Sorgu)
        If Not Kayit_Seti.EOF Then
            Range("E3").Value = Kayit_Seti.Fields(0).Value
            Range("D5").Value = Kayit_Seti.Fields(1).Value
        Else
            MsgBox "Uygun kayıt bulunamadı!", vbCritical
        End If
        Kayit_Seti.Close
        Baglanti.Close
    Else
        MsgBox "İşleme devam edebilmek için lütfen Ad-Soyad bilgisini tam giriniz!", vbCritical
    End If
    
    Set Kayit_Seti = Nothing
    Set Baglanti = Nothing
End Sub
 
Merhaba Korbay bey; Eline sağlık çok güzel olmuş size dua ediyorum, benim düşünemediğimi siz düşünüp yapmışsınız, ama şöyle bir sorun var onlar da şu; Eğer İsimler çift ile Örneğin Mehmet Ali, Hacı Bayram gibi çift isimler olursa getirmiyor, kayıt bulunamadı diyor, tabi ki bunun Soy isim dede çift olabilen oluyor özellikle bayan personellerin çift soy isimleri oluyor, son olarak da abiciğim şimdilik bu listemde yok ama bazen oluyor, Mesele özellikle Mehmet isimlerinde Örneğin Mehmet GÜL bundan iki tane olabiliyor bunu denedim, sadece en önde gelen ismi veriyor, yani ikincisini getirmiyor, bunun içinde bir mesajla bu isimden iki tane veya üç tane var gibi yazarsa bunu listemi açıp bakarak doğruyu yazabilirim, yada yapılırsa olursa "Aradığınız isim mükerrer bunu mu aradınız? hayır ise ikinci Mehmet GÜL isimli şahın verilerini getirmesini istiyorum. Bu dediğim olmaz ise bana sadece mükerrer olduğunu söylesin, bunun için ben listemi açık yazarım. Teşekkür ederim iyi akşamlar. Umarım çok bir şey istemedim. Sizler bizlere hep yardımcı oluyorsunuz sizleri de kırmak istemiyorum. Tekrar Teşekkür ederim.
 
HACI BAYRAM dediğiniz kişinin soyadı da vardır. Çift isimli ya da çift soyisimli kişiler varsa kodu basitleştirmek adına iki ayrı hücre kullanılması daha sağlıklı olacaktır.

ADI'nı bir hücreye yazarsınız. SOYADI'nı ayrı bir hücreye yazıp sorgularsınız. Bu şekilde uygun olur mu?

Birde tekrar eden isimlerden hangisini seçeceğinizi hangi kritere göre belirliyorsunuz?
 
Merhaba abim; Zaten isimler ve Soy isimler ayrı ayrı sütunlarda, İsimler C sütununun da Soy isimler ise D sütununun da, bunda sorun yok, sorun şöyle oluyor, Örneğin Personelin Adı soyadı Hacı ÖZKAN ise, bu geliyor, Ama İsmi Hacı Bayram Soyadı ÖZKAN olunca bulmuyor, yani çift isimli olanları getirmiyor, tekrar eden isimlerden ise Örneğin Korhan Ayhan ismi iki tane olabilir, yani mükerrer ama bunların sicil ve tc leri muhakkak farklı olacaktır, bunu ikaz etmesini yani mükerrer olduğunu ikaz etmesini istiyorum. Bu özellik sadece mesajlada olabilir, yani "Uyarı bu isimden mükerrer var diye bir mesaj verirse dosyadan açık doğru olanı yaza bilirim bu istisna 200 'de bir olasılık belki daha fazla
 
KAPALI dosyanızı kast etmedim.

Mevcut dosyanıza göre çift soyisimli bir bayan personel olduğunda bunu excel neye göre ayıracak.

Açık olan dosyanızda sorgulama yaparken adını bir hücreye soyadını da ayrı bir hücreye yazarsanız daha sağlıklı sorgulama olacaktır.

Ben bunu kast etmiştim.
 
Anladım Korhan bey; o zaman bu kodu B2 (ad)ye ek olarak B3 (soyad) de olsun böyle yapalım zahmet olmaz sa
 
Deneyiniz.

C++:
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim Baglanti As Object, Kayit_Seti As Object, Sorgu As String
    Dim Dosya As String, Ad As String, Soyad As String
    
    If Intersect(Target, Range("B2:B3")) Is Nothing Then Exit Sub
    If Target.Cells.Count > 1 Then Exit Sub
    
    If Range("B2") = "" Then
        MsgBox "Lütfen ADI bilgisiniz giriniz!", vbCritical
        Range("B2").Select
        Exit Sub
    End If
    
    If Range("B3") = "" Then
        MsgBox "Lütfen SOYADI bilgisiniz giriniz!", vbCritical
        Range("B3").Select
        Exit Sub
    End If
    
    Set Baglanti = CreateObject("ADODB.Connection")
    
    Dosya = ThisWorkbook.Path & "\KAPALI.xlsm"
    
    Range("D5,E3").ClearContents
    
    Baglanti.Open "Provider=Microsoft.Ace.OleDb.12.0;Data Source=" & _
                   Dosya & ";Extended Properties=""Excel 12.0;Hdr=No"""
    
    Ad = Range("B2").Value
    Soyad = Range("B3").Value
    
    Sorgu = "Select F2, F7  From [LİSTE$] Where F3 = '" & Ad & "' And F4 = '" & Soyad & "'"
    Set Kayit_Seti = Baglanti.Execute(Sorgu)
    
    If Not Kayit_Seti.EOF Then
        Range("E3").Value = Kayit_Seti.Fields(0).Value
        Range("D5").Value = Kayit_Seti.Fields(1).Value
    Else
        MsgBox "Uygun kayıt bulunamadı!", vbCritical
    End If
    
    Sorgu = "Select Count(*) From [LİSTE$] Where F3 = '" & Ad & "' And F4 = '" & Soyad & "'"
    Set Kayit_Seti = Baglanti.Execute(Sorgu)
    
    If Not Kayit_Seti.EOF Then
        If Kayit_Seti.Fields(0).Value > 1 Then
            MsgBox "Birden fazla eşleşen kayıt bulundu!", vbCritical
        End If
    End If
    
    Kayit_Seti.Close
    Baglanti.Close
    
    Set Kayit_Seti = Nothing
    Set Baglanti = Nothing
End Sub
 
Bilgi için;

Aslında "Recordset" nesnesinden verileri almak için Execute metodu yerine Open kullanırsak, mükerrer kayıt sayısı için 2. sorguya gerek kalmaz....

Kod:
    '..........
    '.....
    Sorgu = "Select F2, F7  From [LİSTE$] Where F3 = '" & Ad & "' And F4 = '" & Soyad & "'"
   
    Set Kayit_Seti = CreateObject("ADODB.Recordset")
   
    adOpenStatic = 3
    adLockReadOnly = 3
   
    Kayit_Seti.Open Sorgu, Baglanti, adOpenStatic, adLockReadOnly

    If Not Kayit_Seti.EOF Then
        If Kayit_Seti.RecordCount > 1 Then
            MsgBox "Birden fazla eşleşen kayıt bulundu!", vbCritical
            Exit Sub
        End If
        Range("E3").Value = Kayit_Seti.Fields(0).Value
        Range("D5").Value = Kayit_Seti.Fields(1).Value
    Else
        MsgBox "Uygun kayıt bulunamadı!", vbCritical
    End If
   
    '........
    '....


.
 
Merhaba Korhan bey; 2 numaralı mesajındaki kodlarla Soyisim çift olursa istenilen verileri buluyor, bunu Ad için yapamaz mıyız, yani ad çift olunca bulsun soyisim tek olsun, bu olur mu? Soyisim çift olursa oluyor,
 
Bu şekilde iki örnek verebilir misiniz?

AD (Çift) SOYADI (Tek)
AD (Tek) SOYADI (Çift)
 
Evet Abi Sana attığım listemde yok ama gerçek listem de var, Örneğin;
Ad HACI BAYRAM SOYAD: ÖZKAN bu gelmiyor, ama soyad çift olunca geliyor oda
Ad HACER soyad ÜNLÜ ŞAHİN
Bunları kapalı dosyama eklersen oluyor abim.
 
Benim 2. mesajda verdiğim kod şu mantıkla çalışıyor.

Yazdığınız AD-SOYAD bilgisindeki boşluk karakterine bakıyor.
İlk boşluk karakterinden ayırıp bunu AD olarak baz alıyor.
Sonrasında "değiştir" komutu ile ad bilgisini AD-SOYAD bilgisinden temizliyor.( ki burası aslında riskli olmuş) Kalan bilgi SOYAD olarak dikkate alınıyor.

Sizin verdiğiniz örnekler üzerinden gidersek;

HACI BAYRAM ÖZKAN
HACER ÜNLÜ ŞAHİN

Bu iki örnekte 3 kelimeden oluşuyor. Excel bunun AD ya da SOYAD olacağını neye göre ayıracak.

Ben sıkıntılı bölümleri koyu renkle belirttim. Biz bu ayrışımı gözle yapabiliyoruz. Ama bunu excele anlatmak gerekiyor ki doğru sonucu verebilsin.

Bu sebepten dolayı AD ve SOYAD bilgisini ayrı hücrelere yazmanızı talep ettim.

Sizin aklınıza bir çözüm geliyorsa uygulayabiliriz.
 
Yoo yoo abim nerden gelecek deneyince bu şekilde olunca İsim de de çift olunca olacağını düşündüm, soyisim tek olsun istedim, eğer böyle olursa kodu değiştirmeni isteyecektim, teşekkür ederim iyi geceler Allah rahatlık versin.
 
Geri
Üst