• DİKKAT

    DOSYA İndirmek/Yüklemek için ÜCRETLİ ALTIN ÜYELİK Gereklidir!
    Altın Üyelik Hakkında Bilgi

Makro düzeltme!!! (Süzme işleminde font değiştirme)

  • Konbuyu başlatan Konbuyu başlatan shenko
  • Başlangıç tarihi Başlangıç tarihi
Katılım
23 Şubat 2006
Mesajlar
176
Excel Vers. ve Dili
Excell 2003
Aşağıdaki makroyu sorunsuz olarak kullanıyordum fakat makronun çalıştığı dosyaya her gün yeni birşeyler eklendiği için süzme işlemide koymak zorunda kaldım. Süzme işlemi yaptıktan sonra makroyu çalıştırdığımda "A" kolumuna göre sıralamayı yaptıktan sonra her başlığın yazı formatının "Arial Black" olmasında sorun oluyor. Mesela "A"kolumundaki "a" ların en başındakini, "b" lerin en başındakini, "c" lerin en başındakini "Arial Black" yapması gerekiyor. Ama yapmıyor. Yalnız süzme işlemi yokmuş gibi süzmeyi "All" yaparsam. Ozaman gayet düzgün çalışıyor.

Süzme işlemini çalıştırdığımda, sadece ekranda görünen satırlara aşağıdaki makronun çalışmasını nasıl sağlayabiliriz?


