Excel 2013 ile kapalı olan txt tipi dosyaların listesini ve içeriklerini almak

Katılım
29 Aralık 2004
Mesajlar
82
Altın Üyelik Bitiş Tarihi
20-11-2019
Merhabalar

Excel 2013 ile bir directory içerisindeki txt benzeri dosyaların önce listesini hafızaya atmak (Dim) ve sonrasında bu liste üzerinden dosyaları tek tek açıp içerindeki bazı bilgileri alıp kapatmak istiyorum. Alınan bilgiler de çalışan Excel dosyasına satırlar halinde kayıt edilecek. Yani Excel dosyasındaki her satır bir txt daosyasındaki bilgileri içerecek. Bu konuda yardımcı olacak arkadaş var mı?
 
Katılım
29 Aralık 2004
Mesajlar
82
Altın Üyelik Bitiş Tarihi
20-11-2019
Haluk Bey
Verdiğiniz linkteki aşağıdaki kodu çalıştırdım fakat "Set rs" ile başlayan satırda duruyor ve "FROM yan tümcesinde söz dizimi hatası" veriyor.
Bunun anlamı nedir ?

Sub Veri_Al()
Dim cn As Object
Dim rs As Object
Dim myPath As String

myPath = "C:\Data\"
d = Dir(myPath)

Do While d <> ""

Set cn = CreateObject("ADODB.Connection")

cn.Open _
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & myPath & ";Extended Properties=""text;HDR=No;FMT=Delimited"""

Set rs = cn.Execute("SELECT * FROM " & d)

Worksheets.Add , Sheets.Count
Sheets(Sheets.Count).Name = d
Sheets(Sheets.Count).[a1].CopyFromRecordset rs

rs.Close
cn.Close
Loop

Set rs = Nothing
Set cn = Nothing
End Sub
 
Son düzenleme:

Haluk

𐱅𐰇𐰼𐰚
Katılım
7 Temmuz 2004
Mesajlar
12,287
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
Özel kişi
VBA ile pek ilginiz yok galiba....

Aşağıdaki satırda, bilgisayarınızdaki söz konusu "txt" dosyalarının olduğu "directory" yer almalı.

Rich (BB code):
myPath = "C:\Data\"
.
 
Katılım
29 Aralık 2004
Mesajlar
82
Altın Üyelik Bitiş Tarihi
20-11-2019
Çok bilgili değilim ama basit düzeyde bilgim var :)

Elbetteki "C: \Data\" içerisine bir kaç adet txt dosyası koydum, orada sorun yok. Zaten program "Set rs" ile başlayan satırda durduğunda ki, bu satır sarı ile işaretleniyor (Debug seçilince), kursörü aynı satırın sonundaki "d" üzerine getirdiğimde ilk txt dosyasının ismini de görüyorum. Fakat hatanın kök sebebini anlayamıyorum.
 

Haluk

𐱅𐰇𐰼𐰚
Katılım
7 Temmuz 2004
Mesajlar
12,287
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
Özel kişi
Sanırım kullanılan connection string sizin OS'e uygun değil.

Text dosyalarınızın yapısını bilmiyorum ama, aşağıdaki gibi başka bir yöntem deneyin ...

Kod:
Sub Test()
    MyPath = "C:\TestFolder\TextFiles\"
    MyFile = Dir(MyPath & "*.txt", vbDirectory)
    Do While MyFile <> ""
        Open MyPath & MyFile For Input As #1
            Do While Not EOF(1)
                i = i + 1
                Line Input #1, InputData
                Cells(i, 1) = InputData
            Loop
        Close #1
        MyFile = Dir
    Loop
End Sub
.
 
Katılım
29 Aralık 2004
Mesajlar
82
Altın Üyelik Bitiş Tarihi
20-11-2019
Çok teşekkürler bu kod çalıştı. Fakat çalışma şekli txt dosyasındaki tüm verileri excel'e olduğu gibi aktarmak şeklinde.

Öncelikle Excel'e dosya path + isimlerini almamız mümkün olur mu acaba ? (yani Folder' daki dosya listesini Excele almak)

Listeyi bir kere aldıktan sonra, o listedeki her dosyay girip içerisindeki, (örneğin her birinin 5. ve 6. verisini) veriyi alıp dosyaları kapatacağım. Amacım budur.
 

Haluk

𐱅𐰇𐰼𐰚
Katılım
7 Temmuz 2004
Mesajlar
12,287
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
Özel kişi
Arkadaşım; ne yapmak istediğini anlayabilmem için bu text dosyalarından 1-2 tanesini buraya yüklemen gerekir.

Dosya isimlerini alırız, sıkıntı yok ..... Ama; dosyalardaki 5. 6. veri dediğin nedir? Her dosya 5. ve 6. satırın mı alınmasını istiyorsun?

Excel'e aktarıldığında sonuç nasıl olacak?

Bunun gibi mi?

Kod:
Column A          Column B
-------------------------------------

Text1.text        5. satır içeriği
                  6. satır içeriği
Text2.text        5. satır içeriği
                  6. satır içeriği
Text3.text        5. satır içeriği
                  6. satır içeriği
