Özellik ikonu

Mid

İndirme izni yok

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.

Söz dizimi​

İşlevin genel biçimi şöyledir:
VBA
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:
VBA
Mid(stringvar, start, [length]) = yeniMetin
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.

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.
ABCD
1Ürün KoduKategoriYılSıra No
2KDN-2024-017KDN2024017
3TLF-2023-102TLF2023102
4BLG-2024-005BLG2024005
5YZC-2022-340YZC2022340
6MNT-2023-088MNT2023088
7KLV-2024-251KLV2024251
Ürün KodlarıExcelDepo v1.0.0
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.

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.
ABC
1E-postaKullanıcıAlan Adı
2ayse.yilmaz@ozkan.com.trayse.yilmazozkan.com.tr
3can.ozturk@anadolu.comcan.ozturkanadolu.com
4elif.kaya@marmara.orgelif.kayamarmara.org
5mehmet.demir.ornek.comGeçersiz
6zeynep.arslan@ege.netzeynep.arslanege.net
7burak.sahin@akdeniz.com.trburak.sahinakdeniz.com.tr
E-posta ListesiExcelDepo v1.0.0
İ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.

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.
AB
1Eski AdYeni Ad
2Satis_2023_OcakSatis_2024_Ocak
3Stok_2023_SubatStok_2024_Subat
4Maliyet_2023_MartMaliyet_2024_Mart
5Rapor_NisanRapor_Nisan
6Butce_2023_MayisButce_2024_Mayis
Dosya AdlarıExcelDepo v1.0.0
İ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ı.

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.
Örneklerdeki makroların tamamı indirilebilir Excel dosyasındadır (.xlsm). Dosyayı açtıktan sonra makroları etkinleştirin, ardından Alt + F11 ile Visual Basic Düzenleyicisi'nde kodları inceleyebilir ve Alt + F8 ile çalıştırabilirsiniz.
Yazar
ExcelDepo
İndirme sayısı
0
Gösterim
13
İlk yayın
Güncel

Puanlar

0.00 Oylama 0 İnceleme
Geri
Üst