Kapalı çalışma kitabından veri çekme ve veri aktarma...

Güngör_

Altın Üye
Katılım
14 Mayıs 2024
Mesajlar
2
Excel Vers. ve Dili
2019, Türkçe
Altın Üyelik Bitiş Tarihi
25-05-2025
Herkese merhaba,

Excel Makro-VBA kodlamada çok yeniyim, bi konuda yardımınıza ihtiyaçım var. Açık olan AnaDosya ya, kapalı çalışma kitabın dan veri çekme (bu kısmı halletim) ve AnaDosya dan kapalı çalışma kitabına veri kaydetmek istiyorum.

Makro içeren AnaDosya çalışma kitabında Getir ve Kayıt diye iki butonum var (şekil ekle ile yapılmış butonlar). Getir butonu ile AnaDosya ile aynı dizinde bulunan, Kişiler klasöründeki .xlsx çalışma kitaplarından ADO ile veri çekiyorum . Çektiğim veri tüm çalışma kitaplarında aynı aralıkta (Kişi-D4:J23) ve AnaDosyada da aynı aralığa (AnaSayfa-D4:J23) gelmekte. Hangi çalışma kitabından veri çekeçeğimide AnaDosya da "B1", hücresinden seçmekteyim.

Kişiler klasöründen, AnaDosyaya çektiğim veride değişklik/çıkarma veya ekleme yaptıktan sonra Kaydet butonuna bastıktan sonra ilgili aralığın komplesini (D4:J23), eski verileri silerek AnaSayfa-B1 hüçresinde seçtiğim kapalı .xlsx çalışma kitabına aktarsın istiyorum ama yapamadım. Bu konuda yardımlarınızı riva ederim.

İlgili Makro kodum ve örnek çalışmam;
_____________________________________________________________________
Sub RectangleDiagonalCornersRounded1_Click()
Dim dosya As String

yol = ThisWorkbook.Path & "\Kişiler\" & Worksheets("AnaSayfa").Range("B1") & ".xlsx"

dosya = VBA.FileSystem.Dir(yol)

If dosya = vbNullString Then

MsgBox Prompt:="Seçilen Kişi Dosyası Yok", _
Buttons:=vbCritical, _
Title:="KİŞİ YOK"

Range("D4:J23").ClearContents

Else

Dim baglanti As New ADODB.Connection
Dim rs As New ADODB.Recordset

baglanti.Open "provider=microsoft.ace.oledb.12.0;data source=" & _
yol & ";extended properties=""Excel 12.0;hdr=no"""

sorgu = "select * from [Kişi$D4:J23]"
rs.Open sorgu, baglanti, adOpenKeyset, adLockPessimistic

With Worksheets("AnaSayfa")
.Range("D4").CopyFromRecordset rs
End With
End If
End Sub
_____________________________________________________________________
 

Ekli dosyalar

Katılım
2 Temmuz 2014
Mesajlar
201
Excel Vers. ve Dili
2021 Türkçe, 64bit
dosyanızı harici bir siteye yüklemeniz mümkün mü?
ama kabaca şunu önerebilirim
kaynak sayfadaki verileri diziye aktarıp, yada doğrudan range ile
oluşturduğunuz recordseti onunla güncelleyebilirsiniz
Kod:
Sub VeriGuncelle()
Dim dosya As String

yol = ThisWorkbook.Path & "\Kişiler\" & Worksheets("AnaSayfa").Range("B1") & ".xlsx"


Dim baglanti As New ADODB.Connection
Dim rsK As New ADODB.Recordset

baglanti.Open "provider=microsoft.ace.oledb.12.0;data source=" & _
yol & ";extended properties=""Excel 12.0;hdr=no"""

sorgu = "select * from [Kişi$D4:J23]"
rsK.Open sorgu, baglanti, adOpenKeyset, adLockPessimistic


Set syf = ThisWorkbook.Worksheets("Kaynak")
dz = syf.Range("D4:J23").Value2
 If Not rsK.EOF And Not rsK.BOF = True Then
 rsK.MoveFirst
 
 For xStr = 1 To UBound(dz)
    rsK(0) = dz(xStr, 1)
    rsK(1) = dz(xStr, 2)
    rsK(2) = dz(xStr, 3)
    'geriye kalanlar
 rsK.MoveNext
 Next xStr
 End If

End Sub
 
Katılım
2 Temmuz 2014
Mesajlar
201
Excel Vers. ve Dili
2021 Türkçe, 64bit
aşağıdaki kodu dener misiniz?
Not: tür uyumuyla ilgili kontroller yapılmamıştır ( sayısal alana metin eklemek gibi)
Kod:
Sub VeriGuncelle()
Dim dosya As String

