Xml Dosyasından veri Çekme

ERRİC

Altın Üye
Katılım
19 Ekim 2010
Mesajlar
296
Excel Vers. ve Dili
OFFİCE 2009
Altın Üyelik Bitiş Tarihi
05-09-2025
merhaba ekteki pdf den xmle farklı kayıt durumu veriyi excel şeklinde tablo nasıl alabilirim acaba;veriyi tek sutun halinde almam lazım yaklaşık olarak ekte yapılması istenen excel tablosu mevcut böyle bir şey mümkün mü
 

Ekli dosyalar

Haluk

Özel Üye
Katılım
7 Temmuz 2004
Mesajlar
12,406
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
Başlık XML dosyasından bahsediyor ama eklerde yok...

.
 

ERRİC

Altın Üye
Katılım
19 Ekim 2010
Mesajlar
296
Excel Vers. ve Dili
OFFİCE 2009
Altın Üyelik Bitiş Tarihi
05-09-2025
hocam hata vermişti fark etmemişim ekte link olarak paylaştım saygılar
 

Haluk

Özel Üye
Katılım
7 Temmuz 2004
Mesajlar
12,406
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
XML dosyasındaki verilerle Excel dosyasındakiler aynı değil sanırım, o yüzden pek anlamadım.....

Her neyse, ben XML dosyasından bazı verileri Excel'e aktardım. Açıklayıcı olması açısından kod biraz uzun oldu, ama kendinize daha rahat adapte edersiniz.

Açıklayıcı olması açısından, A sütununa B sütunundaki verinin XML dosyasındaki "Node-Düğüm" adını da yazdırdım.
Benden bu kadar, gerisini halledersiniz umarım....


Kod:
Sub Test()
    'Haluk - 05/09/2023
    '
    Dim xDoc As Object
    Dim strFile As String
    Dim i As Integer, j As Integer
    
    Set xDoc = CreateObject("MSXML2.DOMDocument")
    xDoc.async = False
    xDoc.validateOnParse = False
        
    strFile = ThisWorkbook.Path & "\035267_4600963792_KDV1_36.xml"
    
    i = 1
        
    xDoc.Load strFile
    
    Set objNodeList = xDoc.getElementsByTagName("indirilecekKDVOD")
    
    For j = 0 To objNodeList.Length - 1
        i = i + 1
        Range("A" & i) = objNodeList(j).ChildNodes(0).BaseName
        Range("B" & i) = objNodeList(j).ChildNodes(0).Text
        i = i + 1
        Range("A" & i) = objNodeList(j).ChildNodes(1).BaseName
        Range("B" & i) = objNodeList(j).ChildNodes(1).Text
        i = i + 1
        Range("A" & i) = objNodeList(j).ChildNodes(2).BaseName
        Range("B" & i) = objNodeList(j).ChildNodes(2).Text
    Next
      
    Set myNode = xDoc.SelectSingleNode("//indirilecekKDVODToplamKDV")
    i = i + 1
    Range("A" & i) = myNode.BaseName
    Range("B" & i) = myNode.Text
    
    Set myNode = xDoc.SelectSingleNode("//tamIstisna/teslimVeHizmetTutari")
    i = i + 1
    Range("A" & i) = myNode.BaseName
    Range("B" & i) = myNode.Text
     
    Set myNode = xDoc.SelectSingleNode("//tamIstisna/kdvOdemeksizinMalBedeli")
    i = i + 1
    Range("A" & i) = myNode.BaseName
    Range("B" & i) = myNode.Text
     
    Set myNode = xDoc.SelectSingleNode("//tamIstisna/yuklenilenKDV")
    i = i + 1
    Range("A" & i) = myNode.BaseName
    Range("B" & i) = myNode.Text
     
    Set myNode = xDoc.SelectSingleNode("//toplamTamTeslimVeHizmetTutari")
    i = i + 1
    Range("A" & i) = myNode.BaseName
    Range("B" & i) = myNode.Text
    
    Set myNode = xDoc.SelectSingleNode("//toplamTamMalBedeliTutari")
    i = i + 1
    Range("A" & i) = myNode.BaseName
    Range("B" & i) = myNode.Text
        
    Set myNode = xDoc.SelectSingleNode("//toplamTamYuklenilenKDV")
    i = i + 1
    Range("A" & i) = myNode.BaseName
    Range("B" & i) = myNode.Text
    
    Set myNode = xDoc.SelectSingleNode("//toplamTamYuklenilenKDV")
    i = i + 1
    Range("A" & i) = myNode.BaseName
    Range("B" & i) = myNode.Text
    
    Set myNode = xDoc.SelectSingleNode("//istisnaKapsamiTeslimVeHizmet")
    i = i + 1
    Range("A" & i) = myNode.BaseName
    Range("B" & i) = myNode.Text
      
    Set myNode = xDoc.SelectSingleNode("//sonrakiDonemeDevredenKDV")
    i = i + 1
    Range("A" & i) = myNode.BaseName
    Range("B" & i) = myNode.Text
    
    Set xDoc = Nothing
