[VBA] Bir Not Alanından Belirli Kritere Uyan Parçaları Alıp Başka Bir Tabloya Kaydetmek
#1
Arkadaşlar merhaba, 
uzun bir süredir uğraşıyorum ancak bir türlü beceremedim. yapmak istediğim şu;
bir not alanında bulunan verilerin içerisinden belirli bir kritere uyan parçaları alıp, aynı veritabanı içerisindeki ikinci bir tabloya kaydedilmesini sağlamak. notların uzunluğu ve almak istediğim parçaların konumları ile uzunlukları değişken olduğundan access'in standart fonksiyonları ile yapamadım. 
VBA bilgim çok sınırlı olduğundan, yeni bir fonksiyon yazıp hedefime ulaşabilmek imkansız, bu konuda uzmanlığı olan forumdaki arkadaşlardan yardım bekliyorum. 
yardımcı olacak arkadaşlar için örnek verileri içeren basit bir VT'yi EK bölümüne ekledim. bu örnek üzerinden yapmak istediğim;

Tablo1'de not alanında bulunan verilerin içerisinden "(4" ile başlayıp ")" ile biten her bir parçayı alıp VBA'da iki sütunlu RecordSet nesnesinde biriktirmek, (birinci sütunda tablo1'deki ID alanı, ikinci sütunda kritere uyan parça
yani kriterim parantez içinde4 ile başlayıp, parantezin kapandığı yere kadar olan bölümü - parantezlerin alınmasına gerek yok - kısaca not içerisinde parantezler içinde olan ancak 4 ile başlayanların tümü alınacak

tümünü aldıktan sonra recordset nesnesindeki verileri tablo2'ye ID'leri ile birlikte aktarmak


Eklenti Dosyaları
.rar   MetinKutusuVerilerAlma.rar (Boyut: 15,58 KB / İndirilme: 78)



  Alıntı
Bu mesajı beğenenler:
#2
mesela tablo1--> 1. kayıtta diyelim ki 3 tane (4 var bunlar tabloya: aynı IDli 3 farklı kayıt olarak mı aktarılacak tek kayıt olarak mı?
tek kayda aktarılacaksa aralarına boşluk tire yada benzeri bir şey koyulacak mı yoksa sadece ard arda aynı satıra mı eklenecek



  Alıntı
Bu mesajı beğenenler:
#3
önce bir modül oluşturup aşağıdaki 2 fonksiyonu modüle ekleyin
Visual Basic
  1. Function Degis(txtGec As String)
  2.    IntVar = InStr(txtGec, "(4")
  3.    Degis = ""
  4.        Do While Not IntVar = 0
  5.            txtGec = Mid(txtGec, IntVar + 1)
  6.          If AlfaSayi(Left(txtGec, InStr(1, txtGec, ")", 2) - 1)) = True Then Degis = Degis & "-" & Left(txtGec, InStr(1, txtGec, ")", 2) - 1)
  7.            IntVar = InStr(txtGec, "(4")
  8.        Loop
  9.   if Degis<>"" then Degis = Mid(Degis, 2)
  10. End Function


Visual Basic
  1. Function AlfaSayi(txtGec As String) As Boolean
  2. 'hy alfasay?sal bul___________________
  3.    For i = 1 To Len(txtGec)
  4.        If IsNumeric(Mid(txtGec, i, 1)) Or (Mid(txtGec, i, 1)) Like "[a-z]" Then 'alanda sayısal yada alfabetik olmayan değer var m?
  5.            AlfaSayi = True
  6.        Else
  7.            AlfaSayi = False
  8.            Exit For
  9.        End If
  10.    Next i
  11. End Function


bundan sonra 2 yol izlenebilir
1 - ya bir form oluşturup forma ekleyeceğiniz butona aşağıdaki kodu yazarsınız
Visual Basic
  1. Dim BulRS As New ADODB.Recordset
  2. Dim sOrGu, txtBul, txtGec As String
  3. Dim IntVar As Long
  4.  
  5. sOrGu = "select * from Tablo1"
  6.  
  7.    BulRS.Open sOrGu, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
  8.    Do While Not BulRS.EOF
  9.    IntVar = 0
  10.    txtGec = BulRS.Fields(1)
  11.    txtGec = Degis(txtGec)
  12.    If Trim(txtGec) <> "" Then CurrentDb.Execute " insert into Tablo2 (Id,AlinanParca) values (" & BulRS.Fields(0) & _
  13.                                                      ", '" & txtGec & "')"
  14.    BulRS.MoveNext
  15.    Loop


2 - yada ekleme sorgusu hazırlarsınız sorguya aşağıdaki kodu yazarsınız
Visual Basic
  1. INSERT INTO Tablo2 ( ID, AlinanParca )
  2. SELECT Tablo1.Id, Degis([Tablo1]![AranacakMetin]) AS Eklenecek
  3. FROM Tablo1
  4. WHERE (((Degis([Tablo1]![AranacakMetin]))<>""));





  Alıntı
Bu mesajı beğenenler:
#4
Sayın halily
çok ama çok teşekkür ederim. 
verdiğiniz kodu örneğime söylediğiniz şekilde ilave ettim ve sonuç başarılı. 

siz ilk cevabınızda aslında yöntemin birleşik mi? ayrı ayrı mı kaydı konusunu sormuşsunuz ancak yetişemedim. 

ayırma işlemi ilk cevabınızda değindiğiniz üzere (mesela tablo1--> 1. kayıtta diyelim ki 3 tane (4 var bunlar tabloya: aynı IDli 3 farklı kayıt olarak) her bir parça tablo2'ye ayrı ayrı kayıtlar olarak  kaydedilmesini istiyorum. 

 - tablo2'nin alınanparça isimli alanı yinelenmeyen değer olarak ayarlı, dolayısıyla kodu her çalıştırdığımda daha önce kayıtlı olan alanların yeniden eklenmesini önlemiş oluyorum. ancak her çalıştırdığımda toplam çıkan sonuç (tablo2'ye eklenmek üzere) ve tablo2'ye eklenebilen veri sayısını mesaj olarak sonuçta gösterebilmek mümkün mü? eğer mümkünse onu da ilave edebilirseniz çok memnun olurum. 

sizden bir istirhamım daha olacak eğer mümkün ise;
yapacağınız düzeltmeler ile birlikte kod mantığını anlayabilmem için vba satırlarına açıklamalar ekleyebilir misiniz? ileride de bu tarz ihtiyaçlarım olduğunda kendi kendime gerekli düzeltmeleri yapabilmem için



  Alıntı
Bu mesajı beğenenler:
#5
ilk 2 fonksiyon modüle eklenecek
Modüle eklenecek
Visual Basic
  1. Function Degis(txtGec As String) 'metin değeri alıp işlem yapan fonksiyon oluşturduk
  2. 'hy Parca bul___________________
  3.    IntVar = InStr(txtGec, "(4") 'instr() fonksiyonu aradığımız ifadenin metindeki konumunu bulur. Önce "(4" yerini bulduk
  4.    Degis = ""
  5.        Do While Not IntVar = 0 'eğer "(4" yoksa fonksiyon 0 değerini dönderir döngü biter, varsa sıfırdan farklı bir değer alır
  6.            txtGec = Mid(txtGec, IntVar + 1) 'mid(metin, başlama noktası,alınacak uzunluk) burada kayıttaki "(4"üm konumuna 1 ekleyerek "4"ün yerini bulup sonuna kadar aldık
  7.          If InStr(1, txtGec, ")", 2) > 0 Then If AlfaSayi(Left(txtGec, InStr(1, txtGec, ")", 2) - 1)) = True Then Degis = Degis & ";" & Left(txtGec, InStr(1, txtGec, ")", 2) - 1)
  8.          'ilk if eğer ifade ")" ile bitiyorsa 2. if ise ifade sadece alfasayısal ise deiğşkene ekliyor
  9.          'AlfaSayi(Left(txtGec, InStr(1, txtGec, ")", 2) - 1)) = True aşağıda tanımladığımız alfasayısal fonksiyonuna değer yollayıp uygunluğunu denetliyor
  10.            IntVar = InStr(txtGec, "(4") ' bir sonraki "(4" konumunu buluyor
  11.        Loop
  12.    Degis = Mid(Degis, 2) 'en baştaki gereksiz ";" siliyor
  13. End Function


Modüle eklenecek
Visual Basic
  1. Function AlfaSayi(txtGec As String) As Boolean 'ifade eğer sadece alfa sayısalsa almayı sağlayan fonksiyonu oluşturduk
  2. 'hy alfasayısal bul___________________
  3.    For i = 1 To Len(txtGec) ' yukardaki fonksiyonun gönderdiği parçanın uzunlugunu alıyor ve _
  4.                                her bir karakterin ilk karakterden son harfe kadar alfasayısal olıup olmadığına bakıyor
  5.        If IsNumeric(Mid(txtGec, i, 1)) Or (Mid(txtGec, i, 1)) Like "[a-z]" Then 'alanda sayısal yada alfabetik olmayan değer var mı
  6.            'IsNumeric(Mid(txtGec, i, 1)) -->i. sıradaki karakter sayısal mı
  7.            'Mid(txtGec, i, 1)) Like "[a-z]" -->i. sıradaki karakter a-z arasında mı, yani harf mi
  8.            'eğer sayısal yada harf ise sonuç doğru
  9.            AlfaSayi = True
  10.        Else
  11.            AlfaSayi = False 'değilse sonuç yanlış fonksiyonan çık ve üstteki fonksiyona bu degeri alma de
  12.            Exit For
  13.        End If
  14.    Next i 'sonraki harfe geç
  15. End Function


aşağıdaki kod da butona eklenecek
Visual Basic
  1. Dim BulRS As New ADODB.Recordset
  2. Dim sOrGu, txtBul, txtGec As String
  3. Dim IntVar, ilkDgr, sonDgr As Long
  4. Dim x As Integer
  5. Dim diziGec() As String
  6. ilkDgr = DCount("*", "Tablo2")'dcount belirli özellikteki kayıt sayısı, tüm kayıtları istediğimizden kriter koymadık
  7.  
  8. sOrGu = "select * from Tablo1" 'tablonun çalıştıracağı sorguyu tanımlıyoruz
  9.  
  10.    BulRS.Open sOrGu, CurrentProject.Connection, adOpenKeyset, adLockOptimistic 'tabloyu tanımlanan sorguya göre açıyoruz
  11.    Do While Not BulRS.EOF 'son kayda kadar kayıtlar arasında ilerliyoruz
  12.    IntVar = 0
  13.    txtGec = Nz(BulRS.Fields(1), "") 'kayıttaki 2. alanı alıyoruz
  14.    txtGec = Degis(txtGec) 'degis() fonksiyonuna yollayarak sadece gerekli parçaları almayı sağlıyoruz
  15.    diziGec = Split(txtGec, ";") 'gerekli alanları parçalara ayırıyoruz _
  16.                                   split() fonksiyonu metni belli kriterlere göre bağımsız parçalara böler _
  17.                                   burada metni her ";" için bölüp diziye aktarıyor
  18.    For x = 0 To UBound(diziGec) 'dizinin ilk değerinden -0 dan- son değerine kadar -ubound()- döngü oluşturur
  19.        If Trim(diziGec(x)) <> "" Then 'eğer dizinin değeri boş değilse "CurrentDb.Execute" komutuyla tabloya ekler
  20.                CurrentDb.Execute " insert into Tablo2 (Id,AlinanParca) values (" & BulRS.Fields(0) & _
  21.                                                          ", '" & diziGec(x) & "')"
  22.        End If
  23.    Next x
  24.    BulRS.MoveNext
  25.    Loop
  26. sonDgr = DCount("*", "Tablo2")
  27. MsgBox (sonDgr - ilkDgr & " tane yeni kayıt eklendi.")





  Alıntı
Bu mesajı beğenenler: toprak2349
#6
Sayın halily merhaba,

paylaşımınız, açıklamalarınız ve emeğiniz için en samimi ve içten şükranlarımı lütfen kabul buyurunuz.
hem anlaşılır hem de tüm sorularımın cevabını detaylı şekilde verdiğiniz için çok teşekkür ederim.

saygılarımı sunarım.



  Alıntı
Bu mesajı beğenenler:


Benzer Konular...
Konu: Yazar Cevaplar: Gösterim: Son Mesaj
  [FORM] Kritere Bağlı Olarak Değerlerin Toplanması M_Kemal_Askeri 2 93 10-04-2026, 01:05
Son Mesaj: M_Kemal_Askeri
  Açılan Kutudan Kritere Göre Veriyi Başka Alana Yazdırma osman06 8 470 23-11-2025, 11:33
Son Mesaj: dsezgin
  Form üzerinden Bir Kaç Tabloya Verileri Kaydetmek myesukan 2 401 21-01-2025, 16:45
Son Mesaj: myesukan
  Bir Sütuna Girilen Verileri Başka Bir Sütun Ile Karşılaştırıp Hesaplama bilservisci 4 721 08-01-2024, 11:58
Son Mesaj: bilservisci
  Tablolarımı Tablo Böl Ile Böldüm, Programı Başka Bir Pc De çalıştırma Sorunu. programmer67 5 641 18-07-2023, 14:43
Son Mesaj: onur_can
  [RAPOR] Açılan Raporu Pdf Olarak Kaydetmek hnakis 1 432 24-05-2023, 07:53
Son Mesaj: alperalper
  [FONKSiYON] Uzun Tarih Alanındaki Gün Bilgisini Başka Bir Metin Kurusuna Ayırmak Istiyorum. programmer67 3 570 13-04-2023, 11:14
Son Mesaj: programmer67
  [FORM] Içinde Başka Form Olan Formu Gizli Açma hedefkaya 8 818 27-03-2023, 17:05
Son Mesaj: hedefkaya

Foruma Git:


Bu konuyu görüntüleyen kullanıcı(lar):