• DİKKAT

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

Dosyalar arasında veri çekiyorum. makroda hata aldım

Katılım
24 Kasım 2007
Mesajlar
769
Excel Vers. ve Dili
Office 365 - Türkçe
Merhaba

İki adet dosyam var
mg ve mg3

mg dosyasından kutucuğa tıklıyorum. mg3'ün yerini gösteriyorum. mg3'ün sayfa2'de ki değerleri mg dosyasında sayfa1'e yapıştırmak istiyorum. Ama hata aldım

Kodlarım
Sub ekle()
dosya = Application.GetOpenFilename
If dosya = False Then Exit Sub
Sheets("Sayfa1").Range("A2:C" & Rows.Count).ClearContents
Set conn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.RECORDSET")
conn.Open "Provider=microsoft.ace.oledb.12.0;data source=" & dosya & ";extended properties=""excel 12.0;hdr=yes;imex=1"";"
rs.Open "select * from [Sayfa2$] where SAYI=" & Range("a1:a3").Value & ";", conn, 1, 1
Sheets("Sayfa1").Range("A1").CopyFromRecordset rs
rs.Close
conn.Close
Set rs = Nothing
Set conn = Nothing
Sheets("Sayfa1").Select
MsgBox "İşlem Tamamlanmıştır." & vbLf & _
"1111", vbOKOnly + vbInformation, Application.UserName
End Sub

Şimdiden teşekkürler
 

Ekli dosyalar

Yardım edebilecek bi arkadaş yokmu...!!
 
where yerine sayfa2'de ki tüm verileri nasıl kopyalarım
rs.Open "select * from [Sayfa2$] sonrası ne olmalı ??
 
Merhaba Mesut Bey,

Sheets("Sayfa1").Range("A1").CopyFromRecordset rs satırından sonra şu satırları ekleyip deneyiniz;
Kod:
Set rs = conn.Execute("select * from [Sayfa2$]")
Sheets("Sayfa1").Range("P1").CopyFromRecordset rs
Hem A1 hücresinden itibaren koşula göre verileri alır, hem de P1 hücresine herhangi bir koşul gerektirmeden sayfadaki tüm alanlarda bulunan verileri alır.

İki ayrı makro istediğiniz için, burada değiştirmeniz gereken sadece sorgunuz olacaktır.

İlk makroda sorgunuz bu şekilde iken;
Kod:
rs.Open "select * from [Sayfa2$] where SAYI=" & Range("n3").Value & ";", conn, 1, 1
İkinci makroda sorguyu bu şekilde değiştirebilirsiniz;
Kod:
rs.Open "select * from [Sayfa2$]", conn, 1, 1
 
eklediğiniz dosyalar boş. içinde hiç bir veri yok. bu nedenle test etmek imkansız. dosya eklenmesi de bu nedenle gereksiz olmuş.

Kod:
where SAYI=" & Range("a1:a3").Value

sadece sql sorgusunun ilgili kısmı için:

kriter RAKAM ise
Kod:
where SAYI=" & Range("A1").Value & " OR SAYI=" & Range("A2").Value & " OR SAYI=" & Range("A3").Value

