• DİKKAT

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

başka kitaptaki sayfaları kriterlere göre çekip ayrı kitaplar oluşturmak .

Katılım
14 Ocak 2008
Mesajlar
176
Excel Vers. ve Dili
2010 türkçe
Bu dosyadaki makroyu çalıştırdığım zaman, A11 hücresi adında bir dosya oluşturmasını, ve daha sonra göstereceğim klasörün içindeki dosyaların çalışma sayfa adlarına bakarak bakarak, buradaki a11:AL11 aralığındaki değere eşit olan sayfaları A11 hücresi adıyla oluşturulan dosyanın içine kopyalayıp kaydederek kapatmasını ve bunu işlemi A11:A31 hücreleri arasında tekrarlamasını istiyorum.
 

Ekli dosyalar

Son düzenleme:
Bu dosyadaki makroyu çalıştırdığım zaman, A11 hücresi adında bir dosya oluşturmasını, ve daha sonra göstereceğim klasörün içindeki dosyaların çalışma sayfa adlarına bakarak bakarak, buradaki a11:AL11 aralığındaki değere eşit olan sayfaları A11 hücresi adıyla oluşturulan dosyanın içine kopyalayıp kaydederek kapatmasını ve bunu işlemi A11:A31 hücreleri arasında tekrarlamasını istiyorum.
 
Son düzenleme:
Veri alınacak dosyadan da örnek ekler misiniz?
 
Veri alınacak dosyayı ekledim. Ancak boyut sınırlaması nedeniyle sadece 5 dosya ekledim. bu klasörün içinde bunun gibi 14 ile 20 arasında dosya oluyor
 

Ekli dosyalar

Aşağıdaki kodu deneyiniz.

Kod:
Option Explicit

Sub AKTAR()
    Dim K1 As Workbook, K2 As Workbook, S1 As Worksheet
    Dim FSO As Object, Yol As String
    Dim Dosya As Variant, X As Long, Y As Integer
    Dim Veri_Dosyası As Workbook, Sayfa As Worksheet
    
    Application.ScreenUpdating = False
    
    Set K1 = ThisWorkbook
    Set S1 = K1.Sheets("Aktar")
    Yol = K1.Path & "\DAĞIT"
    
    On Error Resume Next
    Set FSO = CreateObject("Scripting.FileSystemObject")
    FSO.CreateFolder Yol
    On Error GoTo 0
    
    Dosya = Application.GetOpenFilename("Excel Dosyaları (*.xl*),*.xl*,", 3, "Lütfen dosya seçiniz...", MultiSelect:=True)
    If Not IsArray(Dosya) Then
        MsgBox "Dosya seçimi yapmadığınız için işleminiz iptal edilmiştir !", vbExclamation
        Exit Sub
    End If

    For X = 11 To S1.Cells(Rows.Count, 1).End(3).Row
        If S1.Cells(X, 1) <> "" Then
            Set K2 = Workbooks.Add(1)
            For Y = LBound(Dosya) To UBound(Dosya)
                DoEvents
                Application.DisplayAlerts = False
                Set Veri_Dosyası = Workbooks.Open(Dosya(Y), False, False)
                Application.DisplayAlerts = True
                
                For Each Sayfa In Veri_Dosyası.Worksheets
                    If WorksheetFunction.CountIf(S1.Range("B" & X & ":AL" & X), Sayfa.Name) > 0 Then
                        Sayfa.Copy After:=K2.Sheets(K2.Worksheets.Count)
                    End If
                Next
                Veri_Dosyası.Close 0
            Next
            
            Application.DisplayAlerts = False
            If K2.Worksheets.Count > 1 Then
                K2.Sheets(1).Delete
                K2.SaveAs Yol & "\" & S1.Cells(X, 1) & ".xls"
                K2.Close 0
            End If
            Application.DisplayAlerts = True
        End If
    Next

    Set K1 = Nothing
    Set S1 = Nothing
    Set FSO = Nothing
    Set K2 = Nothing
    Set Veri_Dosyası = Nothing
    
    Application.ScreenUpdating = True

    MsgBox "İşleminiz tamamlanmıştır.", vbInformation