End Sub

.
 
Son düzenleme:

ERRİC

Altın Üye
Katılım
19 Ekim 2010
Mesajlar
296
Excel Vers. ve Dili
OFFİCE 2009
Altın Üyelik Bitiş Tarihi
05-09-2025
Elinize sağlık o kadar bilgim yok ama deneyeceğim sabah hocam, kurcalarim kalanını 👋
 

ERRİC

Altın Üye
Katılım
19 Ekim 2010
Mesajlar
296
Excel Vers. ve Dili
OFFİCE 2009
Altın Üyelik Bitiş Tarihi
05-09-2025
Haluk hocam; dediğim gibi çok az anlıyorum; bu sebeple
denedim sizinde bahsettiğiniz üzere eksik yerler var tabi ki tablo değişti deneyeceğim; düzeltme ve ilaveler de yapmaya çalışacağım, geri dönüş yapacağım saygılar
 

Haluk

Özel Üye
Katılım
7 Temmuz 2004
Mesajlar
12,406
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
Siz dosyanızda başka bir sayfaya bir buton yerleştirip, benim kodu çalıştırın. Hatta, XML tablosundaki diğer tüm verileri de alacak şekilde kodu geliştirin.

Daha sonra, revize tablonuzun olduğu sayfada ilgili hücrelere =Sayfa2!B12 falan gibi formüllerle istediğiniz verileri alırsınız.

.
 

ERRİC

Altın Üye
Katılım
19 Ekim 2010
Mesajlar
296
Excel Vers. ve Dili
OFFİCE 2009
Altın Üyelik Bitiş Tarihi
05-09-2025
hocam bir soru daha çalışma presibini bilmediğim için soruyorum;
bu bir aylık beyanname idi ve ben son üç sene 3x12=36 adet beyabının bilgilerini alıcam excele;
bu koddaki dosya ismini mi değişteceğim her seferinde ya da bir dosya yolu mu belirlemek lazım;
mesela masaüstünde x klasöründe xmlleri çek desek; toplu olarak 36 ay veya önemli değil ay ay da olabilir ;
uygun olunca cevap alırsam iyi olur
 

Haluk

Özel Üye
Katılım
7 Temmuz 2004
Mesajlar
12,406
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
Ekli dosyayı deneyin...... Ben verdiğiniz XML örneğini kopyalayıp 3 adet yaptım.

Excel dosyasındaki butona bastiğınızda, klasördeki tüm XML dosyalarından alınan veriler Excel sayfasında sütunlarda yan yana listelenir.

Her sütunun ilk hücresinde XML dosyasındaki fatura yılı, hemen altındaki hücrede ise ilgili ayın numarası yazacaktır. Böylece hangi sütundaki verinin hangi XML dosyasına ve dolayısıyle hangi döneme ait olduğu belli olacaktır.

.
 

Ekli dosyalar

ERRİC

Altın Üye
Katılım
19 Ekim 2010
Mesajlar
296
Excel Vers. ve Dili
OFFİCE 2009
Altın Üyelik Bitiş Tarihi
05-09-2025
246380

hocam masaüstüne aldım klasörü; zipden çıkardım; klasörün içinde exceli açtım; 1 kaç kere ama aynı hatayı aldım;
güven merkezi ayarlarından baktım makrlar etkinleştir seçili başka bir bilgisayardan mı deneyelim; ne dersiniz nedn böyle oldu acaba
 

Haluk

Özel Üye
Katılım
7 Temmuz 2004
Mesajlar
12,406
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
Bilemiyorum.... ben şimdi indirdim, denedim.... çalışıyor.
Umarim makrolari etkinlestirip de deneniyorsunuzdur.

İndiren bir başkası cevap da yazmamış, zaten genelde yazmazlar.....

.
 
Son düzenleme:

ERRİC

Altın Üye
Katılım
19 Ekim 2010
Mesajlar
296
Excel Vers. ve Dili
OFFİCE 2009
Altın Üyelik Bitiş Tarihi
05-09-2025
tüm güven merkesindeki ayarlara etkileştir dedim başka yerde deneyeceğim yerime geçeyim
"İndiren bir başkası cevap da yazmamış, zaten genelde yazmazlar....."
sanırım hocam;
 

