Kapalı Bir Excel Dosyasından Veri Çekme

By | 16 Temmuz 2015

Excel’de başka bir sayfadan veri çekmek için aşağıdaki kod kullanılır.

Bu kodu parçalara ayırırsak, [verioku.xlsx] kısmı içerisinden veri alınacak dosyayı gösterir. Sayfa1 ifadesi verioku.xlsx dosyası üzerinde veri alınacak sayfayı ve son olarak da B2 ifadesi Sayfa1 üzerindeki B2 hücresini gösterir. Bunu VBA içerisinde değişken bir hale getirip, parametrik bir altyordam (sub) olarak tanımlarsak bir çok çalışmamızda pratik olarak kullanabiliriz.

Bunun için Excel’in hazır bir metodu olan ExecuteExcel4Macro metodunu kullanacağız. Bu yordamda kaynak sayfadaki verinin adresi, örnek olarak, R1C3 şeklinde tanımlanır. (R=row, C=column) olmak üzere R1 ifadesi 1 nolu satırı, C3 ifadesi de 3 nolu kolonu gösterir. Kaynak dosyanın başka bir klasörde olduğu düşünülerek klasör tanımlamasını da kod içerisine ekleyeceğim.

Öncelikle altyordamı tanımlayıp parametrelerini belirleyelim.

Veri çekeceğimiz dosya bizim çalışma yapmak istediğimiz klasörün dışında bir klasör olabilir. Hatta bu klasörde birden fazla dosya olabilir. Açtığımız dosyada birden fazla sayfa olabilir. Biz bunların hepsini değişken olarak tanımlayarak istediğimiz zaman istediğimize erişebileceğiz.

Öncelikle verioku.xlsx dosyası oluşturalım ve D1 hücresi dahil olmak üzere bir miktar veri girelim. Bunu kaydettikten sonra kapatalım ve yeni bir excel sayfası açalım. Bir CommandButton yerleştirelim. VBA penceresini açalım ve Sayfa1 içerisine aşağıdaki kodu ekleyelim.

CommandButton click yordamına aşağıdaki satırı ekleyelim.

Şimdi kodumuzu yorumlama sırası. Altyordam için 3 tane parametre tanımladık. Bunlar klasör adı, dosya adı ve sayfa adı değişkenleri ve her biri string tipinde. Butona bastığımızda altyordamı çağırırken bu parametreleri de gönderiyoruz. Böylece kaynak dosyaya hangi klasörde olursa olsun, kaç tane excel sayfası olursa olsun rahatlıkla ulaşabiliyoruz.

verioku.xlsx dosyasında R1C4 hücresinde bulunan veriyi bulunduğumuz dosyada Sayfa1 üzerinde 1,1 hücresine yazdırıyoruz. Burada ‘C:\gokhanca\excelornek\[verioku.xlsx]Sayfa1’!R ifadesi Kayit adlı string değişkende sabit olarak tanımlanmıştır. Bunun arkasına eklenecek olan 1C4 ifadesi farklı hücre koordinatları oluşturabilmek için ayrı tanımlanmıştır. Kayit & 1 & “C4″ şeklinde yazılan kısımda 1 ve 4 ifadelerini bir değişkenle kontrol ederek farklı değerlere erişebilirsiniz.

Bu işlemler sırasında veri çektiğiniz kaynak dosya hiçbir şekilde açılmayacaktır. Böylece dosya kapatma – açma derdiyle de uğraşmayacaksınız.

Yukarıda temel olarak anlattığım bu uygulamayı istediğiniz şekilde esnetebilir, parametrik yapıyı kendi kullanımınıza uygun olarak değiştirebilirsiniz. Eğer aynı klasörde ve tek bir dosya ile işiniz varsa klasör ve dosya tanımlamalarına gerek yok. Bunu alt program içerisine sabit olarak gömebilirsiniz.

08-11-2016 Eklemesi:

Örnek bir Excel dosyası hazırladım. Adım adım nasıl çalıştığı anlaşılabilsin diye bazı yerlerde tanımlamaları uzun bıraktım. İndirip inceleyebilirsiniz.

