VBA Bölme İşlevi - Metin Dizesini Diziye Böl

VBA Bölme İşlevini Kullanma

VBA Böl işlevi, bileşen parçalarını, her bileşenin belirli bir sınırlayıcı karakter kullandığı standart bir metin dizesinden ayırmanıza olanak tanır; virgül veya iki nokta üst üste. Dizedeki sınırlayıcıları aramak için kod yazmaktan ve ardından değerleri çıkarmaktan daha kolaydır.

Virgülle Ayrılmış Değerden (CSV dosyası) bir satırda okuyorsanız veya tümü tek satırda olan bir posta adresiniz varsa, ancak bunu birden çok satır olarak görmek istiyorsanız kullanılabilir.

Sözdizimi:

1 Bölünmüş ifade, sınırlayıcı[isteğe bağlı], sınır[isteğe bağlı], karşılaştır[isteğe bağlı]

VBA Split işlevinin dört parametresi vardır:

  • İfade - Farklı parçalara bölmek istediğiniz metin dizisi.
  • sınırlayıcı (isteğe bağlı)- dize veya yazdırılamayan karakter - Bölme için kullanılacak sınırlayıcı karakteri tanımlar. Sınırlayıcı karakter sağlanmazsa, varsayılan boşluk kullanılır.
  • sınır (isteğe bağlı) - sayı - Kaç bölme yapılacağını tanımlar. Boşsa, dize içinde mevcut tüm bölmeler yapılacaktır. 1 olarak ayarlanırsa, bölme yapılmayacaktır. Temel olarak, dizenin başlangıcından başlayarak belirli sayıda değeri ayırmanıza olanak tanır; dize çok uzun ve sadece ilk üç bölmeye ihtiyacınız var.
  • Karşılaştırmak (isteğe bağlı) - Sınırlayıcınız bir metin karakteriyse, bu, sınırlayıcının büyük/küçük harfe duyarlı olup olmadığını değiştirmek için kullanılır. Değerler vbBinaryCompare (büyük/küçük harf duyarlı) ve vbTextCompare'dir (büyük/küçük harf duyarlı değildir).

split işlevi her zaman bir dizi döndürür.

Bölme İşlevinin Basit Örneği

123456789101112 Alt SplitÖrnek()'Değişkenleri tanımlayınDim MyArray() As String, MyString As String, I As Variant'Boşluk sınırlayıcılı örnek dizeMyString = "Bir İki Üç Dört"'Dizenin bileşen parçalarını bölmek için Böl işlevini kullanınMyArray = Böl(MyString)'her değeri göstermek için oluşturulan diziyi yineleyinMyArray'deki Her I İçinMesaj Kutusu Isonraki benAlt Bitiş

Bu örnekte, tüm sözcüklerin arasında boşluk olduğundan, sınırlayıcı belirtilmemiştir, bu nedenle varsayılan sınırlayıcı (boşluk) kullanılabilir.

Dizinin boyutu yoktur ve bir dize olarak ayarlanır. For… Next döngüsünde kullanılan I değişkeni bir varyant olarak boyutlandırılmalıdır.

Bu kod çalıştırıldığında, bölmelerin her biri için bir tane olmak üzere dört mesaj kutusu gösterecektir; Bir, iki, üç. Dört.

Dizedeki kelimeler arasında çift boşluk varsa, bunun içinde hiçbir şey olmamasına rağmen bölme olarak değerlendirileceğini unutmayın. Bu, görmek istediğiniz sonuç olmayabilir.

Herhangi bir çift boşluğu tek bir boşlukla değiştirmek için Değiştir işlevini kullanarak bu sorunu çözebilirsiniz:

1 MyString = Değiştir(MyString, " ", " ")

Sondaki veya önde gelen boşluk da boş bir bölme oluşturarak sorunlara neden olabilir. Bunları görmek genellikle çok zordur. Bu gereksiz boşlukları Kırp işlevini kullanarak kaldırabilirsiniz:

1 MyString = Kırp(MyString)

Ayırıcı Karakterle Bölme İşlevini Kullanma