Text4.text        5. satır içeriği
                  6. satır içeriği
 
Katılım
29 Aralık 2004
Mesajlar
82
Altın Üyelik Bitiş Tarihi
20-11-2019
Column A Column B
Text1 5. veri Text1 6. veri
Text2 5. veri Text2 6. veri
 

Haluk

𐱅𐰇𐰼𐰚
Katılım
7 Temmuz 2004
Mesajlar
12,287
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
Özel kişi
5. veri, 6. veri ile ne kastteiğinizi halen anlamış değilim. 5 ve 6. satırlar mı ? Yoksa 5 ve 6. kelimeler mi? Cümleler mi?

Örnek text dosyası üzerinde gösterseniz, konu anlaşılırdı.

Neyse..... ben şimdi spor'a gidiyorum.

Bu arada siz de siteye "Altın Üyelik" yaptırın bence. Böylelikle kolaylıkla örnek dosya ekleme veya çözülmüş dosyaları indirme imkanınız olur. Yukarıdaki gibi zahmetli açıklamalar yazmaktan her ikimiz de kurtuluruz.

.
 

Zeki Gürsoy

Uzman
Uzman
Katılım
31 Aralık 2005
Mesajlar
4,233
Excel Vers. ve Dili
Office 2019 (64 bit) - Türkçe
"Set rs" ile başlayan satırda duruyor ve "FROM yan tümcesinde söz dizimi hatası" veriyor.
Connection, daha önce açıldığı için (hata oluşmamış) Jet.Oledb ile ilgili sıkıntı yok anlaşılan. Problem, text dosya isimleri olmalı. Bu isimlerde muhtemelen boşluk var. Bu durumda d değişkenini köşeli parantez içine almalıyız. Set rs = cn.Execute("SELECT * FROM [" & d & "]")

Haluk Bey'in de dediği gibi örnek 1-2 text dosyasını eklerseniz hem test etme imkanımız olur, hem de konu gereksiz yere uzamadan çözüme kavuşur.
 
Katılım
29 Aralık 2004
Mesajlar
82
Altın Üyelik Bitiş Tarihi
20-11-2019
Haluk Bey, Zeki Bey

İlginiz için gerçekten teşekkür ederim. Bu site bence şu anda sanırım gerçek Excel uzmanlarının oluşturduğu Türkiyedeki en iyi site.

Zeki Bey haklısınız, txt dosya isimlerinde boşluk var, sebep bu olabilir. Haluk beyin ikinci gönderdiği kod bana daha anlaşılır geldi (bilgim çok yeterli olmadığı için) , o kodun üzerinden ilerlemek benim için daha anlaşılır olacaktır.

Altın üye olmaya çalıştım ama bir sorun çıktı (sanıyorum aynı email adresi ile daha önce başka şifre ile giriş yaptığım için olacak)

Şimdilik size örnek doyaları buluttan paylaşabiliyorum: https://drive.google.com/open?id=1iH3uX7pD_KlF4716KtLmpWMSV_xorghu

Sample.xlsx' de önce Sheet1' i ve sonra Sheet2'yi oluşturmayı hedefliyorum. Bunları ayrı procedure' ler ile yaparsanız öğrenmem için daha sağlıklı olur. Yani önce liste oluşturulması sonra da verilerin alınması olayı.
 

Haluk

𐱅𐰇𐰼𐰚
Katılım
7 Temmuz 2004
Mesajlar
12,287
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
Özel kişi
İlk aklıma gelen şöyle bir şey;

Kodların olduğu Excel dosyasını, söz konusu "text" dosyalarının olduğu klasöre yerleştirin ve aşağıdaki "Test" isimli makroyu çalıştırın.

Not: Kodlar zaten okuyunca rahat anlaşılacak türden olduğu için, dosya isimlerini ayrı bir makro ile listelemedim.