Haluk

Özel Üye
Katılım
7 Temmuz 2004
Mesajlar
12,406
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
Siz en iyisi, aşağıdaki kodları yeni bir Excel dosyasını "xlsm" olarak kaydettikten sonra deneyin....

C#:
Sub Test()
    'Haluk - 06/09/2023
    '
    Dim xDoc As Object
    Dim strFile As String
    Dim i As Integer, j As Integer
  
    ChDir ThisWorkbook.Path
  
    Cells.Clear
  
    Set FSO = CreateObject("Scripting.FileSystemObject")
  
    Set xDoc = CreateObject("MSXML2.DOMDocument")
    xDoc.async = False
    xDoc.validateOnParse = False
      
    Set MyFolder = Application.FileDialog(msoFileDialogFolderPicker)
  
    If MyFolder.Show <> 0 Then
        Set SourceFolder = FSO.GetFolder(MyFolder.SelectedItems(1))
    Else
        myMsg = "XML formatinda faturalarin olduðu klasörü seçmelisiniz....."
        GoTo SafeExit:
    End If
      
    strFile = Dir(MyFolder.SelectedItems(1) & "\*.xml")
  
    j = 0

    Do While strFile <> ""
        i = 1
        j = j + 2
 
        xDoc.Load SourceFolder.Path & "\" & strFile
      
        Set myNode = xDoc.SelectSingleNode("//donem/yil")
        i = i + 1
        Cells(i, j) = myNode.BaseName
        Cells(i, j + 1) = myNode.Text
        Columns(j).ColumnWidth = 30
        Columns(j + 1).ColumnWidth = 10
      
        Set myNode = xDoc.SelectSingleNode("//donem/ay")
        i = i + 1
        Cells(i, j) = myNode.BaseName
        Cells(i, j + 1) = myNode.Text
      
        Set objNodeList = xDoc.getElementsByTagName("indirilecekKDVOD")
      
        For k = 0 To objNodeList.Length - 1
            i = i + 1
            Cells(i, j) = objNodeList(k).ChildNodes(0).BaseName
            Cells(i, j + 1) = objNodeList(k).ChildNodes(0).Text
            i = i + 1
            Cells(i, j) = objNodeList(k).ChildNodes(1).BaseName
            Cells(i, j + 1) = objNodeList(k).ChildNodes(1).Text
            i = i + 1
            Cells(i, j) = objNodeList(k).ChildNodes(2).BaseName
            Cells(i, j + 1) = objNodeList(k).ChildNodes(2).Text
        Next
        
        Set myNode = xDoc.SelectSingleNode("//indirilecekKDVODToplamKDV")
        i = i + 1
        Cells(i, j) = myNode.BaseName
        Cells(i, j + 1) = myNode.Text
      
        Set myNode = xDoc.SelectSingleNode("//tamIstisna/teslimVeHizmetTutari")
        i = i + 1
        Cells(i, j) = myNode.BaseName
        Cells(i, j + 1) = myNode.Text
       
        Set myNode = xDoc.SelectSingleNode("//tamIstisna/kdvOdemeksizinMalBedeli")
        i = i + 1
        Cells(i, j) = myNode.BaseName
        Cells(i, j + 1) = myNode.Text
       
        Set myNode = xDoc.SelectSingleNode("//tamIstisna/yuklenilenKDV")
        i = i + 1
        Cells(i, j) = myNode.BaseName
        Cells(i, j + 1) = myNode.Text
       
        Set myNode = xDoc.SelectSingleNode("//toplamTamTeslimVeHizmetTutari")
        i = i + 1
        Cells(i, j) = myNode.BaseName
        Cells(i, j + 1) = myNode.Text
      
        Set myNode = xDoc.SelectSingleNode("//toplamTamMalBedeliTutari")
        i = i + 1
        Cells(i, j) = myNode.BaseName
        Cells(i, j + 1) = myNode.Text
          
        Set myNode = xDoc.SelectSingleNode("//toplamTamYuklenilenKDV")
        i = i + 1
        Cells(i, j) = myNode.BaseName
        Cells(i, j + 1) = myNode.Text
      
        Set myNode = xDoc.SelectSingleNode("//toplamTamYuklenilenKDV")
        i = i + 1
        Cells(i, j) = myNode.BaseName
        Cells(i, j + 1) = myNode.Text
      
        Set myNode = xDoc.SelectSingleNode("//istisnaKapsamiTeslimVeHizmet")
        i = i + 1
        Cells(i, j) = myNode.BaseName
        Cells(i, j + 1) = myNode.Text
        
        Set myNode = xDoc.SelectSingleNode("//sonrakiDonemeDevredenKDV")
        i = i + 1
        Cells(i, j) = myNode.BaseName
        Cells(i, j + 1) = myNode.Text
      
        strFile = Dir
    Loop
  