Noktalı virgül (;) sınırlayıcı kullanabiliriz. Bu, adresleri ayırmak için sıklıkla e-posta adresi dizelerinde bulunur. Size birçok meslektaşınızla paylaşılan bir e-posta gönderilmiş olabilir ve bu e-postanın kime gittiğine dair çalışma sayfanızda bir liste görmek isteyebilirsiniz. E-posta adreslerini "Kime" veya "Kopyala" kutularından kodunuza kolayca kopyalayabilirsiniz.

123456789101112131415 Sub SplitBySemicolonExample()'Değişkenleri tanımlayınDim MyArray() As String, MyString As String, I As Variant, N As Integer'Noktalı virgül sınırlayıcılı örnek dizeMyString = "[email protected];[email protected];[email protected];[email protected]"'Dizenin bileşen parçalarını bölmek için Böl işlevini kullanınMyArray = Böl(MyString, ";")'Çalışma sayfasını temizleActiveSheet.UsedRange.Clear'dizi boyunca yineleN = 0 için UBound(MyArray)'Her e-posta adresini çalışma sayfasının ilk sütununa yerleştirinAralık("A" & N + 1).Value = MyArray(N)Sonraki NAlt Bitiş

For… Next döngüsünün diziyi yinelemek için kullanıldığını unutmayın. Dizideki ilk eleman her zaman sıfırdan başlar ve maksimum eleman sayısını elde etmek için Üst Sınır işlevi kullanılır.

Bu kodu çalıştırdıktan sonra çalışma sayfanız şöyle görünecektir:

Bir Bölme İşlevinde Bir Sınır Parametresi Kullanma

Limit parametresi, dizenin başlangıcından itibaren belirli sayıda bölmenin yapılmasına izin verir. Ne yazık ki, bir başlangıç ​​pozisyonu veya yapılacak bir dizi bölme sağlayamazsınız, bu nedenle oldukça basittir. Bunu yapmak için bir işlev oluşturmak için kendi VBA kodunuzu oluşturabilirsiniz ve bu, bu makalenin ilerleyen bölümlerinde açıklanacaktır.

123456789101112131415 Sub SplitWithLimitExample()'Değişkenler oluşturDim MyArray() As String, MyString As String, I As Variant, N As Integer'Virgül sınırlayıcılı örnek dizeMyString = "Bir,İki,Üç,Dört,Beş,Altı"'Dizenin bileşen parçalarını bölmek için Böl işlevini kullanınMyArray = Böl(MyString, ",", 4)'Çalışma sayfasını temizleActiveSheet.UsedRange.Clear'Dizi boyunca yinelemeN = 0 için UBound(MyArray)'Her bölmeyi çalışma sayfasının ilk sütununa yerleştirinAralık("A" & N + 1).Value = MyArray(N)Sonraki NAlt Bitiş

Bu kodu çalıştırdıktan sonra çalışma sayfanız şöyle görünecektir:

Yalnızca ilk üç bölünmüş değer ayrı olarak gösterilir. Sonraki üç değer tek bir uzun dize olarak gösterilir ve bölünmez.

Bir dize içindeki sınırlayıcı sayısından daha büyük bir sınır değeri seçerseniz, bu bir hata oluşturmaz. Dize, sınır değeri sağlanmamış gibi tüm bileşen parçalarına bölünecektir.

Bir Bölme İşlevinde Karşılaştırma Parametresini Kullanma

Karşılaştırma parametresi, sınırlayıcının büyük/küçük harfe duyarlı olup olmadığını belirler. Sınırlayıcılar virgül, noktalı virgül veya iki nokta üst üste ise bu geçerli değildir.

Not: Bunun yerine, tüm modül için büyük/küçük harf duyarlılığını ortadan kaldırmak için her zaman Option Compare Text <> öğesini modülünüzün en üstüne yerleştirebilirsiniz.

