Genel Bakış
Mid (Mid function), bir metin içinde belirttiğiniz karakter konumundan başlayarak istediğiniz sayıda karakteri döndüren VBA işlevidir. Kod, ürün numarası, e-posta ya da dosya adı gibi belirli bir düzene sahip metinlerin içinden parça ayıklamak için kullanılır. Aynı ad, metnin bir bölümünü değiştiren Mid deyimi olarak da kullanılır.
İşlev, Çalışma sayfasındaki ORTA (MID) işlevinin VBA karşılığıdır. Fark olarak VBA'da length parametresi isteğe bağlıdır; sayfa işlevinde ise üç bağımsız değişkenin hepsi zorunludur.
Bu deyim metnin toplam uzunluğunu değiştirmez. Yeni metin length değerinden uzunsa fazla kısım kesilir, kısaysa yalnızca onun uzunluğu kadar karakter değiştirilir. Değişken ya da çalışma sayfası hücresi doğrudan kullanılamaz; önce metin bir String değişkene alınmalıdır.
Makro ilk koddan kategori olarak KDN, yıl olarak 2024 ve sıra numarası olarak 017 değerini ayırdı. Üçüncü çağrıda length verilmediği için sıra numarası metnin sonuna kadar alındı; sütun metin biçimine çevrildiğinden baştaki sıfırlar korunur.
İlk adreste kullanıcı adı olarak ayse.yilmaz, alan adı olarak ozkan.com.tr alındı. Dördüncü adreste @ işareti bulunmadığı için B5 hücresine Geçersiz yazıldı ve Mid hiç çağrılmadı; böylece p - 1 ifadesinin negatif uzunluk üretip hata vermesi önlendi.
İlk ad Satis_2024_Ocak olarak güncellendi; Mid deyimi metnin uzunluğunu değiştirmeden yalnızca yıl bölümünün üzerine yazdı. Yılı bulunmayan dördüncü ad ise Rapor_Nisan biçiminde değişmeden kaldı.
Söz dizimi
İşlevin genel biçimi şöyledir:Mid(string, start, [length])
- string: Karakterlerin alınacağı metin; zorunludur. Bu değer Null ise işlev de Null döndürür.
- start: Alınacak ilk karakterin konumu; zorunludur. Sayım 1'den başlar. Değer metnin uzunluğundan büyükse işlev boş metin ("") döndürür, 1'den küçükse 5 numaralı hata (Invalid procedure call or argument) oluşur.
- length: Alınacak karakter sayısı; isteğe bağlıdır. Belirtilmezse ya da kalan karakter sayısından büyükse start konumundan metnin sonuna kadar olan bölüm alınır. 0 verilirse boş metin döner, negatif değer hata verir.
Dönüş değeri ve benzer biçimler
Mid işlevi Variant türünde bir metin döndürür. Sonucu doğrudan String olarak almak isterseniz Mid$ biçimini kullanabilirsiniz; ancak bu biçim Null değeri ile hata verir. MidB ise karakter yerine bayt sayarak çalışır ve çoğu zaman gerekmez.İşlev, Çalışma sayfasındaki ORTA (MID) işlevinin VBA karşılığıdır. Fark olarak VBA'da length parametresi isteğe bağlıdır; sayfa işlevinde ise üç bağımsız değişkenin hepsi zorunludur.
Mid deyimi ile metni değiştirme
Mid atama işleminin sol tarafında kullanıldığında bir metin değişkeninin belirli bölümünü yenisiyle değiştirir:Mid(stringvar, start, [length]) = yeniMetin
InStr ile birlikte kullanım
Ayıklanacak bölümün konumu değişkense InStr işleviyle belirli bir karakterin yeri bulunur ve sonuç Mid işlevine start ya da length olarak verilir. Örneğin e-posta adresinde @ işaretinin konumunu bulup kullanıcı adını ve alan adını ayırabilirsiniz. Karakter metinde yoksa InStr 0 döndürür; bu durumu If ile denetlemezseniz Mid hata verebilir.1. Ürün kodunu parçalara ayırma
Kodlar KDN-2024-017 düzeninde: ilk üç karakter kategori, 5. konumdan başlayan dört karakter yıl, 10. konumdan sonrası sıra numarasıdır. Kodu standart modüle yapıştırın ve KodAyir makrosunu çalıştırın.
VBA
18 satır
Option Explicit
Sub KodAyir()
Dim ws As Worksheet
Dim i As Long
Dim kod As String
Set ws = ActiveSheet
' Sıra no sütunu metin olsun, baştaki sıfırlar kaybolmasın
ws.Range("D2:D7").NumberFormat = "@"
For i = 2 To 7
kod = ws.Cells(i, 1).Value
ws.Cells(i, 2).Value = Mid(kod, 1, 3) ' kategori
ws.Cells(i, 3).Value = CLng(Mid(kod, 5, 4)) ' yıl
ws.Cells(i, 4).Value = Mid(kod, 10) ' length yok: sona kadar
Next i
End Sub
Mid
Formülünü incelemek için bir hücre seçin.| A | B | C | D | |
|---|---|---|---|---|
| 1 | Ürün Kodu | Kategori | Yıl | Sıra No |
| 2 | KDN-2024-017 | KDN | 2024 | 017 |
| 3 | TLF-2023-102 | TLF | 2023 | 102 |
| 4 | BLG-2024-005 | BLG | 2024 | 005 |
| 5 | YZC-2022-340 | YZC | 2022 | 340 |
| 6 | MNT-2023-088 | MNT | 2023 | 088 |
| 7 | KLV-2024-251 | KLV | 2024 | 251 |
Ürün KodlarıExcelDepo v1.0.0
2. E-posta adresinden kullanıcı ve alan adı ayıklama
Adreslerde @ işaretinin yeri değiştiği için InStr ile konumu bulunur, Mid ile iki parça ayrılır. @ işareti olmayan adres geçersiz sayılır. Kodu standart modüle yapıştırın ve MailAyir makrosunu çalıştırın.
VBA
22 satır
Option Explicit
Sub MailAyir()
Dim ws As Worksheet
Dim i As Long
Dim p As Long
Dim mail As String
Set ws = ActiveSheet
For i = 2 To 7
mail = ws.Cells(i, 1).Value
p = InStr(mail, "@") ' @ işaretinin konumu, yoksa 0
If p > 0 Then
ws.Cells(i, 2).Value = Mid(mail, 1, p - 1) ' kullanıcı adı
ws.Cells(i, 3).Value = Mid(mail, p + 1) ' alan adı
Else
ws.Cells(i, 2).Value = "Geçersiz"
End If
Next i
End Sub
Mid
Formülünü incelemek için bir hücre seçin.| A | B | C | |
|---|---|---|---|
| 1 | E-posta | Kullanıcı | Alan Adı |
| 2 | ayse.yilmaz@ozkan.com.tr | ayse.yilmaz | ozkan.com.tr |
| 3 | can.ozturk@anadolu.com | can.ozturk | anadolu.com |
| 4 | elif.kaya@marmara.org | elif.kaya | marmara.org |
| 5 | mehmet.demir.ornek.com | Geçersiz | |
| 6 | zeynep.arslan@ege.net | zeynep.arslan | ege.net |
| 7 | burak.sahin@akdeniz.com.tr | burak.sahin | akdeniz.com.tr |
E-posta ListesiExcelDepo v1.0.0
3. Mid deyimi ile metnin bir bölümünü değiştirme
Dosya adlarındaki 2023 yılı 2024 olarak güncellenecek. Yıl ifadesinin yeri InStr ile bulunur ve Mid deyimi tam dört karakteri değiştirir. Yılı olmayan ad olduğu gibi kalır. Kodu standart modüle yapıştırın ve YilGuncelle makrosunu çalıştırın.
VBA
22 satır
Option Explicit
Sub YilGuncelle()
Dim ws As Worksheet
Dim i As Long
Dim p As Long
Dim ad As String
Set ws = ActiveSheet
For i = 2 To 6
ad = ws.Cells(i, 1).Value
p = InStr(ad, "2023")
If p > 0 Then
' Mid deyimi: p konumundaki 4 karakteri değiştirir
Mid(ad, p, 4) = "2024"
End If
ws.Cells(i, 2).Value = ad
Next i
End Sub
Mid
Formülünü incelemek için bir hücre seçin.| A | B | |
|---|---|---|
| 1 | Eski Ad | Yeni Ad |
| 2 | Satis_2023_Ocak | Satis_2024_Ocak |
| 3 | Stok_2023_Subat | Stok_2024_Subat |
| 4 | Maliyet_2023_Mart | Maliyet_2024_Mart |
| 5 | Rapor_Nisan | Rapor_Nisan |
| 6 | Butce_2023_Mayis | Butce_2024_Mayis |
Dosya AdlarıExcelDepo v1.0.0
Kullanırken dikkat edin
- Başlangıç konumu 1'dir: Mid işlevinde ilk karakterin konumu 1'dir, 0 değildir. start için 0 ya da negatif değer vermek 5 numaralı hataya yol açar. Konumu InStr ile hesaplıyorsanız sonucun 0 olabileceğini unutmayın.
- Negatif uzunluk hata verir: length değerini p - 1 gibi bir hesapla üretiyorsanız sonucun negatif olmadığından emin olun. Negatif uzunluk Hata 5 üretir; 0 ise boş metin döndürür.
- Sayı gibi görünen parçalar metindir: Mid her zaman metin döndürür. Sonucu hesapta kullanacaksanız CLng, CDbl ya da Val ile sayıya çevirin. Baştaki sıfırları korumak istiyorsanız hedef hücreyi önce metin biçimine alın.
- Mid deyimi uzunluğu değiştirmez: Mid deyimi ile yapılan atamada yeni metin length değerinden uzunsa fazlası atılır; metni uzatmak ya da kısaltmak için Replace işlevini ya da birleştirme işlemini kullanın. Mid deyimi yalnızca String değişkenlerle çalışır, doğrudan hücre değerine uygulanmaz.
- Null değerlerde dikkat: Veritabanından ya da Variant değişkenden gelen Null değeri Mid işlevine verilirse sonuç Null olur ve bunu String değişkene atamak hata verir. Mid$ biçimi ise Null ile hemen hata üretir. Gerekirse önce IsNull ile denetleyin.
- İlgili konular:
- Left ve Right: Metnin başından ya da sonundan karakter alan VBA işlevleri.
- InStr ve InStrRev: Bir metnin içinde başka bir metnin konumunu bulur.
- Len: Metnin karakter sayısını verir.
- Replace: Metin içindeki ifadeleri başka bir ifadeyle değiştirir.
- Split: Metni ayırıcıya göre dizi öğelerine böler.
- ORTA, SOLDAN, SAĞDAN, UZUNLUK, MBUL, BUL: Aynı işi çalışma sayfasında yapan işlevler.