kriter METİN ise (kriterin başına ve sonuna tek tırnak ' eklenir.)
Kod:
where SAYI='" & Range("A1").Value & "' OR SAYI='" & Range("A2").Value & "' OR SAYI='" & Range("A3").Value & "'"

veya ' yerine Chr(39)
Kod:
where SAYI=" & Chr(39) & Range("A1").Value & Chr(39) & " OR SAYI=" & Chr(39) & Range("A2").Value & Chr(39) & " OR SAYI=" & Chr(39) & Range("A3").Value & Chr(39)

bir deneyin.
 
Çok teşekkür ediyorum arkadaşlar. Gerçekten süpersiniz. Beni büyük bir dertten kurtardınız. Kodlarda sizin dediğiniz gibi değişiklikler yaptım. Oldu da, tek olumsuz yönü dosyadaki verileri yüklüyorum. Yüklüyor, sonra kum saati tekrar çalışıyor, yine yüklüyor, sonra yine yüklüyor.. ESC tuşuna basıyorum durdurmak zorunda kalıyorum

Varmı bi düşünceniz ;
İlgili dosyalarını aynen ekliyorum
 

Ekli dosyalar

kritere göre veri çekmekten vaz geçtiniz galiba...

Kod:
Sub aktar()

    dosya = Application.GetOpenFilename
    If dosya = False Then Exit Sub
    
    Set conn = CreateObject("ADODB.Connection")
    Set rs = CreateObject("ADODB.RECORDSET")
    
    conn.Open ("Provider=Microsoft.ACE.OLEDB.12.0;" _
            & "Data Source=" & dosya & ";" _
            & "Extended Properties=""Excel 12.0;HDR=Yes;IMEX=1""")
    strSQL = "SELECT * FROM [Smp99_Donnees$]"
    rs.Open strSQL, conn, adOpenStatic, adLockReadOnly
    
    With Sheets("Smp99_Donnees")
        'eski verinin silinmesi:
        .Range("A1:AZ" & Rows.Count).ClearContents
        'sütun başlıklarının 1. satıra yazdırılması:
        For i = 1 To rs.Fields.Count
            .Cells(1, i + 1).Value = rs.Fields(i - 1).Name
                'B sütunundan başlayarak yazılacağı için i+1
        Next i
        'SQL ile sutun başlığı (field name) hariç çekilen verinin yazdırılması:
        .Range("B2").CopyFromRecordset rs
        .Activate
    End With
    
    rs.Close
    conn.Close
    
    MsgBox "veriler yüklenmiştir" & vbLf & "anormallik durumunda : 6551", _
        vbOKOnly + vbInformation, Application.UserName

End Sub
 
office 1997 ile birlikte Workbook_Open olay kodu kullanılmaktadır.

uyumluluk amaçlı yürürlükte kalmaya devam eden module1'deki Auto_Open makrosunu silerek ThisWorkbook (BuÇalışmakitabı) kod modülüne aşağıdaki şekilde kopyalamanızı öneririm.


Kod:
Sub Workbook_Open()
    Sheets("Kullanım Klavuzu").Select
    Range("A1").Select
    MsgBox "Kod Dönüştürücü V1" & vbLf & _
    "Güncellenme : 15.04.2013", vbOKOnly + vbInformation, Application.UserName
End Sub

aynı şekilde kitabı kapatırken devreye giren Auto_Close da
Kod:
Private Sub Workbook_BeforeClose(Cancel As Boolean)

End Sub
olmuştur.
 
kritere göre veri çekmekten vaz geçtiniz galiba...

Kod:
Sub aktar()

    dosya = Application.GetOpenFilename
    If dosya = False Then Exit Sub
    
    Set conn = CreateObject("ADODB.Connection")
    Set rs = CreateObject("ADODB.RECORDSET")
    
    conn.Open ("Provider=Microsoft.ACE.OLEDB.12.0;" _
            & "Data Source=" & dosya & ";" _
            & "Extended Properties=""Excel 12.0;HDR=Yes;IMEX=1""")
    strSQL = "SELECT * FROM [Smp99_Donnees$]"
    rs.Open strSQL, conn, adOpenStatic, adLockReadOnly
    
    With Sheets("Smp99_Donnees")
        'eski verinin silinmesi:
        .Range("A1:AZ" & Rows.Count).ClearContents
        'sütun başlıklarının 1. satıra yazdırılması:
        For i = 1 To rs.Fields.Count
            .Cells(1, i + 1).Value = rs.Fields(i - 1).Name
                'B sütunundan başlayarak yazılacağı için i+1
        Next i
        'SQL ile sutun başlığı (field name) hariç çekilen verinin yazdırılması:
        .Range("B2").CopyFromRecordset rs
        .Activate
    End With
    
    rs.Close
    conn.Close
    
    MsgBox "veriler yüklenmiştir" & vbLf & "anormallik durumunda : 6551", _
        vbOKOnly + vbInformation, Application.UserName

End Sub

Yukarıdaki kopyaladım ama olmadı malesef
makro hata verdi
 

Ekli dosyalar

  • hata.jpg
    hata.jpg
    98.1 KB · Görüntüleme: 8
  • hata2.jpg
    hata2.jpg
    102.4 KB · Görüntüleme: 5
biraz önce çalıştırdım. üstelik kriter de ekleyerek.
sorunsuz çalıştı. zaten sürekli kullandığım bir kod idi.
benim kullandığım şeklini ekleyeyim.

GetOpenFilename yerine doğrudan veri çekeceğim dosyanın ismini değişkende kullanmak dışında hemen hemen aynı. arzu ederseniz yine GetOpenFilename kullanmaya devam edersiniz, ilgili satırları silerek

Kod:
Sub Kapali_XL_Dosyasindan_Veri_Al()

    Dim Klasor As String, Dosya As String, tablo As String
    Dim strDB As String, strSQL As String, strKrit As String
    
    Set cn = CreateObject("ADODB.Connection")
    Set rs = CreateObject("ADODB.RECORDSET")
    
    Klasor = "C:\Dosyalar\vs\" 'dosyanın bulunduğu klasör ismi; sonuna \ eklenerek
    Dosya = "veri_çekilecek_dosya_ismi.xlsm"
    strDB = Klasor & Dosya
    tablo = "Smp99_Donnees"
    strKrit = "AHMET"
    
    'sayfadaki tüm kayıtlar:
    strSQL = "SELECT * FROM [" & tablo & "$]"
    'sayfada kritere uyan tüm kayıtlar:
    'strSQL = strSQL & " WHERE [AD] = " & Chr$(39) & strKrit & Chr$(39)
    
    cn.Open ("Provider=Microsoft.ACE.OLEDB.12.0;" _
            & "Data Source=" & strDB & ";" _
            & "Extended Properties=""Excel 12.0;HDR=Yes;IMEX=1""")
    rs.Open strSQL, cn, adOpenStatic, adLockReadOnly
    
    With Sheets("Smp99_Donnees")
        For i = 1 To rs.Fields.Count
            .Cells(1, i + 1).Value = rs.Fields(i - 1).Name
               'B sütunundan başlayarak yazılacağı için i+1
        Next i
        .Range("B2").CopyFromRecordset rs
    End With
    
    rs.Close
    cn.Close

End Sub
 
rs.Open strSQL, conn, adOpenStatic, adLockReadOnly

hocam yukarıdakinide denedim yine aynı yerde üstteki satırda hata veriyor
dosyanın sayflarının isimlerine bakıyorum, aynı değişen yok, anlayamadım

Hocam rica etsem sizde çalışanı ek'e dosya olarak ekleyebilirmsiiniz
 
Kod:
rs.Open strSQL, conn, 1, 1

şeklinde dener misiniz?
 
Sub aktar()
dosya = Application.GetOpenFilename
If dosya = False Then Exit Sub
Sheets("Smp99_Donnees").Range("A1:AZ" & Rows.Count).ClearContents
Set conn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.RECORDSET")
conn.Open "Provider=microsoft.ace.oledb.12.0;data source=" & dosya & ";extended properties=""excel 12.0;hdr=yes;imex=1"";"
rs.Open "select * from [Smp99_Donnees$]", conn, 1, 1
Sheets("Smp99_Donnees").Range("B2").CopyFromRecordset rs
Set rs = conn.Execute("select * from [Smp99_Donnees$]")
Sheets("Smp99_Donnees").Range("B2").CopyFromRecordset rs
rs.Close
conn.Close
Set rs = Nothing
Set conn = Nothing
Sheets("Smp99_Donnees").Select
MsgBox "veriler yüklenmiştir" & vbLf & _
"anormallik durumunda : 6551", vbOKOnly + vbInformation, Application.UserName

End Sub

-------------------------
Hocam bu kod çalışıyor. Aslında sizinki ile de aynı ama çözmüş değilim. Sadece sürekli güncelleme yapıyor hep. Seçenek ayarlarından manuel yaparsam hemen atıyor. Bence problem burada. Yani ben verileri çekerken dosya otomatik güncellemede olamyacak veya veriler çekildikten mesela 5 sn sonra güncellemeyi otomatik yapacak
 
kesinlikle aynı değil.

ilk eklediğiniz kodu kullanmaya devam ediyorsunuz...
 
kesinlikle aynı değil.

ilk eklediğiniz kodu kullanmaya devam ediyorsunuz...

Hocam vermiş olduğunuz kodları denedim. olmadı. çalışan kod aşağıdaki kod olduğu için bunun üzerinden gittim. Sizin yayınladığınız kodun şu kısmında

rs.Open strSQL, conn, adOpenStatic, adLockReadOnly problem oluyor.

Benim kullandığım kodda ise; sürekli güncelleme yapıyor. ve değerleri değil, tümünü yapıştırıyor. rakamlar, sayılar felan metin olarak görülüyor. "Value" kodun hangi kısmına eklemem gerekiyor.

Sub aktar()
dosya = Application.GetOpenFilename
If dosya = False Then Exit Sub
Sheets("Smp99_Donnees").Range("A1:AZ" & Rows.Count).ClearContents
Set conn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.RECORDSET")
conn.Open "Provider=microsoft.ace.oledb.12.0;data source=" & dosya & ";extended properties=""excel 12.0;hdr=yes;imex=1"";"
rs.Open "select * from [Smp99_Donnees$]", conn, 1, 1
Sheets("Smp99_Donnees").Range("B2").CopyFromRecordset rs
Set rs = conn.Execute("select * from [Smp99_Donnees$]")
Sheets("Smp99_Donnees").Range("B2").CopyFromRecordset rs
rs.Close
conn.Close
Set rs = Nothing
Set conn = Nothing
Sheets("Smp99_Donnees").Select
MsgBox "veriler yüklenmiştir" & vbLf & _
"anormallik durumunda : 6551", vbOKOnly + vbInformation, Application.UserName
End Sub
 
kesinlikle aynı değil.

ilk eklediğiniz kodu kullanmaya devam ediyorsunuz...
------------------------------------------
Sub aktar()

dosya = Application.GetOpenFilename
If dosya = False Then Exit Sub

Set conn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.RECORDSET")

conn.Open ("Provider=Microsoft.ACE.OLEDB.12.0;" _
& "Data Source=" & dosya & ";" _
& "Extended Properties=""Excel 12.0;HDR=Yes;IMEX=1""")
strSQL = "SELECT * FROM [Smp99_Donnees$]"
rs.Open strSQL, conn, 1, 1

With Sheets("Smp99_Donnees")
'eski verinin silinmesi:
.Range("A1:AZ" & Rows.Count).ClearContents
'sütun başlıklarının 1. satıra yazdırılması:
For i = 1 To rs.Fields.Count
.Cells(1, i + 1).Value = rs.Fields(i - 1).Name
'B sütunundan başlayarak yazılacağı için i+1
Next i
'SQL ile sutun başlığı (field name) hariç çekilen verinin yazdırılması:
.Range("B2").CopyFromRecordset rs
.Activate
End With

rs.Close
conn.Close

MsgBox "veriler yüklenmiştir" & vbLf & "anormallik durumunda : 6551", _
vbOKOnly + vbInformation, Application.UserName

End Sub
------------------------------------------
Hocam verdiğiniz kodları çalıştırmayı başardım;
rs.Open strSQL, conn, adOpenStatic, adLockReadOnly yazan kısmı rs.Open strSQL, conn, 1, 1 olarak değiştirdim. siz yukarıdaki mesajlarınızda belirtmişsiniz. Ama ya ben farkına varmadım, yada o an için olmadı

Tek sorun değer olarak yapıştırmıyor. Rakamlar metin formatında gözüküyor. Birde yapıştırılan sayfanın en üst satırı F1,F2,F3,F4,F5,F6 tarzı şeyler çıktı. Fotoğrafını ekliyorum
 

Ekli dosyalar

  • hata.jpg
    hata.jpg
    105.3 KB · Görüntüleme: 3
13 no.lu mesajımda yazmıştım.
sonradan görmüşssünüz.


kendi bilgi birikimimle yazıyorum aşağıdakileri...

DAO-ADO kullanılacaksa...

excel dosyası = veri tabanı (database)
excel sayfası (worksheet) = tablo (table)
excel sütunu (column) = saha (field)
excel satırı (row) = kayıt (record)
excel 1. satır = saha adları (field names)
excel 2. satır ve sonrası = kayıtların tamamı (recordset)

eğer 1. satır bos ise ado-dao bunu boş bırakılmış "f"ieldname olarak kabul eder ve kendisi 1. sütundan başlayarak otomatik sütun başlığı ekler. F1, F2, vs ekler.

dolayısı ile bu yöntemle veri alınacaksa excel sayfasında sadece çekilecek veriler olmalı, 1. satırdan başlamalı. çünkü excel sayfasındaki her satır ve sütun veri tablo içeriği kayıt olarak değerlendirilir.

bunun üstesinden gelmeyi sağlayacak yöntemler var ise ado-dao içinde ben bilmiyorum; yardımcı olamam.

eğer yok ise, excel sayfası da olduğu gibi kalacaksa, excel dosyasının açrak alan kopylamak lazım. forumda bununla ilgili belki binlerce örnek var. mutlaka bir tanesi iş görür. forumda arama yapmanızı önereceğim.

iyi günler...
 
Yardımlarınızın için teşekkür ederim

İyi çalışmalar
 
Geri
Üst