123456789101112131415 Sub SplitByCompareExample()'Değişkenler oluşturDim MyArray() As String, MyString As String, I As Variant, N As Integer'X sınırlayıcılı örnek dizeMyString = "OneXTwoXThreexFourXFivexSix"'Dizenin bileşen parçalarını bölmek için Böl işlevini kullanınMyArray = Böl(MyString, "X", , vbBinaryCompare)'Çalışma sayfasını temizleActiveSheet.UsedRange.Clear'dizi boyunca yineleN = 0 için UBound(MyArray)'Her bölmeyi çalışma sayfasının ilk sütununa yerleştirinAralık("A" & N + 1).Value = MyArray(N)Sonraki NAlt Bitiş

Bu örnekte, bölünecek dize, sınırlayıcı olarak 'X' karakterini kullanır. Ancak bu dizgede büyük ve küçük harf 'X' karakterlerinin bir karışımı vardır. Böl işlevindeki Karşılaştır parametresi, büyük bir 'X' karakteri kullanır.

Karşılaştırma parametresi vbBinaryCompare olarak ayarlanırsa, küçük harfli 'x' karakterleri yok sayılır ve çalışma sayfanız şöyle görünür:

Karşılaştırma parametresi vbTextCompare olarak ayarlanmışsa, bölmede küçük harf 'x' karakterleri kullanılacak ve çalışma sayfanız şöyle görünecektir:

Küçük bir 'x' karakteri içerdiğinden A6 hücresindeki değerin kesildiğini unutmayın. Bölme büyük/küçük harfe duyarlı olmadığından, bir alt dizenin parçasını oluşturan herhangi bir sınırlayıcı bölmenin gerçekleşmesine neden olur.

Bu, metin sınırlayıcı ve vbTextCompare kullanırken akılda tutulması gereken önemli bir noktadır. Kolayca yanlış sonuca varabilirsiniz.

Ayırıcı Karakter Olarak Yazdırılamayan Karakterleri Kullanma

Ayırıcı olarak satır başı (satır sonu) gibi yazdırılamayan karakterleri kullanabilirsiniz.

Burada bir satır başı belirtmek için vbCr kullanıyoruz <>

123456789101112131415 Sub SplitByNonPrintableExample()'Değişkenler oluşturDim MyArray() As String, MyString As String, I As Variant, N As Integer'Satır başı sınırlayıcıları olan örnek dizeMyString = "Bir" & vbCr & "İki" & vbCr & "Üç" & vbCr & "Dört" & vbCr & "Beş" & vbCr & "Altı"'Dizenin bileşen parçalarını bölmek için Böl işlevini kullanınMyArray = Böl(MyString, vbCr, , vbTextCompare)'Çalışma sayfasını temizleActiveSheet.UsedRange.Clear'Dizi boyunca yinelemeN = 0 için UBound(MyArray)'Her bölmeyi çalışma sayfasının ilk sütununa yerleştirinAralık("A" & N + 1).Value = MyArray(N)Sonraki NAlt Bitiş

Bu örnekte, sınırlayıcı olarak vbCr (satır başı karakteri) kullanılarak bir dize oluşturulur.

Bu kod çalıştırıldığında çalışma sayfanız şöyle görünecektir:

Bir Bölmeyi Tersine Çevirmek için Birleştirme İşlevini Kullanma

Join işlevi, bir dizinin tüm öğelerini belirli bir sınırlayıcı kullanarak yeniden birleştirir. Sınırlayıcı karakter belirtilmezse boşluk kullanılır.

123456789101112131415 Alt JoinÖrnek()'Değişkenler oluşturDim MyArray() As String, MyString As String, I As Variant, N As IntegerDize Olarak Hedefi Karart'Virgül sınırlayıcılı örnek dizeMyString = "Bir,İki,Üç,Dört,Beş,Altı"'MyString'i A1 hücresine yerleştirinAralık("A1").Value = MyString'Dizenin bileşen parçalarını bölmek için Böl işlevini kullanınMyArray = Böl(MyString, ",")'Bir noktalı virgül sınırlayıcı kullanarak orijinal dizeyi yeniden oluşturmak için Join işlevini kullanınHedef = Katıl(MyArray";")'Sonuç dizesini A2 hücresine yerleştirinAralık ("A2"). Değer = HedefAlt Bitiş