yol = ThisWorkbook.Path & "\Kişiler\" & Worksheets("AnaSayfa").Range("B1") & ".xlsx"

dosya = VBA.FileSystem.Dir(yol)

If dosya = vbNullString Then

MsgBox Prompt:="Seçilen Kişi Dosyası Yok", _
Buttons:=vbCritical, _
Title:="KİŞİ YOK"
Range("D4:J23").ClearContents
Exit Sub
End If

Dim baglanti As New ADODB.Connection
Dim rsK As New ADODB.Recordset

baglanti.Open "provider=microsoft.ace.oledb.12.0;data source=" & _
yol & ";extended properties=""Excel 12.0;hdr=no"""

sorgu = "select * from [Kişi$D4:J23]"
rsK.Open sorgu, baglanti, adOpenKeyset, adLockPessimistic

Set syf = ThisWorkbook.Worksheets("AnaSayfa")
dz = syf.Range("D4:J23").Value2
If Not rsK.EOF And Not rsK.BOF = True Then
rsK.MoveFirst

For xStr = 1 To UBound(dz)
        For yStn = 0 To rsK.Fields.Count - 1
           rsK(yStn) = dz(xStr, yStn + 1)
        Next yStn
rsK.MoveNext
Next xStr
End If
End Sub
 
Son düzenleme:

Tevfik_Kursun

Altın Üye
Katılım
30 Temmuz 2012
Mesajlar
3,819
Excel Vers. ve Dili
Office 2016 Pro - Türkçe 64 Bit
Altın Üyelik Bitiş Tarihi
12-02-2029
Merhaba Arkadaşlar,
Kod:
Sub VeriGuncelle()
    Dim dosya As String
    Dim baglanti As New ADODB.Connection
    Dim rsK As New ADODB.Recordset
        yol = ThisWorkbook.Path & "\Kişiler\" & Range("B1") & ".xlsx"
        dosya = VBA.FileSystem.Dir(yol)
            If dosya = vbNullString Then
                MsgBox Prompt:="Seçilen Kişi Dosyası Yok", _
                Buttons:=vbCritical, _
                    Title:="KİŞİ YOK"
                Range("D4:J23").ClearContents
                Exit Sub
            End If
        baglanti.Open "provider=microsoft.ace.oledb.12.0;data source=" & _
        yol & ";extended properties=""Excel 12.0;hdr=no"""
        sorgu = "select * from [Kişi$D4:J23]"
        rsK.Open sorgu, baglanti, adOpenKeyset, adLockPessimistic
        Set syf = ThisWorkbook.Worksheets("AnaSayfa")
        dz = syf.Range("D4:J23").Value2
            If Not rsK.EOF And Not rsK.BOF = True Then
                rsK.MoveFirst
                    For xStr = 1 To UBound(dz)
                        For yStn = 0 To rsK.Fields.Count - 1
                            rsK(yStn) = dz(xStr, yStn + 1)
                        Next yStn
                        rsK.MoveNext
                    Next xStr
            End If
End Sub
Bu hali ile hatasız çalışıyor.
İyi çalışmalar
 
Son düzenleme:

Güngör_

Altın Üye
Katılım
14 Mayıs 2024
Mesajlar
2
Excel Vers. ve Dili
2019, Türkçe
Altın Üyelik Bitiş Tarihi
25-05-2025
Tevfik_Kursun ve haliliyas ilginiz ve cevaplarınız için çok teşekkür edrim. Makro sorunsuz çalışıyor ve isteğimi tam anlamıyla karşıladı.
 

Tevfik_Kursun

Altın Üye
Katılım
30 Temmuz 2012
Mesajlar
3,819
Excel Vers. ve Dili
Office 2016 Pro - Türkçe 64 Bit
Altın Üyelik Bitiş Tarihi
12-02-2029
Rica ederim,
iyi çalışmalar
 
Katılım
5 Mart 2015
Mesajlar
11
Excel Vers. ve Dili
2010
Altın Üyelik Bitiş Tarihi
21-11-2024
hocalarım merhaba, ufak değişiklikler ile kendime uyarlamaya çalıştım. daha sonra yolu değiştireceğim fakat masaüstüne dosya1.xlsm ve dosya2.xlsm adında iki excel dosyası açtım. dosya2 kapalı iken dosya1'den veri yazdıracağım. Her iki çalışma kitabında da çalışma sayfalarının adı "Sayfa1".

Kod:
rsK.Open sorgu, baglanti, adOpenKeyset, adLockPessimistic
adımında aşağıdaki hatayı almaktayım.

"Run-time error - 2147467259 (80004005)
Bu tablo bu elektronik tabloda tanımlı hücre aralıklarının dışında olan hücreler içeriyor."

