VBA kod renklendirici (Code Highlighter)
Merhaba, bu uygulamamızda sizlerle birlikle VBA kodları içeren bir metin dosyasındaki kodları okuyarak bu kodun içerisinde bulunan ve programlama dili için ayrılmış kelimeler olarak isimlendirilen kelimeleri ayıklayarak onları renklendirip tüm içeriği bir web sayfasına aktaracağız.
-
Her daim olduğu gibi evvela yeni bir belge açıyor ve makro güvenlik düzeyini düşük olarak ayarlıyoruz. Nasıl yapılacağını hatırlamak için yine her zaman olduğu gibi bu bağlantıyı kullanabilirsiniz.
-
Sonrasında aşağıda verilen ekran çıktısını belgenize uyguluyorsunuz. Web sayfası ve css dosyasının kaydedileceği sürücüyü belirlemek için ComboBox yani açılan kutu muhtelif sair işlemler için de 3 adet CommandButton nesnesi eklemeniz gerekiyor. Nesnelerin name ve Caption özellikleri aşağıda verilmiştir. Açılan kutunun değerleri ise belge açılırken kod ile yükletilecektir. Ayrıca çalışmamızda iki adet de çizim araç çubuğu yardımıyla ya da Ekle mönüsü yardımıyla ekleyebileceğiniz metin kutusu bulunmaktadır. Kesinlikle ifade etmeliyim ki bunlar birer TextBox değildir.
-
Bu çalışmayı çalıştırırken dikkat edilmesi gereken en önemli nokta Windows7 ve üzeri kullanıcılarının dosya kayıt yeri olarak C: sürücüsünü seçmemeleri gerektiğidir. Çünkü Windows7 C: sürücüsü kök dizinde dosya yapmaya izin vermeyecek ve çalışmanız hata verecektir. Diğer bir ifade ile Win7 kullanıcıları ya C: sürücüsü dışında bir sürücü seçmeliler ya da MS Word uygulaması yönetici olarak çalıştırmalıdırlar. Şu gerzek windows ne gariptir, söz de siz izin vermeden dosya sistemi üzerinde yeni bir dosya yapmaya izin vermiyor niye yıllardır milleti virüs taramalarla tırmalattırdın o zaman? Kullanıcıya sadece kendi klasörü üzerinde işlem yapmaya izin verip dosya sistemi üzerindeki değişiklikleri bir şifreye bağlamak bu kadar zor muydu? Linux yıllardır yapıyor, milyar dolarlık şirket bunu yapamıyor. Neden? Cevap basit bizi kaz gibi yolup kuş gibi hafifletmek için...Her neyse
-
Son olarak her zaman olduğu gibi aşağıda verilen kodları ALT+F11 ile görüntülenen VBA kod düzenleyicisinde yazıyor ve belgemizi kaydedip kapatıyoruz sonra yeniden açıyor ve deneme yapıyoruz. Sizlere verdiğim kaynak dosyada ihtiyacanız olan her şey var. Elbette sizde VBA kodları içeren farklı bir dosya ile denemelerinizi yapabilirsiniz. Burada sizlere aktardığım bu çalışma 2013-2014 eğitim öğretim yılında çalıştığım okulda öğrencilerimize atelye uygulaması olarak yaptırılmıştır. Elbette gözden geçirlmesi gereken hataları vardır, onları düzeltmek de artık size kalıyor.
Kaynak kodlar:
'Tanimlanmayan degiskenlerin kullanilmasina izin verme
Option Explicit
Dim metinDosyasi As String
Dim ozelKelimeler() As Variant
Private Sub btnCikis_Click()
'1. Acik belgeyi kaydetmeden cik
Application.Quit wdDoNotSaveChanges
'2. Acik belgeyi kaydet ve cik
' Application.Quit wdSaveChanges
End Sub
Private Sub btnKaynakDosyaSec_Click()
Dim dosyaPenceresi As FileDialog, secilenDosya As Variant
Set dosyaPenceresi = ThisDocument.Application.FileDialog(msoFileDialogOpen)
With dosyaPenceresi
'filterleri temizle
.Filters.Clear
'filtre ekle
.Filters.Add "Metin dosyalari", "*.txt", 1
.Filters.Add "Tüm dosyalar", "*.*", 2
'taman dugmesine basilmissa
If .Show = -1 Then
'secilen her bir dosya icin ayni islemi yap
For Each secilenDosya In .SelectedItems
ThisDocument.Shapes(1).TextFrame.TextRange.Text = secilenDosya
metinDosyasi = mutlakDosyaYolu(CStr(secilenDosya))
Next
End If
End With
Set dosyaPenceresi = Nothing
End Sub
Private Function mutlakDosyaYolu(kaynak As String) As String
'*****************************************************************************************************
'Kodlayan : Bilal SERT
'Amac : Dosya adindan istenmeyen karakterleri temizlemek
'Tarih/saat : 26.12.2013 / 10:55
'Giriş / Çıkış : kaynak (dosya adını ve yolunu gosterir degisken) / yok
'Değiştiren :
'Tarih/Saat :
'Amaç :
'*****************************************************************************************************
Dim sayac As Integer, sonuc As String
sonuc = ""
For sayac = 1 To Len(kaynak)
If Asc(Mid(kaynak, sayac, 1)) <> 13 And Asc(Mid(kaynak, sayac, 1)) <> 7 Then
sonuc = sonuc & Mid(kaynak, sayac, 1)
End If
Next
mutlakDosyaYolu = sonuc
End Function
Private Sub btnOku_Click()
Dim dosSis, dosya, webSayfasi As Object, sayac, durum, kontrolBitti As Boolean
Dim satir, htmlSatiri, hedefHTML, hedefCSS As String, kelimeler() As String 'kelimeler dizisi
Dim kelime, eleman As Variant
Const ForReading = 1, TristateFalse = 0
If metinDosyasi <> "" Then
hedefHTML = ComboSuruculer.Text & Trim("\exported.html")
hedefCSS = ComboSuruculer.Text & Trim("\codeView.css")
'İkinci paragraftan son paragrafa kadar olan bolum siliniyor
With ThisDocument
If .Paragraphs.Count > 3 Then
.Range(.Paragraphs(4).Range.Start, .Paragraphs(.Paragraphs.Count).Range.End).Delete
End If
'Yeni bir paragraf ekleniyor
.Paragraphs.Add
End With
'Metin dosyasina erismek icin dosya sistemi olusturuluyor
Set dosSis = CreateObject("Scripting.FileSystemObject")
'CSS dosyasi olusturuluyor
If dosSis.FileExists(hedefCSS) Then
dosSis.DeleteFile hedefCSS, True 'silmeye zorluyoruz
End If
On Local Error GoTo hata
Set webSayfasi = dosSis.CreateTextFile(hedefCSS, True)
With webSayfasi
.writeLine (" .rezerve{")
.writeLine (" color:#0066FF;")
.writeLine (" }")
.writeLine (" .aciklama{")
.writeLine (" color:#006600;")
.writeLine (" }")
.writeLine (" .standart{")
.writeLine (" color:#333333;")
.writeLine (" }")
.writeLine (" .codeBlogu{")
.writeLine (" background-color:#F8F5FF;")
.writeLine (" border:1px dashed #999999;")
.writeLine (" width:95%;")
.writeLine (" height:60%;")
.writeLine (" overflow:scroll;")
.writeLine (" }")
.Close
End With
Set webSayfasi = Nothing
'Kaynak metin dosyasi aciliyor.
On Local Error GoTo hata
Set dosya = dosSis.OpenTextFile(metinDosyasi, ForReading, TristateFalse)
'HTML aktarim yapilacak dosya olusturuluyor
If dosSis.FileExists(hedefHTML) Then
dosSis.DeleteFile hedefHTML, True 'silmeye zorluyoruz
End If
On Local Error GoTo hata
Set webSayfasi = dosSis.CreateTextFile(hedefHTML, True)
webSayfasi.writeLine ("< html> ")
webSayfasi.writeLine ("< head>< title> " & Format(Now, "dd/mm/yyyy-hh:mm:ss") & "::. ")
webSayfasi.writeLine ("< link href=" & Chr(34) & "codeView.css" & Chr(34) & "rel=" & Chr(34) & _
"stylesheet" & Chr(34) & "type=" & Chr(34) & "text/css" & Chr(34) & "/>")
webSayfasi.writeLine ("")
webSayfasi.writeLine ("< body>")
webSayfasi.writeLine ("< p class='codeBlogu'>")
With dosya
Do While .AtEndOfStream <> True
satir = .ReadLine: kontrolBitti = False
'bu noktada lexical analysing islemi yapilacak
If Left(satir, 1) = "'" Then
webSayfasi.writeLine ("< span class='aciklama'>" & satir & "
")
Else
kelimeler = Split(satir, " ")
htmlSatiri = ""
For Each kelime In kelimeler
If kelime = " " Then
'bosluk olup olmadigi sorgulaniyor
htmlSatiri = htmlSatiri & " "
Else
If Not kontrolBitti Then
'rezerve edilmis kelime olup olmadigi sorugulaniyor
durum = False
For Each eleman In ozelKelimeler
If LCase(eleman) = LCase(kelime) Then
durum = True
Exit For
End If
Next
If durum Then
htmlSatiri = htmlSatiri & "< span class='rezerve'>" & kelime & " "
Else
If Left(kelime, 1) = "'" Then
htmlSatiri = htmlSatiri & "< span class='aciklama'>" & kelime & " "
kontrolBitti = True
Else
htmlSatiri = htmlSatiri & "< span class='standart'>" & kelime & " "
End If
End If 'ozel kelime kontrol
Else
htmlSatiri = htmlSatiri & kelime & " "
End If 'aciklama satirina dusuldu
End If 'bosluk kontrol
Next
If kontrolBitti Then
webSayfasi.writeLine (htmlSatiri & "
")
Else
webSayfasi.writeLine (htmlSatiri & "< br />")
End If
End If 'aciklama kontrol
Loop
.Close
End With
webSayfasi.writeLine ("")
webSayfasi.writeLine ("")
webSayfasi.writeLine ("")
webSayfasi.Close
Set dosSis = Nothing
Set dosya = dosya
Set webSayfasi = Nothing
On Local Error GoTo hata
Shell "c:\windows\explorer.exe" & " " & ComboSuruculer.Text & Trim("\"), vbMaximizedFocus
Else
MsgBox "Lütfen renklendirmek istediğiniz kodların bulunduğu dosyayı seçin", vbInformation + vbOKOnly, "Dikkat !"
End If
Exit Sub
hata:
MsgBox "Dikkata hata oluştu " & vbCrLf & Err.Description, vbCritical + vbOKOnly, "Dikkat"
End Sub
Private Sub suruculeriListele()
'*****************************************************************************************************
'Kodlayan : Bilal SERT
'Amac : Sisteme bağl olan sürücüleri listemek
'Tarih/saat : 06.07.2014 17:17
'Giriş / Çıkış : yok / yok
'Değiştiren :
'Tarih/Saat :
'Amaç :
'*****************************************************************************************************
Dim dosSis, suruculer, surucu As Object
Set dosSis = CreateObject("Scripting.FileSystemObject")
Set suruculer = dosSis.Drives
ComboSuruculer.Clear
For Each surucu In suruculer
On Error Resume Next
ComboSuruculer.AddItem surucu.DriveLetter & Trim(":") ' & surucu.VolumeName
Next
If ComboSuruculer.ListCount <> 0 Then
ComboSuruculer.ListIndex = 0
End If
Set dosSis = Nothing
Set surucu = Nothing
Set suruculer = Nothing
End Sub
Private Sub Document_Open()
Dim eleman As Variant
ozelKelimeler = Array("const", "dim", "redim", "as", "integer", "Boolean", _
"Long", "Double", "flooat", "decimal", "Array", "public", "private", "import", _
"sub", "end", "function", "if", "else", "then", "switch", "case", "with", "while", _
"loop", "do", "until", "class", "set", "nothing", "true", "false", "Object", "variant", _
"for", "next", "in", "each")
'test ediyoruz
With ThisDocument
If .Paragraphs.Count > 3 Then
.Range(.Paragraphs(4).Range.Start, .Paragraphs(.Paragraphs.Count).Range.End).Delete
End If
'Yeni bir paragraf ekleniyor
.Paragraphs.Add
End With
ThisDocument.Content.InsertAfter "VBA kod renklendirici tarafından algılanan özel kelimeler :" & vbCrLf
For Each eleman In ozelKelimeler
ThisDocument.Content.InsertAfter eleman & ", "
Next
With ThisDocument
.Paragraphs.Add
.Paragraphs(.Paragraphs.Count).Range.Font.ColorIndex = wdRed
.Paragraphs(.Paragraphs.Count).Range.Text = _
"Bu doküman Bilal SERT tarafından eğitim amaçlı olarak hazırlanmıştır. [iletişim: bilisim@bilalsert.com.tr]"
End With
'sisteme bağlı olan sürücüler listeleniyor
suruculeriListele
'uyari bilgileri görüntüleniyor
ThisDocument.Shapes(1).TextFrame.TextRange.Text = ""
ThisDocument.Shapes(2).TextFrame.TextRange.Text = "Lütfen sonuç verilerinin kaydedileceği sürücüyü seçin"
End Sub
Yardımcı olması dileğiyle