Bu kod, virgül sınırlayıcıları olan bir dizeyi bir diziye böler ve noktalı virgül sınırlayıcıları kullanarak onu tekrar birleştirir.

Bu kodu çalıştırdıktan sonra çalışma sayfanız şöyle görünecektir:

A1 hücresinde virgül sınırlayıcılı orijinal dize bulunur ve A2 hücresinde noktalı virgül sınırlayıcılı yeni birleştirilmiş dize bulunur.

Kelime Sayımı yapmak için Bölme İşlevini Kullanma

Excel VBA'daki bir dize değişkeninin 2 Gb'ye kadar uzunlukta olabileceğini göz önünde bulundurarak, bir metin parçasında sözcük sayımı yapmak için bölme işlevini kullanabilirsiniz. Açıkçası, Microsoft Word bunu otomatik olarak yapar, ancak bu, basit bir metin dosyası veya başka bir uygulamadan kopyalanan metin için yararlı olabilir.

1234567891011121314 Alt NumberOfWordsÖrnek()'Değişkenler oluşturDim MyArray() As String, MyString As String'Boşluk sınırlayıcılı örnek dizeMyString = "Bir İki Üç Dört Beş Altı"'Çift boşlukları kaldırınMyString = Değiştir(MyString, " ", " ")'Öndeki veya sondaki boşlukları kaldırınMyString = Kırp(MyString)'Dizenin bileşen parçalarını bölmek için Böl işlevini kullanınMyArray = Böl(MyString)'UBound işlevini kullanarak kelime sayısını gösterMsgBox "Kelime Sayısı" & UBound(MyArray) + 1Alt Bitiş

Bu kelime sayma kodunun tehlikelerinden biri, çift boşluklar ve baştaki ve sondaki boşluklar tarafından atılacak olmasıdır. Bunlar varsa, bunlar fazladan kelimeler olarak sayılacak ve kelime sayısı hatalı olarak sonuçlanacaktır.

Kod, bu fazladan boşlukları kaldırmak için Değiştir ve Kırp işlevlerini kullanır.

Son kod satırı, dizinin maksimum eleman sayısını almak için UBound işlevi kullanılarak ve ardından 1 ile artırılarak bulunan sözcük sayısını görüntüler. Bunun nedeni, ilk dizi öğesinin sıfırdan başlamasıdır.

Bir Adresi Çalışma Sayfası Hücrelerine Bölme

Posta adresleri genellikle virgül sınırlayıcılı uzun metin dizeleridir. Adresin her bir bölümünü ayrı bir hücreye bölmek isteyebilirsiniz.

123456789101112131415 Alt AdresÖrnek()'Değişkenler oluşturDim MyArray() As String, MyString As String, N As Integer'Microsoft Corporation Adresi ile dize kurMyString = "Microsoft Corporation, One Microsoft Way, Redmond, WA 98052-6399 ABD"'Dizeyi virgül sınırlayıcı kullanarak bölmek için bölme işlevini kullanınMyArray = Böl(MyString, ",")'Çalışma sayfasını temizleActiveSheet.UsedRange.Clear'dizi boyunca yineleN = 0 için UBound(MyArray)'Her bölmeyi çalışma sayfasının ilk sütununa yerleştirinAralık("A" & N + 1).Value = MyArray(N)Sonraki NAlt Bitiş

Bu kodu çalıştırmak, adresin her satırını ayrı bir hücreye koymak için virgül sınırlayıcıyı kullanır:

Yalnızca posta kodunu (son dizi öğesi) döndürmek istiyorsanız, kodu kullanabilirsiniz:

123456789101112 Alt AdresZipCodeÖrnek()'Değişkenler oluşturDim MyArray() As String, MyString As String, N As Integer, Temp As String'Microsoft Corporation Adresi ile dize kurMyString = "Microsoft Corporation, One Microsoft Way, Redmond, WA 98052-6399 ABD"'Dizeyi virgül sınırlayıcı kullanarak bölmek için bölme işlevini kullanınMyArray = Böl(MyString, ",")'Çalışma sayfasını temizleActiveSheet.UsedRange.Clear'Posta Kodunu A1 hücresine koyAralık("A1").Value = MyArray(UBound(MyArray))Alt Bitiş

Bu, dizideki yalnızca UBound işlevi kullanılarak bulunan son öğeyi kullanır.

Öte yandan, bir adres etiketine yazdırılabilmesi için tüm satırları tek bir hücrede görmek isteyebilirsiniz:

1234567891011121314151617 Alt AdresÖrnek()'Değişkenler oluşturDim MyArray() As String, MyString As String, N As Integer, Temp As String'Microsoft Corporation Adresi ile dize kurMyString = "Microsoft Corporation, One Microsoft Way, Redmond, WA 98052-6399 ABD"'Dizeyi bir virgül sınırlayıcı kullanarak bölmek için bölme işlevini kullanınMyArray = Böl(MyString, ",")'Çalışma sayfasını temizleActiveSheet.UsedRange.Clear'dizi boyunca yineleN = 0 için UBound(MyArray)'her dizi öğesini artı bir satır besleme karakterini bir dizeye yerleştirinSıcaklık = Sıcaklık & MyArray(N) & vbLfSonraki N'Dizeyi çalışma sayfasına koyAralık("A1") = SıcaklıkAlt Bitiş

Bu örnek, tüm dizi öğelerinin geçici bir dizesini oluşturması, ancak her öğeden sonra bir satır besleme karakteri eklemesi dışında öncekiyle aynı şekilde çalışır.

Kod çalıştırıldıktan sonra çalışma sayfası aşağıdaki gibi görünecektir:

Dizeyi Çalışma Sayfası Hücrelerine Böl

Böl dizisini yalnızca bir komutla <> çalışma sayfası hücrelerine kopyalayabilirsiniz:

12345678910 Alt CopyToRange()'Değişkenler oluşturDim MyArray() As String, MyString As String'Boşluk sınırlayıcılı örnek dizeMyString = "Bir,İki,Üç,Dört,Beş,Altı"'Dizenin bileşen parçalarını bölmek için Böl işlevini kullanınMyArray = Böl(MyString, ",")'Diziyi çalışma sayfasına kopyalayınRange("A1:A" & UBound(MyArray) + 1).Value = WorksheetFunction.Transpose(MyArray)Alt Bitiş

Bu kod çalıştırıldığında, çalışma sayfanız şöyle görünecektir:

Belirli Bir Noktadan Bölmeye İzin Verecek Yeni Bir İşlev Oluşturma

Bölme işlevindeki Sınır parametresi, yalnızca bölmenin durmasını istediğiniz yerde bir üst sınır belirlemenize izin verir. Her zaman dizenin başlangıcından başlar.

Dize içinde bölmenin başlangıç ​​noktasını ve o noktadan itibaren görmek istediğiniz bölme sayısını belirleyebileceğiniz benzer bir işleve sahip olmak çok faydalı olacaktır. Ayrıca, dizideki son öğe olarak çok büyük bir dize değerine sahip olmak yerine, yalnızca diziye belirttiğiniz bölmeleri ayıklar.

Bunu yapmak için VBA'da kolayca bir işlev (SplitSlicer olarak adlandırılır) oluşturabilirsiniz:

123456789101112131415161718192021222324 Function SplitSlicer(Dize Olarak Hedef, Dize Olarak Del, Tamsayı Olarak Başla, Tamsayı Olarak N)'Dizi değişkeni oluşturDim MyArray() Dize Olarak'Sınırlayıcı karakteri kullanarak başlangıç ​​değişkenini kullanarak bölmeyi yakalayınMyArray = Böl(Hedef, Del, Başlat)'Başlangıç ​​parametresinin bölme sayısından büyük olup olmadığını kontrol edin - bu sorunlara neden olabilirBaşlat > UBound(MyArray) + 1 ise'Hatayı göster ve fonksiyondan çıkMsgBox "Başlangıç ​​parametresi mevcut bölme sayısından fazla"SplitSlicer = MyArrayÇıkış FonksiyonuBitir'Son dizi öğesini dizeye koyunHedef = MyArray(UBound(MyArray))'Sınır olarak N kullanarak dizeyi bölünMyArray = Böl(Hedef, Del, N)'Kod son öğeyi kaldırdığı için üst sınırın sıfırdan büyük olduğunu kontrol edinUBound(MyArray) > 0 ise'Dizin son öğesini kaldırmak için ReDim'i kullanınReDim MyArray'i Koru(UBound(MyArray) - 1)Bitir'Yeni diziyi döndürSplitSlicer = MyArrayBitiş İşlevi

Bu fonksiyon dört parametre ile oluşturulmuştur:

  • Hedef - dize - bu, bölmek istediğiniz giriş dizesidir
  • del - dize veya yazdırılamayan karakter - bu, kullandığınız sınırlayıcı karakterdir, ör. virgül, kolon
  • Başlangıç - sayı - bu, diliminizin başlangıç ​​bölümüdür
  • n - sayı - bu, diliminizde yapmak istediğiniz bölmelerin sayısıdır.

Bu parametrelerin hiçbiri isteğe bağlı değildir veya varsayılan değerlere sahip değildir, ancak daha fazla genişletmek isterseniz bunu işlevin kodunda çalıştırabilirsiniz.

İşlev, Limit olarak Start parametresini kullanarak bir dizi oluşturmak için Split işlevini kullanır. Bu, dizi öğelerinin başlangıç ​​parametresine kadar olan bölmeleri tutacağı, ancak dizenin geri kalanının son öğe olacağı ve bölünmeyeceği anlamına gelir.

Dizideki son eleman, bunun hangi eleman olduğunu belirlemek için UBound işlevi kullanılarak bir dizgeye geri aktarılır.

Dize daha sonra limit değişkeni olarak N kullanılarak tekrar diziye bölünür. Bu, dize için N konumuna kadar bölmelerin yapılacağı ve ardından dizenin geri kalanının dizideki son öğeyi oluşturacağı anlamına gelir.

ReDim ifadesi, dizide yalnızca belirli öğelerin kalmasını istediğimiz için son öğeyi kaldırmak için kullanılır. Preserve parametresinin kullanıldığını unutmayın, aksi takdirde dizideki tüm veriler kaybolacaktır.

Yeni dizi daha sonra çağrıldığı koda döndürülür.

Kodun "hata korumalı" olduğunu unutmayın. Kullanıcılar genellikle düşünmediğiniz garip şeyler yapacaktır. Örneğin, işlevi, dizedeki mevcut bölme sayısından daha fazla Başlat veya N parametresiyle kullanmayı denerlerse, bu, işlevin başarısız olmasına neden olabilir.

Başlangıç ​​değerini kontrol etmek ve ayrıca dizide ReDim ifadesi kullanıldığında kaldırılabilecek bir öğe olduğundan emin olmak için kod eklenmiştir.

İşte işlevi test etmek için kod:

123456789101112 Alt TestSplitSlicer()'Değişkenler oluşturDim MyArray() As String, MyString As String'Virgül sınırlayıcılarla örnek dize tanımlayınMyString = "Bir,İki,Üç,Dört,Beş,Altı,Yedi,Sekiz,Dokuz,On"'Yeni diziyi tanımlamak için Splitslicer işlevini kullanınMyArray = SplitSlicer(MyString, ",", 4, 3)'Etkin sayfayı temizleActiveSheet.UsedRange.Clear'Diziyi çalışma sayfasına kopyalayınRange("A1:A" & UBound(MyArray) + 1).Value = WorksheetFunction.Transpose(MyArray)Alt Bitiş

Bu kodu çalıştırın ve çalışma sayfanız şöyle görünecektir:

Arkadaşlarınızla sayfasını paylaşan sitenin gelişimine yardımcı olacak

wave wave wave wave wave