biraz araştırıp referansları da güncelledim

Microsoft DAO 3.6 Object Library
Microsoft ActiveX Data Objects 2.5 Library

bunları ekledim. Fakat;

Microsoft ADO Ext. 2.5 for DDL and Security olanı bulamadım.. onun yerine Microsoft ADO Ext. 2.8 for DDL and Security olanı seçtim.
Sorunun kaynağı ne olabilir acaba, yanlış uyarlama mı yaptım anlayamadım.


Kod:
Sub VeriGuncelle()

    Dim baglanti As New ADODB.Connection
    Dim rsK As New ADODB.Recordset
        yol = ThisWorkbook.Path & "\dosya2.xlsm"

        baglanti.Open "provider=microsoft.ace.oledb.12.0;data source=" & _
        yol & ";extended properties=""Excel 12.0;hdr=no"""
        sorgu = "select * from [Sayfa1$A2:D2]"
        rsK.Open sorgu, baglanti, adOpenKeyset, adLockPessimistic
        Set syf = ThisWorkbook.Worksheets("Sayfa1")
        dz = syf.Range("A2:D2").Value2
            If Not rsK.EOF And Not rsK.BOF = True Then
                rsK.MoveFirst
                    For xStr = 1 To UBound(dz)
                        For yStn = 0 To rsK.Fields.Count - 1
                            rsK(yStn) = dz(xStr, yStn + 1)
                        Next yStn
                        rsK.MoveNext
                    Next xStr
            End If
End Sub
 
Katılım
2 Temmuz 2014
Mesajlar
201
Excel Vers. ve Dili
2021 Türkçe, 64bit
Microsoft DAO 3.6 Object Library <--- bu satırı silin
Microsoft ADO Ext. 2.8 for DDL and Security <--- bu satırı da silin
Microsoft ActiveX Data Objects 2.5 Library <--- sadece bu referansı eklemeniz yeterli DAO olanı da eklerseniz bazen sorun çıkartabiliyor

ama yada sorun [Sayfa1$A2:D2] tanımından kaynaklanıyor olabilir burada sadece tek satır tanımlanmış yani tüm veriler tek satırlık 4 hücredeymiş gibi bir tablo [Sayfa1$A2:D] gibi son satır tanımlamadan deneyebilir misiniz?
yeni bir konu açıp harici bir siteye dosyanızı yüklerseniz kodları inceleyip yardımcı olmaya çalışırız.
 
Katılım
5 Mart 2015
Mesajlar
11
Excel Vers. ve Dili
2010
Altın Üyelik Bitiş Tarihi
21-11-2024
Microsoft DAO 3.6 Object Library <--- bu satırı silin
Microsoft ADO Ext. 2.8 for DDL and Security <--- bu satırı da silin
Microsoft ActiveX Data Objects 2.5 Library <--- sadece bu referansı eklemeniz yeterli DAO olanı da eklerseniz bazen sorun çıkartabiliyor

ama yada sorun [Sayfa1$A2:D2] tanımından kaynaklanıyor olabilir burada sadece tek satır tanımlanmış yani tüm veriler tek satırlık 4 hücredeymiş gibi bir tablo [Sayfa1$A2:D] gibi son satır tanımlamadan deneyebilir misiniz?
yeni bir konu açıp harici bir siteye dosyanızı yüklerseniz kodları inceleyip yardımcı olmaya çalışırız.

Tekrardan merhaba, referansları denedim olmadı. aynı şekilde [A2 : D] olarak ayarladım ki zaten sonradan buna çevirecektim. dosyalar aşağıdaki linkte mevcuttur. iki dosyayı da masaüstümdeyken denemelerimi yaptım.

Özetle dosya1.xlsm üzerinde yapılan değişiklikleri dosya2.xlsm içinde aynı çalışma sayfası, aynı satır / sütunlara dosyayı açmadan yansıtmak istiyorum.


şu da uyarlamaya çalıştığım video, 90 saniye

 
Son düzenleme:
Katılım
2 Temmuz 2014
Mesajlar
201
Excel Vers. ve Dili
2021 Türkçe, 64bit
yapmak istediğiniz şeyi şimdi anladım ama biraz sorunlu bir istek
mesela rsK.Open sorgu, baglanti, adOpenKeyset, adLockPessimistic satırında hata vermesi doğal, çünkü sayfada hiç veri yok mesela A1:D yaparsanız ilk satırda başlık olduğundan bu sefer hata vermez ama olmayan kayıt varmış gibi görünür.
eğer kapalı dosyada kayıt yoksa önce o kaydın eklenmesi gerekiyor.
yani önce kapalı dosyada kaç satır var o kontrol edilecek sonra kayıt sayısı az ise o kadar yeni kayıt eklenecek sonra da sizin diziden veri alarak güncellenmesi sağlanacak, eğer fazlaysa güncelleme sonrası ilgili satırların boş karakterle doldurulması gerekecek.
bunun yerine kitap kapanırken yada istediğiniz zaman bir düğmeye basarak dosya adına tarih ekleyerek yedeklenmesi sağlanabilir. bence daha pratik olur.
 