End Sub
 
Üstteki mesajımda ki kod ile klasör içindeki dosyalardan istediğinizi seçerek aktarım yapabiliyorsunuz. Fakat siz özel mesajınızda sadece klasör seçerek bu işlemi yapmak istediğinizi belirtmişsiniz. Bu sebeple aşağıdaki kodu kullanabilirsiniz.

Kod:
Option Explicit

Sub AKTAR()
    Dim K1 As Workbook, K2 As Workbook, S1 As Worksheet
    Dim FSO As Object, Yol As String, Klasor As Object
    Dim Dosya As Object, X As Long, Bul As Range
    Dim Veri_Dosyası As Workbook, Sayfa As Worksheet
    Dim Dosya_Kaydetme_Formati As Integer, No As Integer
    
    Set Klasor = CreateObject("Shell.Application").BrowseForFolder(0, "Lütfen bir klasör seçiniz !", 1)
    Set FSO = CreateObject("Scripting.FileSystemObject")
    
    If FSO.GetFolder(Klasor.Items.Item.Path).Files.Count = 0 Then
        MsgBox "Seçtiğiniz klasörde dosya bulunamadı !", vbCritical
        Exit Sub
    End If
    
    Application.ScreenUpdating = False
    
    Dosya_Kaydetme_Formati = Application.DefaultSaveFormat
    
    Set K1 = ThisWorkbook
    Set S1 = K1.Sheets("Aktar")
    Yol = K1.Path & "\DAĞIT"
    
    If Val(Application.Version) < 12 Then
        Application.DefaultSaveFormat = -4143
        No = -4143
    Else
        Application.DefaultSaveFormat = 56
        No = 56
        K1.CheckCompatibility = False
    End If
    
    On Error Resume Next
    FSO.CreateFolder Yol
    On Error GoTo 0
    
    For X = 11 To S1.Cells(Rows.Count, 1).End(3).Row
        If S1.Cells(X, 1) <> "" Then
            Set K2 = Workbooks.Add(1)
            For Each Dosya In FSO.GetFolder(Klasor.Items.Item.Path).Files
                DoEvents
                Application.DisplayAlerts = False
                Set Veri_Dosyası = Workbooks.Open(Dosya, False, False)
                Application.DisplayAlerts = True
                
                For Each Sayfa In Veri_Dosyası.Worksheets
                    Set Bul = S1.Range("B" & X & ":AL" & X).Find(CStr(Sayfa.Name), , , xlWhole)
                    If Not Bul Is Nothing Then
                        Sayfa.Copy After:=K2.Sheets(K2.Worksheets.Count)
                    End If
                Next
                Veri_Dosyası.Close 0
            Next
            
            Application.DisplayAlerts = False
            If K2.Worksheets.Count > 1 Then
                K2.Sheets(1).Delete
                K2.SaveAs Yol & "\" & S1.Cells(X, 1) & ".xls", No
                K2.Close 0
            End If
            Application.DisplayAlerts = True
        End If
    Next

    Application.DefaultSaveFormat = Dosya_Kaydetme_Formati

    Set K1 = Nothing
    Set S1 = Nothing
    Set FSO = Nothing
    Set K2 = Nothing
    Set Veri_Dosyası = Nothing
    Set Bul = Nothing
    
    Application.ScreenUpdating = True

    MsgBox "İşleminiz tamamlanmıştır.", vbInformation
End Sub
 
Eklediğiniz klasördeki dosyaları da denedim. Bende sorun görünmüyor. Yaşadığınız sorun nedir?
 
WorkSheetFunction sınıfının CountIf özelliği alınamıyor

hatası veriyor.

debug dediğimde ise If WorksheetFunction.CountIf(S1.Range("B" & X & ":AL" & X), Sayfa.Name) > 0 Then bu satırda kalıyor
 