SafeExit:
    Set xDoc = Nothing
End Sub

.
 
Son düzenleme:

ERRİC

Altın Üye
Katılım
19 Ekim 2010
Mesajlar
296
Excel Vers. ve Dili
OFFİCE 2009
Altın Üyelik Bitiş Tarihi
05-09-2025
Haluk hocam evdeki bilgisayarda çalıştı; makrolu excel dosyayı açmadan önce sağ tıklayıp engellemeyi kaldır dedim ve çalıştı her iki çalışmada çok iyi olmuş kullanıma başladıkça yeni sorularım olursa size döneceğim uygun olursanız ; aro , saygılar, selamlar
 

ERRİC

Altın Üye
Katılım
19 Ekim 2010
Mesajlar
296
Excel Vers. ve Dili
OFFİCE 2009
Altın Üyelik Bitiş Tarihi
05-09-2025
hocam ekte 29 adet beyan var hepsi xml formatında , sadece versiyonları farklı bana vakit kaybettirmeden ;
dosya adı değiştirne elle tek tek veya bir başka şeye gerek kalmadan; direk çalıştıramadım; mümkün olduğunuzda bir bakar mısınız ;
birkaç deneme yaptım makro çalışırken dosya adı ve sırası gözetiyor; versiyon sanırım gözetiyor, dosya adı tariihi veriyonu gözetmeden kendi dönemler itibari ile yan yana dökebilirmi bu şekilde yapılablirmi;
246477ü
246478
dosya adlarını sıralasam bile yine hata alıyorum yukarıdaki gibi;
teşekürler
 

Ekli dosyalar

Son düzenleme:

ERRİC

Altın Üye
Katılım
19 Ekim 2010
Mesajlar
296
Excel Vers. ve Dili
OFFİCE 2009
Altın Üyelik Bitiş Tarihi
05-09-2025
hocam merhaba yine uygun olduğunuz zaman; acil değil; aklımda iken yazatım istedim; zor ise dökülen excelden elle de aktarırız ekteki tabloya;
excele çekilen bu verilerin ekteki tabloda ilgili formülsüz yerlere doldurtabilir miyiz;
 

Ekli dosyalar

Haluk

Özel Üye
Katılım
7 Temmuz 2004
Mesajlar
12,406
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
hocam ekte 29 adet beyan var hepsi xml formatında , sadece versiyonları farklı bana vakit kaybettirmeden ;
dosya adı değiştirne elle tek tek veya bir başka şeye gerek kalmadan; direk çalıştıramadım; mümkün olduğunuzda bir bakar mısınız ;
birkaç deneme yaptım makro çalışırken dosya adı ve sırası gözetiyor; versiyon sanırım gözetiyor, dosya adı tariihi veriyonu gözetmeden kendi dönemler itibari ile yan yana dökebilirmi bu şekilde yapılablirmi;
ü

dosya adlarını sıralasam bile yine hata alıyorum yukarıdaki gibi;
teşekürler


XML dosyalarının bazılarında aranılan veriler olmadığı için hata alıyorsunuz. Bu yüzden ilk önce XML dosyasında ilgili düğümün olup olmadığını kontrol etmek gerekir...