Sub Buyer_Click()
Range("A4:L65536").Select
Selection.Sort Key1:=Range("A4"), Order1:=xlAscending, Key2:=Range("H4") _
, Order2:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:= _
False, Orientation:=xlTopToBottom
ActiveWindow.LargeScroll ToRight:=-1
Range("A2").Select
son = [a65536].End(3).Row
Range("a4:j" & son).Select
Selection.Font.Name = "Arial"
Selection.Sort Key1:=Range("a4"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
Cells(4, 1).Font.Name = "Arial Black"
For x = 4 To son - 1
If Cells(x, 1) <> Cells(x + 1, 1) Then Cells(x + 1, 1).Font.Name = "Arial Black"
Range("B1").Select

Next
MsgBox "ALICILAR'A GÖRE SIRALANDI!"
End Sub
 
Bu durum için özel olarak yapacak bir şey bence, yapmanız gereken kodlarınızın içine önce süzmeyi kaldıran, işlemi yaptıktan sonra süzmeyi yeniden oluşturan kodlar eklemektir.
 
De&#287;erli &#252;stad Leventm,

S&#252;zme i&#351;lemi her defas&#305;nda de&#287;i&#351;ik &#351;ekilde s&#252;z&#252;lmek istenicektir. Bunun i&#231;in nas&#305;l bir makro yazabilirsiniz?

Yada nas&#305;l bir makro yaz&#305;lmal&#305; ki; makro &#231;al&#305;&#351;t&#305;&#287;&#305;nda s&#252;zdeki se&#231;ilmi&#351; olan bilgileri akl&#305;nda tutucak daha sonra b&#252;t&#252;n s&#252;zleri "All" yap&#305;p, yukar&#305;daki makroyu &#231;al&#305;&#351;t&#305;r&#305;cak ve ensonunda tekrar ba&#351;taki s&#252;z bilgilerine geri d&#246;n&#252;cek!!!

De&#287;erli bilgilerinizi bizimle payla&#351;t&#305;&#287;&#305;n&#305;z i&#231;in &#231;ok te&#351;ekk&#252;rederim.
&#199;ok fazla bilgi sahibi de&#287;ilim. Hatam olmu&#351; ise afedersiniz!
 
Son düzenleme:
Bir örnek dosya ekleyebilirmisiniz.
 
Değerli üstad cevaplarınızı bekliyorum teşekkürler...
 
A&#351;a&#287;&#305;daki kodu deneyin. Sadece A s&#252;tunundaki tek bir kritere g&#246;re &#231;al&#305;&#351;maktad&#305;r.

Kod:
Sub Button5_Click()
Application.ScreenUpdating = False
filt = ActiveSheet.FilterMode
If filt = True Then
deg = ActiveSheet.AutoFilter.Filters.Item(1).Criteria1
ActiveSheet.ShowAllData
End If
Range("A3:d65536").Sort Key1:=Range("a3"), Key2:=Range("c3")
son = [a65536].End(3).Row
Cells(3, 1).Font.Name = "Arial Black"
For x = 3 To son - 1
If Cells(x, 1) <> Cells(x + 1, 1) Then Cells(x + 1, 1).Font.Name = "Arial Black"
Next
If filt = True Then [a2:d2].AutoFilter Field:=1, Criteria1:="" & deg
Application.ScreenUpdating = True
MsgBox "ALICILAR'A G&#214;RE SIRALANDI!"
End Sub
 
&#220;stad Leventm,

Anlad&#305;&#287;&#305;m kadar&#305;yla, verdi&#287;iniz makro sadece sat&#305;c&#305; kriteri i&#231;in ge&#231;erli. Yani sat&#305;c&#305; kriterini de&#287;i&#351;tirdi&#287;imizde en ba&#351;taki sat&#305;c&#305;y&#305; "Arial Black" yap&#305;yor. Peki &#351;u &#351;ekilde de&#287;i&#351;tirebilirmiyiz; sat&#305;c&#305;lar kriterini de&#287;i&#351;tirdi&#287;imizde, al&#305;c&#305;lar k&#305;sm&#305;ndaki verilerin ba&#351;&#305;ndakileri "Arial Black", al&#305;c&#305;lar kriterini de&#287;i&#351;tirdi&#287;imizde, sat&#305;c&#305;lar k&#305;sm&#305;ndaki verilerin ba&#351;&#305;ndakileri "Arial Black" veya &#252;r&#252;n kriterini de&#287;i&#351;tirdi&#287;imizde yine al&#305;c&#305;lar k&#305;sm&#305;ndaki verilerin ba&#351;&#305;ndakileri "Arial Black" yapabilimiyiz?
 
Son düzenleme:
S&#252;zme olmadan sizin kendi kodunuz ne yap&#305;yorsa benim verdi&#287;im kodda s&#252;zme varken ayn&#305; i&#351;lemi yapmaktad&#305;r. Son mesaj&#305;n&#305;zdaki istedi&#287;inizi a&#231;&#305;k&#231;as&#305; ben anlayamad&#305;m. Tekerleme gibi yazm&#305;&#351;s&#305;n&#305;z. Bu iste&#287;inizi &#246;rnek bir dosya ile veya resimlerle tekrar ifade edermisiniz.
 
İlgili doya ektedir. Her şeyden önce sabrınıza çok teşekkürederim. Saygılar!!!
 
Şimdi sorunuz net anlaşıldı. Aşağıdaki kodu denermisiniz.

Kod:
Sub renklendir()
say = WorksheetFunction.Subtotal(3, [a3:a65536])
ReDim deg(say + 1)
deg(0) = 0
For a = 3 To [a65536].End(3).Row
If Cells(a, "a").Height > 0 Then
c = c + 1
deg(c) = Cells(a, "a")
If deg(c - 1) <> deg(c) Then Cells(a, "a").Font.Name = "Arial Black"
Else
Cells(a, "a").Font.Name = "Arial"
End If
Next
End Sub
 
Değerli üstad,

Emekleriniz ve bizimle paylaştıklarınız için size çok çok teşekkür ederim.

Eğer mümkünse, makronun açıklamasını metin şeklinde kelimelerle anlatırmısınız.

Saygılar, İyi çalışmalar..
 
Yukar&#305;da verdi&#287;im kod &#252;zerinde biraz daha kafa yorunca daha k&#305;sa ve &#246;zellikle &#231;ok say&#305;da veri s&#246;z konusu ise &#231;ok daha h&#305;zl&#305; &#231;al&#305;&#351;acak bir &#231;&#246;z&#252;m daha akl&#305;ma geldi. Bu &#231;&#246;z&#252;m&#252;de altta sunuyorum.

Kod:
Sub renklendir()
On Error Resume Next
For Each hucre In Range("a3:a" & [a65536].End(3).Row).SpecialCells(xlCellTypeVisible)
If Range(rng) <> hucre Then hucre.Font.Name = "Arial Black"
rng = hucre.Address
Next
End Sub

Not:Kodun &#231;al&#305;&#351;ma mant&#305;&#287;&#305;n&#305;da ilk f&#305;rsatta izah edece&#287;im.
 
Haklısın üstad, eskisine nazaran çok daha hızlı ve daha kısa. Elelrine, kollarına ve aklına sağlık.
 
Kod:
Sub renklendir()
On Error Resume Next
For Each hucre In Range("a3:a" & [a65536].End(3).Row).SpecialCells(xlCellTypeVisible)
If Range(rng) <> hucre Then hucre.Font.Name = "Arial Black"
rng = hucre.Address
Next
End Sub

Yukar&#305;da yazd&#305;&#287;&#305;m kodun hangi mant&#305;&#287;a g&#246;re yaz&#305;ld&#305;&#287;&#305;n&#305; izah etmeye &#231;al&#305;&#351;ay&#305;m.

&#214;ncelikle konuyu ifade edersem, sayfa &#252;zerinde s&#252;zme i&#351;lemi yap&#305;lm&#305;&#351;ken, sayfa g&#246;r&#252;nt&#252;s&#252;nde her veriden sadece bir tanesinin yaz&#305; fontunu "Arial Black" yapmakt&#305;r.

Burada s&#305;k&#305;nt&#305; s&#252;zme i&#351;leminde verilerin ard&#305;&#351;&#305;k sat&#305;r nosu ile gitmemesidir. Yani yaz&#305;lacak kod bu ard&#305;&#351;&#305;k gitmeyen h&#252;creleri t&#305;pk&#305; ard&#305;&#351;&#305;k gidiyormu&#351; gibi kabul edip, her veriden sadece birinin fontunu de&#287;i&#351;tirmelidir. Yani m&#252;kerrer kay&#305;tlardan sadece ilkinin fontu de&#287;i&#351;tirilecektir.

Bu sorunun tespitinin ard&#305;ndan a&#351;a&#287;&#305;daki sat&#305;r ile sadece kay&#305;tl&#305; g&#246;r&#252;nen h&#252;crelerin adresleri tespit edilmi&#351;tir. Bu kod control+G ile a&#231;&#305;lan "G&#304;T" penceresindeki "sadece g&#246;r&#252;nen h&#252;creler" i&#351;leminin VBA daki kar&#351;&#305;l&#305;&#287;&#305;d&#305;r.

Kod:
Range("a3:a" & [a65536].End(3).Row).SpecialCells(xlCellTypeVisible)

Yukar&#305;daki sat&#305;rda yer alan "[a65536].end(3).row" ifadeside se&#231;ilecek aral&#305;&#287;&#305;n son sat&#305;r&#305;n&#305; tespit etmektedir.

Yukar&#305;daki kodla tespit edilen h&#252;creler aral&#305;&#287;&#305;ndaki her h&#252;crenin de&#287;erini de&#287;erlendirmek i&#231;in bir d&#246;ng&#252; kurmak gerekir. Bu d&#246;ng&#252;de a&#351;a&#287;&#305;daki gibidir.

Kod:
For Each hucre In Range("a3:a" & [a65536].End(3).Row).SpecialCells(xlCellTypeVisible)
.
.
Next

Bir sonraki i&#351;lem bir &#246;nceki h&#252;cre ile se&#231;ilen h&#252;credeki de&#287;erin kar&#351;&#305;la&#351;t&#305;r&#305;lmas&#305;d&#305;r. Bu i&#351;lemide d&#246;ng&#252; i&#231;indeki a&#351;a&#287;&#305;daki sat&#305;rlar yapar. Bu kodda "hucre", se&#231;ilen h&#252;creyi "Range(rng)" de bir &#246;nceki h&#252;creyi ifade eder. Bir &#246;nceki h&#252;crenin adresini ise "rng=hucre.address" ifadesi tespit etmektedir.

Kod:
If Range(rng) <> hucre Then hucre.Font.Name = "Arial Black"
rng = hucre.Address

Son olarak kod i&#231;indeki "on error resume next" sat&#305;r&#305; ise bir hata oldu&#287;unda kodun i&#351;lemine devam etmesini sa&#287;lar. Kod i&#231;inde tek hata, sadece ilk h&#252;crenin bir &#246;nceki ile de&#287;erlendirilmesin ortaya &#231;&#305;kacakt&#305;r. &#199;&#252;nk&#252; ilk h&#252;crenin bir &#246;nceki h&#252;cre adresi hen&#252;z belli de&#287;ildir. Bu adres ancak ikinci h&#252;creye ge&#231;ildi&#287;inde "rng=hucre.address" ifadesi ile tespit edilir.

Umar&#305;m yeterince anla&#351;&#305;l&#305;r &#351;ekilde izah edebilmi&#351;imdir.
 
Elinize sağlık üstad. Söyliyecek kelime bulamıyorum. Teşekkürler!!!
 
Geri
Üst