14 thoughts on “Kapalı Bir Excel Dosyasından Veri Çekme

  1. Hasan

    Bu işlemi [A1:D50] gibi aralıklarda yapabilir miyiz?
    Bir de merak ettiğim şey, bir Excel sayfasını hiç amadan içinde arama yapabilir miyiz?

    Reply
    1. ugokhan Post author

      Burada ilk sorduğunuz sorunun cevabını buldum. Bir dosyayı açmadan belirli bir alanı komple çekebiliyorsunuz. Tek tek uğraşmanız gerekmiyor. İkinci olarak, kapalı dosya içerisinde arama yapılabilir. İlgili kodları ezbere bilmiyorum. Kısa zaman içerisinde test edip paylaşmaya çalışırım.

      Reply
  2. Ahmet YILMAZ

    Hocam Merhabalar,

    hücrelerden oluşturduğumuz bir klasör yolunu bu makroya eklememiz mümkün müdür?

    (Uzun yoldan şöyle anlatayım. Elimde yaklaşık 110-120 klasör ve bu klasörlere ait ortalama 10-15 excel dosyasından İki ayrı sekmeden veri çekmem gerekiyor.

    Buna göre isimleri sıralı klasörden ve dosya isimlerini excelde listeliyorum bu listeye göre kapalı .xlsx dosyalarından veri almalıyım.)

    Örneğin

    c:// aa-bb-1001-00 / aa-bb-1001-00-001.xlsx —- KAPAK VE KESİNTİLER (SEKMELERİ)
    c:// aa-bb-1001-00 / aa-bb-1001-00-002.xlsx —- KAPAK VE KESİNTİLER (SEKMELERİ)
    c:// aa-bb-1002-00 / aa-bb-1002-00-001.xlsx —- KAPAK VE KESİNTİLER (SEKMELERİ)
    c:// aa-bb-1003-00 / aa-bb-1003-00-001.xlsx —- KAPAK VE KESİNTİLER (SEKMELERİ)

    şeklindedir.

    Yardımlarınız için teşekkür eder,
    İyi çalışmalar dilerim.

    Reply
    1. ugokhan Post author

      Ahmet Bey merhaba, bahsettiğiniz işlemi bu yöntemle uygulayabilirsiniz. Yukarıda örnek bir dosya var. Örnekte klasör, dosya, sayfa ve hücre koordinatları değişken olarak verilmiştir. Örnek içindeki VeriAl fonksiyonuna klasör, dosya, sayfa ve satır-sütun bilgilerini gönderdiğinizde size istediğiniz veriyi döndürecektir. Bir döngü yardımı ile klasör ve dosya listenizi tarayıp bu fonksiyona gönderebilirsiniz.

      örneğinize gelirsek, oluşturduğunuz listeyi klasör, dosya, sayfa, satır ve sütun olarak ayrı kolonlara yazın. Aynı dosya içinde farklı bir sayfaya gidecekseniz onu da ayrı satır olarak ekleyin. Sonra elde ettiğiniz tüm listeyi baştan tarayarak, hücrelerdeki verileri fonksiyona gönderin. Konu anlatımındaki örneği incelerseniz daha iyi anlarsınız. Özel olarak kod yazımı yapmıyorum.

      Reply
  3. yasin ercan

    selamlar hocam ben şunu yapmak istiyorum. kapalı olan \deneme klasöründeki excel dosyalarının hepsinin tek tek “A4″ hücresinde yazanı, çalişma sayfamda a1:a200 satırında aratiip bulduğu satırın 9 sağına \deneme kalsöründeki excellerdeki B4, c15,c16,c24 hücrelerini kopyalayip yapıştırsın istiyorum. bunu nasıl yapabilirz.
    teşekkürler.

    Reply
    1. ugokhan Post author

      Hazır kod talebinize yanıt veremem. Yukarıda anlatılanlar bunu yapabilmeniz için yeterince açıklayıcı. Excel ile ilgili çok başarılı forumlar var. Oradan yardım alabilirsiniz.

      Reply
  4. Çağatay

    Gökhan Bey, kapalı excel dosyasından aynı anda farklı iki veriyi ( mesela A1 ve B1 hücrelerinden ) ExecuteMakro4 uygulaması ile alabilir miyiz? Ayrıca kapalı excel dosyasında veri gönderme konusunda ADO/DAO dışında bir uygulama var mıdır varsa açıklayabilir misiniz ? Teşekkürler.

    Reply
  5. Volkan

    Merhaba,
    Yukarıda verdiğiniz örneği uygulamaya çalıştım, ancak çalışmadı.
    VBA konusunda amatörüm. Aslında amatör de değilim diyeyim ki, anlatırken hiçbirşey anlamıyormuşum gibi anlatabilirsiniz. Eğer vakitiniz varsa buna ihtiyacım var.
    Genelde inernet üzerinde bulduğum yorumlarda “zaten temel konuları bildiğim” varsayılıyor haklı olarak.
    Yukarıda verdiğiniz kodu kendi PCnizde çalıştırdığınız şekilde yazabili misiniz, ben de değiştirmem gereken yerleri değiştireyim.
    Örneğin KlasorAdi DosyaAdi SayfaAdi benim değiştirmem gereken şeyler sanırım, başka değiştirmem gerekenler vs. var ise belirtebilir misiniz?

    Yardımcı olursanız çok memnun olurum, teşekkür ederim.

    Reply
    1. ugokhan Post author

      merhaba, örnek bir excel dosyası hazırlayıp yazıya ekledim. Umarım yardımcı olur.

      Reply
      1. Volkan

        Çok çok teşekkür ederim,
        Bu örnek üzerinden ilerleyeceğim, verdiğiniz bilgi için teşekkür ederim.

  6. Koray Akdoğu

    Merhaba öncelikle paylaşımınız için çok teşekkür ederim.
    Merak ettiğim bir konu var. Paylaşmış olduğunuz kodları uyguladım ve çalıştı.
    Ancak benim tam olarak yapmak istediğim “verioku.xlsx” değişken olması.
    Örnek olarak bulunduğum sayfadaki Z4 hücresine verioku2.xlx yazdım otomatik olarak C:\gokhanca\excelornek\verioku2.xlx dosyasını aramasını istiyorum.
    Demek istediğim çekeceğim dosya ismi sabit değil değişken.
    Bulunduğum sayfada Z4 hücresinde ne yazıyorsa ona göre dosya ismini arasın.
    Mantığını daha iyi anlatabilmek adına aşağıda hatalı örnek kodunu paylaştım.

    Private Sub CommandButton1_Click()
    Call VeriAl(“C:\gokhanca\excelornek”, “(“Z4)”, “Sayfa1″)
    End Sub

    Reply
    1. ugokhan

      Cevabın gecikmesi için kusura bakmayın.

      Dim Dosya As String
      Dosya = Sayfa1.Cells(3, “K”)

      Dim Sayfa As String
      Sayfa = Sayfa1.Cells(3, “L”)

      Call VeriAl(“D:\klasor\”, Dosya, Sayfa)

      Dosya ve Sayfa kısımlarını yukarıdaki gibi dinamik yapabilirsiniz. Dosya adını ve dosyanın içindeki sayfa adını bir değişken olarak tanımlayın. Sayfanızda 3,K hücresine dosya adını, 3,L hücresine de sayfa adını yazın. Büyük küçük harfe dikkat edin.

      Çalıştırdım, test ettim. Problem yok.

      Reply
  7. isimsiz

    hocam paylaşım için teşekkür ederiz. bu kodu uyguladığımızda “Sub or funticon net denied” hatası alıyorum nedendir acaba?
    vb hakkında hiç bilgim yok yardımcı olabilirseniz çok sevinirim

    Reply
    1. ugokhan Post author

      Hata veren excel dosyasının kaynak kodlarını görmeden bir şey diyemem. Hatanın nerede oluştuğunu anlamak için VBA penceresinde F8 ile programı adım adım çalıştırabilirsiniz.

      Reply

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir