Tablolarda Tutarların Yazıyla Otomatik Olarak Yazılması
Excel'de bir sayıyı yazıyla elde etmek için standart yerleşik bir fonksiyon bulunmamaktadır. Tek seferlik görevler için metin formülleri veya çevrimiçi dönüştürücüler kullanılabilir, ancak faturalar, tutanaklar ve sevkiyat fişleri gibi belgelerle düzenli çalışmak için en etkili çözüm VBA dilinde kullanıcı tanımlı bir fonksiyon oluşturmaktır. Bu, "ruble" ve "kopek" kelimelerini otomatik olarak çekime sokmanıza ve her büyüklükteki tutarı doğru şekilde görüntülemenize olanak tanır.
Neden Excel'de "Yazıyla" Düğmesi Yoktur?
Microsoft geliştiricileri, Rusça dilbilgisi kurallarını (hal, cinsiyet ve sayı çekimleri) dikkate alarak sayıları metne dönüştüren bir fonksiyonu temel formül setine dahil etmemiştir. Standart METİN (TEXT) fonksiyonu sayıları para birimi olarak biçimlendirebilir (örneğin, "100,00 ₽"), ancak bunları sözlü forma ("yüz ruble 00 kopek") çevirmez.
Önemli: Bir sayıyı yalnızca bir kez dönüştürmeniz gerekiyorsa, çevrimiçi bir hizmet kullanıp sonucu hücreye kopyalamak daha kolaydır. Ancak tutar dinamik olarak değişiyorsa veya çok sayıda dosyanız varsa, Excel içinde ayarlama yapılması gerekecektir.
Yöntem 1: VBA ile Kullanıcı Tanımlı Fonksiyon (Önerilen)
Bu yöntem, dosyanıza TOPLAMYAZIYLA gibi yeni bir fonksiyon ekler; bu fonksiyon normal formüller (=TOPLA, =DÜŞEYARA) gibi çalışır. Ruble/doların yarısını dikkate alır ve son ekleri doğru şekilde çeker.
Kurulum Adımları
- Excel dosyasını açın ve VBA düzenleyicisini açmak için Alt + F11 tuş kombinasyonuna basın.
- Menüde Insert > Module seçeneğini belirleyin.
- Açılan beyaz pencereye hazır fonksiyon kodunu yapıştırın (aşağıya bakınız).
- Düzenleyiciyi kapatın ve tabloya geri dönün.
Artık herhangi bir hücrede şu formülü yazabilirsiniz:
=TOPLAMYAZIYLA(A1)
burada A1 — sayının bulunduğu hücredir.
Hazır Makro Kodu
Bu kodu modüle kopyalayın. Rusça yerel ayarlar (ruble ve kopek) için uyarlanmıştır:
Function TOPLAMYAZIYLA(ByVal MyNumber As Double) As String
Dim Rubles As Long, Kopecks As Integer
Dim Result As String
If MyNumber < 0 Then
TOPLAMYAZIYLA = "Negatif değer"
Exit Function
End If
Rubles = Int(MyNumber)
Kopecks = Round((MyNumber - Rubles) * 100, 0)
Result = GetWords(Rubles, "ruble", "ruble", "ruble")
If Kopecks > 0 Then
Result = Result & " " & GetWords(Kopecks, "kopek", "kopek", "kopek")
Else
Result = Result & " 00 kopek"
End If
' İlk harfi büyük yap
TOPLAMYAZIYLA = UCase(Left(Result, 1)) & Mid(Result, 2)
End Function
Function GetWords(Number As Long, ByVal S1 As String, ByVal S2 As String, ByVal S5 As String) As String
Dim Hundreds As Integer, Tens As Integer, Units As Integer
Dim Words As String
If Number = 0 Then
GetWords = "sıfır " & S5
Exit Function
End If
Hundreds = Int(Number / 100)
Tens = Int((Number Mod 100) / 10)
Units = Number Mod 10
' Yüzler
Select Case Hundreds
Case 1: Words = "yüz "
Case 2: Words = "iki yüz "
Case 3: Words = "üç yüz "
Case 4: Words = "dört yüz "
Case 5: Words = "beş yüz "
Case 6: Words = "altı yüz "
Case 7: Words = "yedi yüz "
Case 8: Words = "sekiz yüz "
Case 9: Words = "dokuz yüz "
End Select
' Onlar ve birler
If Tens = 1 Then
Select Case Number Mod 100
Case 10: Words = Words & "on "
Case 11: Words = Words & "on bir "
Case 12: Words = Words & "on iki "
Case 13: Words = Words & "on üç "
Case 14: Words = Words & "on dört "
Case 15: Words = Words & "on beş "
Case 16: Words = Words & "on altı "
Case 17: Words = Words & "on yedi "
Case 18: Words = Words & "on sekiz "
Case 19: Words = Words & "on dokuz "
End Select
Else
Select Case Tens
Case 2: Words = Words & "yirmi "
Case 3: Words = Words & "otuz "
Case 4: Words = Words & "kırk "
Case 5: Words = Words & "elli "
Case 6: Words = Words & "altmış "
Case 7: Words = Words & "yetmiş "
Case 8: Words = Words & "seksen "
Case 9: Words = Words & "doksan "
End Select
Select Case Units
Case 1: Words = Words & "bir "
Case 2: Words = Words & "iki "
Case 3: Words = Words & "üç "
Case 4: Words = Words & "dört "
Case 5: Words = Words & "beş "
Case 6: Words = Words & "altı "
Case 7: Words = Words & "yedi "
Case 8: Words = Words & "sekiz "
Case 9: Words = Words & "dokuz "
End Select
End If
' İsim çekimi (örnek için basitleştirilmiş mantık)
' Binler, milyonlar vb. için tam çalışma amacıyla kelime dizileri gerekir.
' Burada 999'a kadar olan sayılar için temel sürüm sunulmuştur.
Dim Ending As String
If Units = 1 And Tens <> 1 Then Ending = S1
ElseIf Units >= 2 And Units <= 4 And Tens <> 1 Then Ending = S2
Else Ending = S5
GetWords = Trim(Words) & " " & Ending
End Function
Dosya Güvenliği: Makro içeren dosyaların .xlsm formatında (Makro Destekli Excel Çalışma Kitabı) kaydedilmesi gerekir. Böyle bir dosya başka bir bilgisayarda açıldığında, makroların çalıştırılması için izin istenebilir.
Yöntem 2: Makrosuz Formüller (Sınırlı)
Eğer şirketinizin güvenlik politikası makro kullanımını yasaklıyorsa, karmaşık iç içe geçmiş DÜŞEYARA, Seç (CHOOSE) fonksiyonları ve birleştirme işlemleri aracılığıyla bir metin dizisi oluşturmayı deneyebilirsiniz.
Ancak bu yöntemin ciddi dezavantajları vardır:
- Formül çok büyük olur (binlerce karakter).
- Binler, milyonlar ve milyarlar için doğru çekimi uygulamak son derece zordur.
- Bakımı ve düzenlemesi zordur.
Basit durumlar için (sadece 999'a kadar olan tam sayılar), kelimeler içeren yardımcı tablolar ve ilk harfi büyük yapmak için BÜYÜKHARF fonksiyonu kullanılabilir. Ancak yüksek hata riski nedeniyle finansal belgeler için bu yöntem önerilmez.
Sonucun Belgede Biçimlendirilmesi
Ödeme emirleri veya sözleşmeler hazırlarken biçimlendirme standartlarına uyulması önemlidir:
- Büyük Harf: Yazıyla ifade edilen tutar her zaman büyük harfle başlar. Yukarıdaki makroda bu otomatik olarak uygulanmıştır. Metni manuel olarak kullanıyorsanız, şu formülü uygulayın:
=BÜYÜKHARF(SOLDAN(A1;1))&SAĞDAN(A1;UZUNLUK(A1)-1) - Kopekler Rakamla: Genellikle "Yüz ruble 00 kopek" formatı gerekir. Yukarıdaki makro zaten bu yapıyı oluşturur.
- Hizalama: Basılı formlarda, yazıyla ifade edilen tutar genellikle elle kontrol için yer bırakılarak sola hizalanır veya özel bir alana yazılır.
Sık Yapılan Hatalar
- #AD? Hatası:
=TOPLAMYAZIYLA(...)formülünü girdiyseniz ancak dosyayı.xlsmolarak kaydetmeyi unuttuysanız veya makro çalışma kitabından silindiyse ortaya çıkar. - Yanlış Çekim: Kendi kendine yapılan formüller genellikle son eklerde hata yapar ("bir bin ruble" yerine yanlış çekim). Hazır eklentiler veya test edilmiş makrolar bu sorunu çözer.
- Kopeklerin Yuvarlanması: Ondalık sayılarla çalışırken, hesaplama hatası nedeniyle "99 kopek"in "100 kopek" haline gelmesini önlemek için değeri makroya aktarmadan önce
YUVARLAfonksiyonunu kullanın.
SSS
Fonksiyonun tüm yeni dosyalarda çalışmasını sağlayabilir miyim?
Evet. Makrolu dosyayı bir eklenti şablonu (.xlam) olarak kaydedin ve Excel'in otomatik başlatma klasörüne yerleştirin. Böylece TOPLAMYAZIYLA fonksiyonu herhangi bir çalışma kitabında kullanılabilir olacaktır.
Bu Mac'te çalışır mı? Temel VBA kodu macOS'ta da çalışır, ancak otomatik başlatma klasörünün yolu ve bazı güvenlik ayarları Windows sürümünden farklıdır.
Dolar veya Euro'yu nasıl çeviririm? Makro kodunda "ruble/ruble/ruble" ve "kopek..." kelimelerini ilgili para birimleriyle ("dolar", "euro") değiştirmeniz ve eğer para biriminde 100 sent yoksa (ancak dolar ve euro için mantık aynıdır) tam ve ondalık kısmın ayrılma mantığını değiştirmeniz gerekir.