Ayrı ayrı
' AL Fonksiyonu Benzeri
Function UDF_AL(hücre As Range) As String
UDF_AL = hücre.Address(False, False)
End Function
' ARALIKBİRLEŞTİR Fonksiyonu Benzeri
Function UDF_ARALIKBİRLEŞTİR(ayraç As String, yokSayBoş As Boolean, ParamArray aralıklar() As Variant) As String
Dim Sonuc As String
Dim Alan As Variant
Dim Hücre As Range
Sonuc = ""
For Each Alan In aralıklar
If TypeOf Alan Is Range Then
For Each Hücre In Alan
If Not yokSayBoş Or Hücre.Value <> "" Then
If Sonuc <> "" Then Sonuc = Sonuc & ayraç
Sonuc = Sonuc & Hücre.Value
End If
Next Hücre
ElseIf Not yokSayBoş Or Alan <> "" Then
If Sonuc <> "" Then Sonuc = Sonuc & ayraç
Sonuc = Sonuc & Alan
End If
Next Alan
UDF_ARALIKBİRLEŞTİR = Sonuc
End Function
' BENZERSİZ Fonksiyonu Benzeri
Function UDF_BENZERSİZ(aralık As Range) As Variant
Dim Koleksiyon As New Collection
Dim Hücre As Range
Dim Anahtar As String
Dim SonuçDizisi() As Variant
Dim i As Long
On Error Resume Next
For Each Hücre In aralık
Anahtar = CStr(Hücre.Value)
Koleksiyon.Add Hücre.Value, Anahtar
Next Hücre
On Error GoTo 0
ReDim SonuçDizisi(1 To Koleksiyon.Count, 1 To 1)
i = 1
For Each Anahtar In Koleksiyon
SonuçDizisi(i, 1) = Koleksiyon(Anahtar)
i = i + 1
Next Anahtar
UDF_BENZERSİZ = SonuçDizisi
End Function
' ÇAPRAZARA Fonksiyonu Benzeri (Basit Yaklaşım - Tam işlevsellik için daha karmaşık bir UDF gerekebilir)
Function UDF_ÇAPRAZARA(satır_dizisi As Range, sütun_dizisi As Range, veri_dizisi As Range, satır_eşleşme As Variant, sütun_eşleşme As Variant, [yoksa_değer]) As Variant
Dim r As Long, c As Long
Dim satırBulundu As Boolean, sütunBulundu As Boolean
Dim sonuç As Variant
sonuç = yoksa_değer
For r = 1 To satır_dizisi.Rows.Count
If satır_dizisi.Cells(r, 1).Value = satır_eşleşme Then
satırBulundu = True
Exit For
End If
Next r
For c = 1 To sütun_dizisi.Columns.Count
If sütun_dizisi.Cells(1, c).Value = sütun_eşleşme Then
sütunBulundu = True
Exit For
End If
Next c
If satırBulundu And sütunBulundu Then
If r <= veri_dizisi.Rows.Count And c <= veri_dizisi.Columns.Count Then
sonuç = veri_dizisi.Cells(r, c).Value
End If
End If
UDF_ÇAPRAZARA = sonuç
End Function
' ÇAPRAZEŞLEŞTİR Fonksiyonu Benzeri (Basit Yaklaşım - Tam işlevsellik için daha karmaşık bir UDF gerekebilir)
Function UDF_ÇAPRAZEŞLEŞTİR(satır_eşleşme_değeri As Variant, satır_dizisi As Range, sütun_eşleşme_değeri As Variant, sütun_dizisi As Range, [eşleşme_türü_satır], [eşleşme_türü_sütun], [yoksa_değer]) As Variant
Dim satır_konumu As Variant
Dim sütun_konumu As Variant
satır_konumu = Application.Match(satır_eşleşme_değeri, satır_dizisi, IIf(IsMissing(eşleşme_türü_satır), 0, eşleşme_türü_satır))
sütun_konumu = Application.Match(sütun_eşleşme_değeri, sütun_dizisi, IIf(IsMissing(eşleşme_türü_sütun), 0, eşleşme_türü_sütun))
If IsError(satır_konumu) Or IsError(sütun_konumu) Then
UDF_ÇAPRAZEŞLEŞTİR = IIf(IsMissing(yoksa_değer), CVErr(xlErrNA), yoksa_değer)
Else
UDF_ÇAPRAZEŞLEŞTİR = Array(satır_konumu, sütun_konumu)
End If
End Function
' ÇOKEĞER Fonksiyonu Benzeri
Function UDF_ÇOKEĞER(ParamArray koşullar() As Variant) As Variant
Dim i As Long
If UBound(koşullar) Mod 2 <> 1 Then
UDF_ÇOKEĞER = CVErr(xlErrNA) ' Yanlış sayıda argüman
Exit Function
End If
For i = LBound(koşullar) To UBound(koşullar) Step 2
If koşullar(i) Then
UDF_ÇOKEĞER = koşullar(i + 1)
Exit Function
End If
Next i
' Eşleşme bulunamazsa (aksi belirtilmediyse) HATA döndürür
UDF_ÇOKEĞER = CVErr(xlErrNA)
End Function
' DEĞERMETİN Fonksiyonu Benzeri
Function UDF_DEĞERMETİN(değer As Variant, [biçim_metni]) As String
If IsMissing(biçim_metni) Then
UDF_DEĞERMETİN = CStr(değer)
Else
UDF_DEĞERMETİN = Format(değer, biçim_metni)
End If
End Function
' DÜŞEYYIĞ Fonksiyonu Benzeri
Function UDF_DÜŞEYYIĞ(ParamArray aralıklar() As Variant) As Variant
Dim SonuçDizisi() As Variant
Dim Alan As Variant
Dim Hücre As Range
Dim ToplamSatır As Long
Dim SütunSayısı As Long
Dim MevcutSatır As Long
Dim i As Long, j As Long
' Toplam satır sayısını ve sütun sayısını hesapla
For Each Alan In aralıklar
If TypeOf Alan Is Range Then
ToplamSatır = ToplamSatır + Alan.Rows.Count
SütunSayısı = WorksheetFunction.Max(SütunSayısı, Alan.Columns.Count)
End If
Next Alan
If ToplamSatır = 0 Then Exit Function
ReDim SonuçDizisi(1 To ToplamSatır, 1 To SütunSayısı)
MevcutSatır = 1
For Each Alan In aralıklar
If TypeOf Alan Is Range Then
For i = 1 To Alan.Rows.Count
For j = 1 To Alan.Columns.Count
SonuçDizisi(MevcutSatır, j) = Alan.Cells(i, j).Value
Next j
MevcutSatır = MevcutSatır + 1
Next i
End If
Next Alan
UDF_DÜŞEYYIĞ = SonuçDizisi
End Function
' DİZİMETİN Fonksiyonu Benzeri
Function UDF_DİZİMETİN(dizi As Variant, [ayraç], [yoksay_boş]) As String
Dim Metinler As Collection
Dim Eleman As Variant
Dim Sonuc As String
Set Metinler = New Collection
On Error Resume Next
If IsArray(dizi) Then
For Each Eleman In dizi
If Not IsMissing(yoksay_boş) And yoksay_boş Then
If Eleman <> "" Then Metinler.Add CStr(Eleman)
Else
Metinler.Add CStr(Eleman)
End If
Next Eleman
ElseIf TypeOf dizi Is Range Then
For Each Eleman In dizi
If Not IsMissing(yoksay_boş) And yoksay_boş Then
If Eleman.Value <> "" Then Metinler.Add CStr(Eleman.Value)
Else
Metinler.Add CStr(Eleman.Value)
End If
Next Eleman
Else
If Not IsMissing(yoksay_boş) And yoksay_boş Then
If dizi <> "" Then Metinler.Add CStr(dizi)
Else
Metinler.Add CStr(dizi)
End If
End If
On Error GoTo 0
Sonuc = ""
Dim Metin As Variant
For Each Metin In Metinler
If Sonuc <> "" Then
If IsMissing(ayraç) Then
Sonuc = Sonuc & "," & Metin
Else
Sonuc = Sonuc & ayraç & Metin
End If
Else
Sonuc = Metin
End If
Next Metin
UDF_DİZİMETİN = Sonuc
End Function
' DİZİOLUŞTUR Fonksiyonu Benzeri
Function UDF_DİZİOLUŞTUR(satırlar As Long, sütunlar As Long, lambda_fonksiyon As String) As Variant
Dim SonuçDizisi() As Variant
Dim r As Long, c As Long
Dim vbaKodu As String
Dim modül As Object
Dim fonksiyonAdı As String
ReDim SonuçDizisi(1 To satırlar, 1 To sütunlar)
' Geçici bir VBA fonksiyonu oluştur (dikkatli kullanın)
fonksiyonAdı = "GeçiciLambda_" & Replace(Replace(Now(), ":", ""), " ", "_")
vbaKodu = "Function " & fonksiyonAdı & "(satır As Long, sütun As Long) As Variant\n" & _
" " & lambda_fonksiyon & "\n" & _
"End Function"
Set modül = ThisWorkbook.VBProject.VBComponents.Add(1) ' 1 = vbext_ct_StdModule
modül.CodeModule.AddFromString vbaKodu
On Error Resume Next
For r = 1 To satırlar
For c = 1 To sütunlar
SonuçDizisi(r, c) = Application.Run(fonksiyonAdı, r, c)
Next c
Next r
On Error GoTo 0
' Geçici modülü sil
ThisWorkbook.VBProject.VBComponents.Remove modül
UDF_DİZİOLUŞTUR = SonuçDizisi
End Function
' FİLTRE Fonksiyonu Benzeri
Function UDF_FİLTRE(dizi As Range, koşul As Variant, [yoksa_boş]) As Variant
Dim SonuçDizisi() As Variant
Dim i As Long, j As Long
Dim Sayac As Long
Dim KoşulDizisi As Variant
Dim SatırSayısı As Long
Dim SütunSayısı As Long
If TypeOf koşul Is Range Then
KoşulDizisi = koşul.Value
Else
ReDim KoşulDizisi(1 To dizi.Rows.Count, 1 To 1)
For i = 1 To dizi.Rows.Count
KoşulDizisi(i, 1) = koşul
Next i
End If
SatırSayısı = dizi.Rows.Count
SütunSayısı = dizi.Columns.Count
ReDim SonuçDizisi(1 To SatırSayısı, 1 To SütunSayısı)
Sayac = 0
For i = 1 To SatırSayısı
If KoşulDizisi(i, 1) Then
Sayac = Sayac + 1
For j = 1 To SütunSayısı
ReDim Preserve SonuçDizisi(1 To Sayac, 1 To SütunSayısı)
SonuçDizisi(Sayac, j) = dizi.Cells(i, j).Value
Next j
End If
Next i
If Sayac = 0 Then
If IsMissing(yoksa_boş) Then
UDF_FİLTRE = CVErr(xlErrNA)
Else
UDF_FİLTRE = yoksa_boş
End If
Else
UDF_FİLTRE = SonuçDizisi
End If
End Function
' İLKEŞLEŞEN Fonksiyonu Benzeri (Basit Yaklaşım - Tam işlevsellik için daha karmaşık bir UDF gerekebilir)
Function UDF_İLKEŞLEŞEN(arama_değeri As Variant, arama_dizisi As Range, [eşleşme_türü]) As Variant
UDF_İLKEŞLEŞEN = Application.Match(arama_değeri, arama_dizisi, IIf(IsMissing(eşleşme_türü), 0, eşleşme_türü))
End Function
' METİNBİRLEŞTİR Fonksiyonu Benzeri
Function UDF_METİNBİRLEŞTİR(ayraç As String, yokSayBoş As Boolean, ParamArray metinler() As Variant) As String
Dim Sonuc As String
Dim Metin As Variant
Sonuc = ""
For Each Metin In metinler
If Not yokSayBoş Or Metin <> "" Then
If Sonuc <> "" Then Sonuc = Sonuc & ayraç
Sonuc = Sonuc & Metin
End If
Next Metin
UDF_METİNBİRLEŞTİR = Sonuc
End Function
' METİNBÖL Fonksiyonu Benzeri
Function UDF_METİNBÖL(metin As String, sütun_ayracı As String, [satır_ayracı], [yoksay_boş], [eşleşme_büyük_küçük], [dolgu_değeri]) As Variant
Dim Sütunlar() As String
Dim Satırlar() As String
Dim SonuçDizisi() As Variant
Dim i As Long, j As Long
Dim maxSütun As Long
Dim satırAyraçVar As Boolean
satırAyraçVar = Not IsMissing(satır_ayracı)
If satırAyraçVar Then
Satırlar = Split(metin, satır_ayracı)
ReDim SonuçDizisi(LBound(Satırlar) To UBound(Satırlar), 0 To 0) ' Geçici boyutlandırma
For i = LBound(Satırlar) To UBound(Satırlar)
Sütunlar = Split(Satırlar(i), sütun_ayracı)
maxSütun = WorksheetFunction.Max(maxSütun, UBound(Sütunlar) + 1)
ReDim Preserve SonuçDizisi(LBound(Satırlar) To UBound(Satırlar), 1 To maxSütun)
For j = LBound(Sütunlar) To UBound(Sütunlar)
If Not yoksay_boş Or Sütunlar(j) <> "" Then
SonuçDizisi(i + 1, j + 1) = Sütunlar(j)
Else
SonuçDizisi(i + 1, j + 1) = IIf(IsMissing(dolgu_değeri), "", dolgu_değeri)
End If
Next j
' Eksik sütunları dolgu değeriyle doldur
If UBound(Sütunlar) + 1 < maxSütun Then
For j = UBound(Sütunlar) + 2 To maxSütun
SonuçDizisi(