Soru 1
Elimde içerisinde 40.000 satır veri bulunan bir Excel dosyası var. Bu 40.000 satırı 100'erli olarak bölmem gerekiyor.
Cevap: Aşağıdaki yazdığım VBA makrosu ile 100'erli satır olarak yeni eklenen sayfalara aktarılmaktadır.
Makroları kullanmak için;
Excel dosyası açıkken;
Excel durum çubuğundaki sayfa adında sağ tıkla / Kod görüntüle
Kod alanına aşağıdaki kodları ekle
Çalıştırmak için F5e bas ya da Excel'e geç / ALT+F8e bas makroyu seç / Çalıştır.
Sub SatirlariSayfalaraAktar_v1() 'Excel satırlarını 100'erli olarak bölüp yeni sayfalara aktarır 'makro: Mesut Akcan '15 Eylül 2018 For n = 1 To Cells.SpecialCells(xlLastCell).Row Step 100 satirlar = Str(n) & ":" & Trim(Str(n + 99)) Rows(satirlar).EntireRow.Copy Sheets.Add After:=ActiveSheet ActiveSheet.Paste DoEvents Next Sheets(1).Activate End Sub
Soru 2
Bu 100'lü bölümleri farklı yeni Excel dosyası olarak kaydedebilir miyiz.
Sub SatirlariDosyalaraAktar_v2() 'satırları 100'erli olarak bölüp yeni excel dosyalarına aktarır 'makro: Mesut Akcan '16 Eylül 2018 klasor = ActiveWorkbook.Path & "\" For n = 1 To Cells.SpecialCells(xlLastCell).Row Step 100 satirlar = Trim(Str(n)) & ":" & Trim(Str(n + 99)) Rows(satirlar).EntireRow.Copy dosyaNo = dosyaNo + 1 Workbooks.Add ActiveSheet.Paste ActiveWorkbook.SaveAs Filename:=klasor & "Dosya_" & Trim(dosyaNo) ActiveWorkbook.Close DoEvents Next MsgBox "İşlem Tamama" End Sub
Soru 3
Çıktıları CSV olarak kaydetmenin imkanı var mı?
Sub SatirlariDosyalaraAktar_v3() 'satırları 100'erli olarak bölüp yeni excel CSV dosyalarına aktarır 'makro: Mesut Akcan '12 Ekim 2018 klasor = ActiveWorkbook.Path & "\" For n = 1 To Cells.SpecialCells(xlLastCell).Row Step 100 satirlar = Trim(Str(n)) & ":" & Trim(Str(n + 99)) Rows(satirlar).EntireRow.Copy Workbooks.Add ActiveSheet.Paste dosyaNo = dosyaNo + 1 Dosya = "Dosya_" & Trim(dosyaNo) ActiveWorkbook.SaveAs Filename:=klasor & Dosya, FileFormat:=xlCSV ActiveWorkbook.Close DoEvents Next MsgBox "İşlem Tamam" End Sub
Soru 4
Benim de bu duruma benzer bir ihtiyacım var. Ben her satırın ayrı ayrı dosyalara bölünmesini istiyorum. Üstteki kodlar galiba 100'er 100'er bölüyor. Ben makroda 100 olan kısmı 1 yaptım ancak bu sefer bir üstündeki satırı silerek ayrı dosya oluşturdu yardım ederseniz çok sevinirim umarım kendimi ifade etmişimdir.Cevap: Kodları biraz geliştirdim. Satır sayısını başlangıçta kendiniz belirleyebiliyorsunuz.
Sub SatirlariDosyalaraAktar_v4() 'satırları istenilen sayıda bölüp yeni excel dosyalarına aktarır 'makro: Mesut Akcan '29 Temmuz 2019 Dim SatirSayisi As Long Dim dosyaNo As Integer, n As Long Dim klasor As String, satirlar As String, Dosya As String SatirSayisi = Val(InputBox("Dosyalara bölünecek satır sayısını giriniz:")) If SatirSayisi < 1 Then Exit Sub klasor = ActiveWorkbook.Path & "\" For n = 1 To Cells.SpecialCells(xlLastCell).Row Step SatirSayisi satirlar = Trim(Str(n)) & ":" & Trim(Str(n + SatirSayisi - 1)) Rows(satirlar).EntireRow.Copy Workbooks.Add ActiveSheet.Paste dosyaNo = dosyaNo + 1 Dosya = "Dosya_" & Format(dosyaNo, "000") ActiveWorkbook.SaveAs Filename:=klasor & Dosya ActiveWorkbook.Close DoEvents Next MsgBox "İşlem Tamam!" End Sub
Soru 5
Excelde toplam 2000 satır var. 250'şerli olarak ayırmak istiyorum ama bu 250'lik kısımları TXT olarak kaydetmesini istiyorum.
Cevap: Kodlarda isteğinize uygun değişiklikler yaptım. Satır sayısını kod çalışınca size soracak. 250'de girebilirsin 100 de.
Sub SatirlariDosyalaraAktar_v5() 'satırları istenilen sayıda bölüp yeni TXT dosyalara aktarır 'makro: Mesut Akcan '25 Eylül 2019 Dim SatirSayisi As Long Dim dosyaNo As Integer, n As Long Dim klasor As String, satirlar As String, dosyaAdi As String Dim yeniDosya As Workbook SatirSayisi = Val(InputBox("Dosyalara bölünecek satır sayısını giriniz:")) If SatirSayisi < 1 Then Exit Sub klasor = ActiveWorkbook.Path & "\" For n = 1 To Cells.SpecialCells(xlLastCell).Row Step SatirSayisi satirlar = Trim(Str(n)) & ":" & Trim(Str(n + SatirSayisi - 1)) Rows(satirlar).EntireRow.Copy dosyaNo = dosyaNo + 1 dosyaAdi = "Dosya_" & Format(dosyaNo, "000") Set yeniDosya = Workbooks.Add With yeniDosya .Sheets(1).Paste .SaveAs Filename:=klasor & dosyaAdi, FileFormat:=xlText .Close End With DoEvents Next MsgBox "İşlem Tamam!" End Sub
Soru 6
Parçalara bölünen dosyalarda başlık kısmı sadece 1. dosyada çıkıyor. Diğer tüm dosyalarda başlıklar olabilir mi?
Cevap: İsteğinize göre kodları değiştirdim. Umarım işinizi görür.
Sub SatirlariDosyalaraAktar_v6() 'makro: Mesut Akcan '21 Şubat 2021 'mesutakcan.blogspot.com 'Excel sayfasındaki verileri istenilen satır sayısı kadar dosyalara böler 'Başlık satırı varsa bölünen dosyalara başlık ekler Dim SatirSayisi As Long Dim dosyaNo As Integer, n As Long, bs As Long, bsvar Dim klasor As String, satirlar As String, dosyaAdi As String Dim wb As Workbook, wbs As Worksheet SatirSayisi = Val(InputBox("Dosyalara bölünecek satır sayısını giriniz:", , 100)) If SatirSayisi < 1 Then MsgBox "Satır sayısı 1 veya daha büyük olmalı!" Exit Sub End If klasor = InputBox("Dosyaların kaydedileceği klasör:", , ActiveWorkbook.Path) 'kayıt klasörü If Right(klasor, 1) <> "\" Then klasor = klasor & "\" 'sonda \ yoksa ekle bsvar = MsgBox("Başlık satırı var mı?", vbYesNo) If bsvar = vbYes Then bs = 2 Else bs = 1 'başlık satırı varsa başlama satırı 2 Set wbs = ThisWorkbook.ActiveSheet 'makronun olduğu dosyanın aktif sayfası Application.ScreenUpdating = False 'arkaplanda çalış For n = bs To wbs.Cells.SpecialCells(xlLastCell).Row Step SatirSayisi satirlar = Trim(Str(n)) & ":" & Trim(Str(n + SatirSayisi - 1)) 'satır bölümleri: 2:101 gibi If bsvar = vbYes Then satirlar = "1:1," & satirlar 'başlık satırı varsa 1:1, eklenecek, 1:1,2:101 gibi wbs.Range(satirlar).Copy 'satırları kopyala dosyaNo = dosyaNo + 1 'dosya numarası dosyaAdi = "Dosya_" & Format(dosyaNo, "000") 'dosya adını biçimlendir. Dosya_001 gibi Set wb = Workbooks.Add 'yeni dosya aç With wb .Sheets(1).Paste 'dosyaya yapıştır .SaveAs Filename:=klasor & dosyaAdi 'dosyaya kaydet .Close 'dosyayı kapat End With DoEvents 'bekleyen işleri yürüt Next Application.ScreenUpdating = True 'arkaplanda çalışma iptal MsgBox klasor & " klasöründe" & vbCr & dosyaNo & " adet dosya oluşturuldu.", vbInformation, "İşlem Tamam!" 'Bitti! End Sub
Soru 7
Soru 6 daki kod çok güzel başlığı olduğu gibi alıyor. Excel çalışma dosyası olarak değil, hiç bir değişiklik yapmadan CSV olarak kaydetme şansı olur mu?
Cevap: İsteğinize göre kodları değiştirdim. Umarım işinizi görür.
dosyaFormati = xlCSVsatırını değiştirerek istenilen formatta kayıt edilebilir. Dosya Formatları
Option Explicit Sub SatirlariDosyalaraAktar_v7() 'makro: Mesut Akcan '19 Haziran 2022 'mesutakcan.blogspot.com 'Excel sayfasındaki verileri istenilen satır sayısı kadar dosyalara böler 'Başlık satırı varsa bölünen dosyalara başlık ekler Dim satirSayisi As Long Dim dosyaNo As Integer, n As Long, bs As Long, bsvar Dim klasor As String, satirlar As String, dosyaAdi As String Dim wb As Workbook, wbs As Worksheet Dim dosyaFormati As XlFileFormat 'dosya formatları: 'https://docs.microsoft.com/tr-tr/office/vba/api/excel.xlfileformat dosyaFormati = xlCSV 'excel CSV dosya formatı 'CSV dosyayı excelde düzgün açmak için dosya ilk satırına 'sep=, ekleyin. tırnak hariç satirSayisi = Val(InputBox("Dosyalara bölünecek satır sayısını giriniz:", , 100)) If satirSayisi < 1 Then MsgBox "Satır sayısı 1 veya daha büyük olmalı!" Exit Sub End If klasor = InputBox("Dosyaların kaydedileceği klasör:", , ActiveWorkbook.Path) 'kayıt klasörü If Right(klasor, 1) <> "\" Then klasor = klasor & "\" 'sonda \ yoksa ekle bsvar = MsgBox("Başlık satırı var mı?", vbYesNo) If bsvar = vbYes Then bs = 2 Else bs = 1 'başlık satırı varsa başlama satırı 2 Set wbs = ThisWorkbook.ActiveSheet 'makronun olduğu dosyanın aktif sayfası Application.ScreenUpdating = False 'arkaplanda çalış For n = bs To wbs.Cells.SpecialCells(xlLastCell).Row Step satirSayisi satirlar = Trim(Str(n)) & ":" & Trim(Str(n + satirSayisi - 1)) 'satır bölümleri: 2:101 gibi If bsvar = vbYes Then satirlar = "1:1," & satirlar 'başlık satırı varsa 1:1, eklenecek, 1:1,2:101 gibi wbs.Range(satirlar).Copy 'satırları kopyala dosyaNo = dosyaNo + 1 'dosya numarası dosyaAdi = "Dosya_" & Format(dosyaNo, "000") 'dosya adını biçimlendir. Dosya_001 gibi Set wb = Workbooks.Add 'yeni dosya aç With wb .Sheets(1).Paste 'dosyaya yapıştır .SaveAs Filename:=klasor & dosyaAdi, FileFormat:=dosyaFormati 'dosyaya kaydet .Close 'dosyayı kapat End With DoEvents 'bekleyen işleri yürüt Next Application.ScreenUpdating = True 'arkaplanda çalışma iptal MsgBox klasor & " klasöründe" & vbCr & dosyaNo & " adet dosya oluşturuldu.", vbInformation, "İşlem Tamam!" 'Bitti! End Sub
Soru 8
sep=,
Sub SatirlariDosyalaraAktar_v8() 'makro: Mesut Akcan '13/12/2022 'http://mesutakcan.blogspot.com 'Excel sayfasındaki verileri istenilen satır sayısı kadar dosyalara böler 'Başlık satırı varsa bölünen dosyalara başlık ekler '-yeni: CSV dosya noktalı virgülle ayırılarak kaydedilir. Dim satirSayisi As Long Dim dosyaNo As Integer, n As Long, bs As Long, bsvar Dim klasor As String, satirlar As String, dosyaAdi As String Dim wb As Workbook, wbs As Worksheet Dim dosyaFormati As XlFileFormat 'dosya formatları: 'https://docs.microsoft.com/tr-tr/office/vba/api/excel.xlfileformat dosyaFormati = xlCSV 'excel CSV dosya formatı Const noktaliVirgul = True 'Veriler noktalı virgül ile ayrılır 'Verilerin virgül ile ayrılması için True yerine False değerini verin satirSayisi = Val(InputBox("Dosyalara bölünecek satır sayısını giriniz:", , 100)) If satirSayisi < 1 Then MsgBox "Satır sayısı 1 veya daha büyük olmalı!" Exit Sub End If klasor = InputBox("Dosyaların kaydedileceği klasör:", , ActiveWorkbook.Path) 'kayıt klasörü If Right(klasor, 1) <> "\" Then klasor = klasor & "\" 'sonda \ yoksa ekle bsvar = MsgBox("Başlık satırı var mı?", vbYesNo) If bsvar = vbYes Then bs = 2 Else bs = 1 'başlık satırı varsa başlama satırı 2 Set wbs = ThisWorkbook.ActiveSheet 'makronun olduğu dosyanın aktif sayfası Application.ScreenUpdating = False 'arkaplanda çalış For n = bs To wbs.Cells.SpecialCells(xlLastCell).Row Step satirSayisi satirlar = Trim(Str(n)) & ":" & Trim(Str(n + satirSayisi - 1)) 'satır bölümleri: 2:101 gibi If bsvar = vbYes Then satirlar = "1:1," & satirlar 'başlık satırı varsa 1:1, eklenecek, 1:1,2:101 gibi wbs.Range(satirlar).Copy 'satırları kopyala dosyaNo = dosyaNo + 1 'dosya numarası dosyaAdi = "Dosya_" & Format(dosyaNo, "000") 'dosya adını biçimlendir. Dosya_001 gibi Set wb = Workbooks.Add 'yeni dosya aç With wb .Sheets(1).Paste 'dosyaya yapıştır 'dosyaya kaydet .SaveAs Filename:=klasor & dosyaAdi, FileFormat:=dosyaFormati, Local:=noktaliVirgul .Close 'dosyayı kapat End With DoEvents 'bekleyen işleri yürüt Next Application.ScreenUpdating = True 'arkaplanda çalışma iptal MsgBox klasor & " klasöründe" & vbCr & dosyaNo & " adet dosya oluşturuldu.", vbInformation, "İşlem Tamam!" 'Bitti! End Sub
Elinize sağlık çok güzel bir çalışma olmuş, pek çok kişinin taleplerini de kabul etmiş işlemişsiniz, bugün ihtiyacım oldu ararken buldum çok işimize yaradı, emeğinize sağlık dua aldınız
YanıtlaSilMesajınız ve duanız için teşekkür ederim.
Sil