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

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
 

Levent Menteşoğlu

Administrator
Yönetici
Admin
Katılım
13 Ekim 2004
Mesajlar
16,057
Excel Vers. ve Dili
Excel 2010-32 bit-Türkçe
Excel 365 -32 bit-Türkçe
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.
 
Katılım
23 Şubat 2006
Mesajlar
176
Excel Vers. ve Dili
Excell 2003
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:

Levent Menteşoğlu

Administrator
Yönetici
Admin
Katılım
13 Ekim 2004
Mesajlar
16,057
Excel Vers. ve Dili
Excel 2010-32 bit-Türkçe
Excel 365 -32 bit-Türkçe
Bir örnek dosya ekleyebilirmisiniz.
 
Katılım
23 Şubat 2006
Mesajlar
176
Excel Vers. ve Dili
Excell 2003
Değerli üstad cevaplarınızı bekliyorum teşekkürler...
 

Levent Menteşoğlu

Administrator
Yönetici
Admin
Katılım
13 Ekim 2004
Mesajlar
16,057
Excel Vers. ve Dili
Excel 2010-32 bit-Türkçe
Excel 365 -32 bit-Türkçe
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
 
Katılım
23 Şubat 2006
Mesajlar
176
Excel Vers. ve Dili
Excell 2003
&#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:

Levent Menteşoğlu

Administrator
Yönetici
Admin
Katılım
13 Ekim 2004
Mesajlar
16,057
Excel Vers. ve Dili
Excel 2010-32 bit-Türkçe
Excel 365 -32 bit-Türkçe
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.
 
Katılım
23 Şubat 2006
Mesajlar
176
Excel Vers. ve Dili
Excell 2003
İlgili doya ektedir. Her şeyden önce sabrınıza çok teşekkürederim. Saygılar!!!
 

Levent Menteşoğlu

Administrator
Yönetici
Admin
Katılım
13 Ekim 2004
Mesajlar
16,057
Excel Vers. ve Dili
Excel 2010-32 bit-Türkçe
Excel 365 -32 bit-Türkçe
Ş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
 
Katılım
23 Şubat 2006
Mesajlar
176
Excel Vers. ve Dili
Excell 2003
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..
 

Levent Menteşoğlu

Administrator
Yönetici
Admin
Katılım
13 Ekim 2004
Mesajlar
16,057
Excel Vers. ve Dili
Excel 2010-32 bit-Türkçe
Excel 365 -32 bit-Türkçe
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.
 
Katılım
23 Şubat 2006
Mesajlar
176
Excel Vers. ve Dili
Excell 2003
Haklısın üstad, eskisine nazaran çok daha hızlı ve daha kısa. Elelrine, kollarına ve aklına sağlık.
 

Levent Menteşoğlu

Administrator
Yönetici
Admin
Katılım
13 Ekim 2004
Mesajlar
16,057
Excel Vers. ve Dili
Excel 2010-32 bit-Türkçe
Excel 365 -32 bit-Türkçe
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.
 
Katılım
23 Şubat 2006
Mesajlar
176
Excel Vers. ve Dili
Excell 2003
Elinize sağlık üstad. Söyliyecek kelime bulamıyorum. Teşekkürler!!!
 
Üst