üstat, 15 tane dosya oluşturuyor, devamında makro bitiyor, bir de, 1, 2, 4, 6 gibi sayfalar tabloda olmamasına rağmen, oluşturulan dosyaların içerisine bunları da atıyor, kullandığım kod aşağıdadır.


Option Explicit

Sub AKTAR()
Dim K1 As Workbook, K2 As Workbook, S1 As Worksheet
Dim FSO As Object, Yol As String, Klasor As Object
Dim Dosya As Object, X As Long
Dim Veri_Dosyası As Workbook, Sayfa As Worksheet

Set Klasor = CreateObject("Shell.Application").BrowseForFolder(0, "Lütfen bir klasör seçiniz !", 1)
Set FSO = CreateObject("Scripting.FileSystemObject")

If FSO.GetFolder(Klasor.Items.Item.Path).Files.Count = 0 Then
MsgBox "Seçtiğiniz klasörde dosya bulunamadı !", vbCritical
Exit Sub
End If

Application.ScreenUpdating = False

Set K1 = ThisWorkbook
Set S1 = K1.Sheets("Aktar")
Yol = K1.Path & "\DAĞIT"

On Error Resume Next
FSO.CreateFolder Yol
On Error GoTo 0

For X = 11 To S1.Cells(Rows.Count, 1).End(3).Row
If S1.Cells(X, 1) <> "" Then
Set K2 = Workbooks.Add(1)
For Each Dosya In FSO.GetFolder(Klasor.Items.Item.Path).Files
DoEvents
Application.DisplayAlerts = False
Set Veri_Dosyası = Workbooks.Open(Dosya, False, False)
Application.DisplayAlerts = True


On Error Resume Next



For Each Sayfa In Veri_Dosyası.Worksheets
If WorksheetFunction.CountIf(S1.Range("B" & X & ":AL" & X), Sayfa.Name) > 0 Then
Sayfa.Copy After:=K2.Sheets(K2.Worksheets.Count)
End If
Next
Veri_Dosyası.Close 0
Next

Application.DisplayAlerts = False
If K2.Worksheets.Count > 1 Then
K2.Sheets(1).Delete
K2.SaveAs Yol & "\" & S1.Cells(X, 1) & ".xls", FileFormat:=56
K2.Close 0
End If
Application.DisplayAlerts = True
End If
Next

Set K1 = Nothing
Set S1 = Nothing
Set FSO = Nothing
Set K2 = Nothing
Set Veri_Dosyası = Nothing

Application.ScreenUpdating = True

MsgBox "İşleminiz tamamlanmıştır.", vbInformation
End Sub
 
Merhaba,

1. ve 7. mesajlarınızda ki dosyaları indirdim.
6 nolu mesajımda ki kodu dosyanızda denedim.

1 nolu mesajınızda ki dosyada M11 hücresine sorun var dediğiniz için 6 yazdım.

Sonuç;

Kod herhangi bir hata vermedi.
Masa üstünde DAĞIT isimli klasör oluştu ve klasör içinde 21 adet excel dosyası oluştu.

Her ihtimale karşı 6 nolu mesajımda ki koda küçük bir ekleme yaptım. Tekrar deneyip sonucu bildirir misiniz?
 
Korhan Bey; Evet bu defa 21 dosya için de işlem yapıyor. Ancak Listede olmayan bazı sayfaları da (1-4-6 ...) taşıyor.
Sanırım kullanmış olduğunuz Countİf fonksiyonu;
Örneğin; BUY' değerinin bulunduğu satır hizasında, "7-4" değer içeren bir hücre olduğu için, bunun içerisindeki "4" ü de buluyor,
Countİf fonkyisonu, aradığı sayfa adını içerir mantığıyla arıyor olabilir mi?
 
Merhaba,

6 nolu mesajımda COUNTIF olayını iptal ettim. Ayırca 2003-2010 uyumluluk sorunu içinde eklemeler yaptım. Tekrar deneyiniz.
 
Geri
Üst