C#:
Sub Test2()
    'Haluk - 15/09/2023
    '
    Dim xDoc As Object
    Dim strFile As String
    Dim i As Integer, j As Integer

    ChDir ThisWorkbook.Path

    Cells.Clear

    Set FSO = CreateObject("Scripting.FileSystemObject")

    Set xDoc = CreateObject("MSXML2.DOMDocument")
    xDoc.async = False
    xDoc.validateOnParse = False
     
    Set MyFolder = Application.FileDialog(msoFileDialogFolderPicker)

    If MyFolder.Show <> 0 Then
        Set SourceFolder = FSO.GetFolder(MyFolder.SelectedItems(1))
    Else
        myMsg = "XML formatinda faturalarin olduðu klasörü seçmelisiniz....."
        GoTo SafeExit:
    End If
     
    strFile = Dir(MyFolder.SelectedItems(1) & "\*.xml")

    j = 0

    Do While strFile <> ""
        i = 1
        j = j + 2

        xDoc.Load SourceFolder.Path & "\" & strFile
     
        Set myNode = xDoc.SelectSingleNode("//donem/yil")
        i = i + 1
        Cells(i, j) = myNode.BaseName
        Cells(i, j + 1) = myNode.Text
        Columns(j).ColumnWidth = 30
        Columns(j + 1).ColumnWidth = 10
     
        Set myNode = xDoc.SelectSingleNode("//donem/ay")
        i = i + 1
        Cells(i, j) = myNode.BaseName
        Cells(i, j + 1) = myNode.Text
     
        Set objNodeList = xDoc.getElementsByTagName("indirilecekKDVOD")
     
        For k = 0 To objNodeList.Length - 1
            i = i + 1
            Cells(i, j) = objNodeList(k).ChildNodes(0).BaseName
            Cells(i, j + 1) = objNodeList(k).ChildNodes(0).Text
            i = i + 1
            Cells(i, j) = objNodeList(k).ChildNodes(1).BaseName
            Cells(i, j + 1) = objNodeList(k).ChildNodes(1).Text
            i = i + 1
            Cells(i, j) = objNodeList(k).ChildNodes(2).BaseName
            Cells(i, j + 1) = objNodeList(k).ChildNodes(2).Text
        Next
       
        Set myNode = xDoc.SelectSingleNode("//indirilecekKDVODToplamKDV")
        If Not myNode Is Nothing Then
            i = i + 1
            Cells(i, j) = myNode.BaseName
            Cells(i, j + 1) = myNode.Text
        End If
     
        Set myNode = xDoc.SelectSingleNode("//tamIstisna/teslimVeHizmetTutari")
        If Not myNode Is Nothing Then
            i = i + 1
            Cells(i, j) = myNode.BaseName
            Cells(i, j + 1) = myNode.Text
        End If
     
        Set myNode = xDoc.SelectSingleNode("//tamIstisna/kdvOdemeksizinMalBedeli")
        If Not myNode Is Nothing Then
            i = i + 1
            Cells(i, j) = myNode.BaseName
            Cells(i, j + 1) = myNode.Text
        End If
     
        Set myNode = xDoc.SelectSingleNode("//tamIstisna/yuklenilenKDV")
        If Not myNode Is Nothing Then
            i = i + 1
            Cells(i, j) = myNode.BaseName
            Cells(i, j + 1) = myNode.Text
        End If
     
        Set myNode = xDoc.SelectSingleNode("//toplamTamTeslimVeHizmetTutari")
        If Not myNode Is Nothing Then
            i = i + 1
            Cells(i, j) = myNode.BaseName
            Cells(i, j + 1) = myNode.Text
        End If
     
        Set myNode = xDoc.SelectSingleNode("//toplamTamMalBedeliTutari")
        If Not myNode Is Nothing Then
            i = i + 1
            Cells(i, j) = myNode.BaseName
            Cells(i, j + 1) = myNode.Text
        End If
         
        Set myNode = xDoc.SelectSingleNode("//toplamTamYuklenilenKDV")
        If Not myNode Is Nothing Then
            i = i + 1
            Cells(i, j) = myNode.BaseName
            Cells(i, j + 1) = myNode.Text
        End If
     
        Set myNode = xDoc.SelectSingleNode("//toplamTamYuklenilenKDV")
        If Not myNode Is Nothing Then
            i = i + 1
            Cells(i, j) = myNode.BaseName
            Cells(i, j + 1) = myNode.Text
        End If
     
        Set myNode = xDoc.SelectSingleNode("//istisnaKapsamiTeslimVeHizmet")
        If Not myNode Is Nothing Then
            i = i + 1
            Cells(i, j) = myNode.BaseName
            Cells(i, j + 1) = myNode.Text
        End If
       
        Set myNode = xDoc.SelectSingleNode("//sonrakiDonemeDevredenKDV")
        If Not myNode Is Nothing Then
            i = i + 1
            Cells(i, j) = myNode.BaseName
            Cells(i, j + 1) = myNode.Text
        End If
     
        strFile = Dir
    Loop

SafeExit:
    Set xDoc = Nothing
End Sub

.
 

ERRİC

Altın Üye
Katılım
19 Ekim 2010
Mesajlar
296
Excel Vers. ve Dili
OFFİCE 2009
Altın Üyelik Bitiş Tarihi
05-09-2025
hocam selamla hoşgeldiniz vakit ayırıp 2 soruma da cevap verdiğiniz için çok memnun oldum, emeğinize sağlık pazartesi döneceğim sabırsızlıkla bakacağım . bu bile baya yükümü hafifletir sanırım , ekteki "Beyan Döküm 2023" exceline yerleşmez bu veriler değilmi olsun elinize sağlık yine de selamlar saygılar işiniz rast gitsin,
 
Üst