Kod:
Sub Test()
    'Haluk - 15/11/2018
    '
    MyPath = ThisWorkbook.Path & "\"
    MyFile = Dir(MyPath & "*.txt", vbDirectory)
    
    Range("A1:AA" & Rows.Count) = ""
    
    Do While MyFile <> ""
        i = i + 1
        j = 2
        Cells(i, 1) = MyFile
        
        Open MyPath & MyFile For Input As #1
            strFile = Input(LOF(1), #1)
        Close #1
        
        myArr = Split(strFile, vbCrLf)
        For lineNo = 1 To (UBound(myArr) - 2)
            strTemp = Split(myArr(lineNo), vbTab)
            Cells(i, j) = Replace(strTemp(4), ",", ".")
            j = j + 1
        Next
        MyFile = Dir
    Loop
End Sub
 
Katılım
29 Aralık 2004
Mesajlar
82
Altın Üyelik Bitiş Tarihi
20-11-2019
Haluk Bey, harikasınız ! Bu tam da istediğim şey. Excel konusunda bu kadar ileri insanlarla tanıştığıma sevindim.

İşin aslı, bu işin bu kadar kısa bir kod ile yapılabileceğini bilmiyordum. Ben en son 2003 VBA ile bir şeyler yapmıştım ama onun üzerinden çok sular akmış görünüyor. Kodları inceleyip nasıl çalıştığını çözmeye çalışacağım. Bence işler oldukça kolaylaşmış, az satırla çok iş yapılabiliyor.

Size ilaveten bir soru daha sorsam; txt dosyaları yerine xls dosyaları olsaydı aynı formatı kullanabilir miydik? (Yani kodunuzdaki txt' leri xls yaparak)
 

Haluk

𐱅𐰇𐰼𐰚
Katılım
7 Temmuz 2004
Mesajlar
12,287
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
Özel kişi
XLS dosyaları kapalıyken veri almak için en temiz yol, ADO ve SQL kullanmak olur.

.
 

Haluk

𐱅𐰇𐰼𐰚
Katılım
7 Temmuz 2004
Mesajlar
12,287
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
Özel kişi
Aşağıdaki kod Excel dosyalarınızdaki verileri alır ...

Dosyanızı "*.xlsm" olarak kaydettikten sonra, söz konusu "*.xlsx" dosyalarının olduğu klasöre yerleştirip, kodu çalıştırın.

Kod:
Sub Test2()
    'Haluk - 15/11/2018
    '
    MyPath = ThisWorkbook.Path & "\"
    myFile = Dir(MyPath & "*.xlsx", vbDirectory)
   
    Range("A1:AA" & Rows.Count) = ""
   
    Do While myFile <> ""
        i = i + 1
        Cells(i, 1) = myFile
       
        On Error Resume Next
            Set daoDBEngine = CreateObject("DAO.DBEngine")
            Set daoDBEngine = CreateObject("DAO.DBEngine.36")
            Set daoDBEngine = CreateObject("DAO.DBEngine.120")
        On Error GoTo 0
       
        Set Db = daoDBEngine.OpenDatabase(MyPath & myFile, False, False, "Excel 8.0; HDR=YES; IMEX=1;")
        Set RS = Db.OpenRecordset("Select [Speed 1 (RPM)] from [Sayfa1$]")
       
        With RS
            .MoveLast
             dbRow = .RecordCount
            .MoveFirst
        End With
       
        For k = 0 To RS.Fields.Count - 1
            For j = 1 To dbRow
                Cells(i, j + 1) = RS.Fields(k)
                RS.MoveNext
            Next
        Next
       
        RS.Close
        Db.Close
       
        myFile = Dir
    Loop
    Set RS = Nothing
    Set daoDBEngine = Nothing
End Sub
.
 
Katılım
29 Aralık 2004
Mesajlar
82
Altın Üyelik Bitiş Tarihi
20-11-2019
Aşağıdaki kod Excel dosyalarınızdaki verileri alır ...

Dosyanızı "*.xlsm" olarak kaydettikten sonra, söz konusu "*.xlsx" dosyalarının olduğu klasöre yerleştirip, kodu çalıştırın.

Kod:
Sub Test2()
    'Haluk - 15/11/2018
    '
    MyPath = ThisWorkbook.Path & "\"
    myFile = Dir(MyPath & "*.xlsx", vbDirectory)
  
    Range("A1:AA" & Rows.Count) = ""
  
    Do While myFile <> ""
        i = i + 1
        Cells(i, 1) = myFile
      
        On Error Resume Next
            Set daoDBEngine = CreateObject("DAO.DBEngine")
            Set daoDBEngine = CreateObject("DAO.DBEngine.36")
            Set daoDBEngine = CreateObject("DAO.DBEngine.120")
        On Error GoTo 0
      
        Set Db = daoDBEngine.OpenDatabase(MyPath & myFile, False, False, "Excel 8.0; HDR=YES; IMEX=1;")
        Set RS = Db.OpenRecordset("Select [Speed 1 (RPM)] from [Sayfa1$]")
      
        With RS
            .MoveLast
             dbRow = .RecordCount
            .MoveFirst
        End With
      
        For k = 0 To RS.Fields.Count - 1
            For j = 1 To dbRow
                Cells(i, j + 1) = RS.Fields(k)
                RS.MoveNext
            Next
        Next
      
        RS.Close
        Db.Close
      
        myFile = Dir
    Loop
    Set RS = Nothing
    Set daoDBEngine = Nothing
End Sub
.
Haluk Bey, ne diyeceğimi bilemiyorum. Kod mükemmel üstü çalışıyor! Uzun zamandır çözemediğim bir konuydu bu. Ve bir çok yere danıştığımda cevabını alamamıştım (yabancı siteler de dahil). Sizinle karşılaşmamız benim için büyük şans oldu.

Excel 2003' den sonra VBA çok değişmiş, yazdığınız kodu anlamakta zorlanıyorum. Bana bu kodlamayı öğrenmem için kaynak tavsiyeniz olursa çok memnun olurum. Sonuçta balık tutmayı öğrenmemiz lazım :)

İlaveten bir ayrıntıyı öğrenmek istiyorum. Yaptığınız örneklerde Sayfalardaki veri tablosu 1. kolon ve 1. satırdan başlamaktaydı. Eğer veriler, örneğin 5. kolon ve 5. satırdan itibaren başlasaydı kodda nasıl bir değişiklik yapmak gerekirdi?
 
Üst