Son düzenleme:
Katılım
5 Mart 2015
Mesajlar
11
Excel Vers. ve Dili
2010
Altın Üyelik Bitiş Tarihi
21-11-2024
yapmak istediğiniz şeyi şimdi anladım ama biraz sorunlu bir istek
mesela rsK.Open sorgu, baglanti, adOpenKeyset, adLockPessimistic satırında hata vermesi doğal, çünkü sayfada hiç veri yok mesela A1:D yaparsanız ilk satırda başlık olduğundan bu sefer hata vermez ama olmayan kayıt varmış gibi görünür.
eğer kapalı dosyada kayıt yoksa önce o kaydın eklenmesi gerekiyor.
yani önce kapalı dosyada kaç satır var o kontrol edilecek sonra kayıt sayısı az ise o kadar yeni kayıt eklenecek sonra da sizin diziden veri alarak güncellenmesi sağlanacak, eğer fazlaysa güncelleme sonrası ilgili satırların boş karakterle doldurulması gerekecek.
bunun yerine kitap kapanırken yada istediğiniz zaman bir düğmeye basarak dosya adına tarih ekleyerek yedeklenmesi sağlanabilir. bence daha pratik olur.


merhaba tekrardan,

yönlendirmeniz sonrası aşağıdaki gibi uyarlayarak çözümü elde ettim. Çok teşekkür ederim. başta çektiğim verinin satır sayısını bularak entegre ettim. kayıt sayısı değişmediğinde sorunumu çözecektir. şuan ki projemde zaten kayıt sayısında azalma/artma olmayacaktı. sadece değerler değişecek. Eğer satır sayısı azalacaksa ne yapılması gerektiğini de anladım. Fakat satır sayısı artsaydı ne yapılabilir merak ediyorum doğrusu. çünkü çalışma kitabını açmadan veri yazdırmak çok güzel.


yine de ek olarak paylaşmak istedim belki bir şey görürsünüz diye.


Kod:
Sub VeriGuncelle()
Dim dosya As String
Dim sonsatir As Variant

sonsatir = Sheets("Sayfa1").Range("A100000").End(xlUp).Row

yol = ThisWorkbook.Path & "\dosya2.xlsm"


Dim baglanti As New ADODB.Connection
Dim rsK As New ADODB.Recordset

baglanti.Open "provider=microsoft.ace.oledb.12.0;data source=" & _
yol & ";extended properties=""Excel 12.0;hdr=no"""

sorgu = "select * from [Sayfa1$A2:D" & sonsatir & "]"
rsK.Open sorgu, baglanti, adOpenKeyset, adLockPessimistic

Set syf = ThisWorkbook.Worksheets("Sayfa1")
dz = syf.Range("A2:D" & sonsatir).Value2
If Not rsK.EOF And Not rsK.BOF = True Then
rsK.MoveFirst

For xStr = 1 To UBound(dz)
        For yStn = 0 To rsK.Fields.Count - 1
           rsK(yStn) = dz(xStr, yStn + 1)
        Next yStn
rsK.MoveNext
Next xStr
End If
End Sub


 
Katılım
2 Temmuz 2014
Mesajlar
201
Excel Vers. ve Dili
2021 Türkçe, 64bit
kapalı dosyadaki satır sayısı az, açık kitapta çok ise fark kadar kayıt eklemek için
Kod:
rsK.AddNew
    For x = 1 To rs1.Fields.Count - 1
        rsK(x) = dz(y)
    Next x
rsK.Update
benzeri bir kod kulanılabilir
 
Katılım
5 Mart 2015
Mesajlar
11
Excel Vers. ve Dili
2010
Altın Üyelik Bitiş Tarihi
21-11-2024
kapalı dosyadaki satır sayısı az, açık kitapta çok ise fark kadar kayıt eklemek için
Kod:
rsK.AddNew
    For x = 1 To rs1.Fields.Count - 1
        rsK(x) = dz(y)
    Next x
rsK.Update
benzeri bir kod kulanılabilir

çok teşekkür ederim hocam bunu denemek istiyorum başarabilirsem bana çok lazım olur. Emeğinize sağlık.
 
Katılım
2 Temmuz 2014
Mesajlar
201
Excel Vers. ve Dili
2021 Türkçe, 64bit
Rica ederim
İyi çalışmalar.
 
Üst