PDA

Orijinalini görmek için tıklayınız : (LISTVIEW) Listview'e Veri Al, Topla, Sırala, Yazdır



iso07
23.10.2006, 14:41
Merhaba,
Öncelikle tüm forum üyelerinin ve değerli hocalarımızın bayramını kutlarım.

Userform üzerine yerleştirdiğim 2 adet textbox, 1 adet commandbuton, 1 adet combobox ve 1 adet listview var.

Yapmak istediğim şu;
1 - Combobox'da seçtiğim müşteri sayfasınının C sütununda bulunan tarihler baz alınarak , textbox1 ve textbox2 ye gireceğim tarihler arasında sayfadaki verileri süzdürerek listviewe aktarmak, aktarılacak sütunlar C, E ve N sütunları. (commandbuton click ile)

Erdinç E. Karaçam
24.10.2006, 05:52
Merhaba,

Listview'a alınan verilerin, istenilen sütunları altına eklenecek bir textbox'da toplamları aldırılabilir mi?

Erdinç E. Karaçam
24.10.2006, 06:00
Merhaba,

Listview'e aktarılan veriler için önizleme ve yazdırma işlemi yapılabilir mi?
Yapılamıyorsa bu veriler yeni bir sayfaya nasıl aktarılır?

Erdinç E. Karaçam
24.10.2006, 06:31
Merhaba,

Resimdeki gibi bir UserForm hazırlayın.

Örnekteki ListView1'de gereken ayarlar:
ListView1 | Misc | (Custom): Column Headers: Insert Column:
Index1: C Sütunu
Witdh: 100,0001

Index2: E Sütunu
Witdh: 100,0001

Index3: N Sütunu
Witdh: 100,0001

Sorunuzda belirttiğiniz nesneleri de yeleştirdikten sonra;

Müşteri sayfaları için ben resimdeki gibi bir örnek yaptım siz inceleyip, kendi düzeltmelerinizi yapın.

Gerekli Kodlar:



Dim Limit As Long

Private Sub UserForm_Initialize()
'ComboBox'a aktar
Dim Sayfa As Worksheet
For Each Sayfa In Worksheets
ComboBox1.AddItem Sayfa.Name
Next Sayfa
End Sub


Private Sub CommandButton1_Click()
'ListView'e aktar
Dim Ilk As Date
Dim Son As Date
Dim BakilanSayfa As String
Dim BakilanSayfadakiSonKullanilanSatir As Long
Dim IlkSatir As Long
Dim SonSatir As Long
Dim Listviyv As ListItem
Dim i As Long
Dim Toplam1 As Single
Dim Toplam2 As Single
ListView1.ListItems.Clear
ListView1.View = lvwReport
Ilk = Format(CDate(Me.TextBox1), "dd/mm/yyyy")
Son = Format(CDate(Me.TextBox2), "dd/mm/yyyy")
BakilanSayfa = Me.ComboBox1.Value
BakilanSayfadakiSonKullanilanSatir = Sheets(BakilanSayfa).Range("C:C").SpecialCells(xlCellTypeLastCell).Row
On Error Resume Next
IlkSatir = Sheets(BakilanSayfa).Range("C1:C" & BakilanSayfadakiSonKullanilanSatir).Find(Ilk).Row
SonSatir = Sheets(BakilanSayfa).Range("C1:C" & BakilanSayfadakiSonKullanilanSatir).Find(Son).Row
Limit = (SonSatir - IlkSatir) + 1
For i = 1 To Limit
With ListView1
.ListItems.Add , , Format(CDate(Sheets(BakilanSayfa).Cells(IlkSatir, 3)), "dd/mm/yyyy")
With .ListItems(i)
.SubItems(1) = Sheets(BakilanSayfa).Cells(IlkSatir, 5)
Toplam1 = Toplam1 + Val(Sheets(BakilanSayfa).Cells(IlkSatir, 5))
.SubItems(2) = Sheets(BakilanSayfa).Cells(IlkSatir, 14)
Toplam2 = Toplam2 + Val(Sheets(BakilanSayfa).Cells(IlkSatir, 14))
End With
End With
IlkSatir = IlkSatir + 1
Next i
Me.TextBox3 = Toplam1
Me.TextBox4 = Toplam2
End Sub



Private Sub CommandButton2_Click()
'Yazdır
'VB6 için LVExportManager gibi programlar var bildiğim kadarıyla, ancak VBA için ben bir yöntem bulamadım.
Dim k As Byte
Dim j As Long
For k = 1 To ListView1.ColumnHeaders.Count
Sheets("Yazdir").Cells(1, k) = ListView1.ColumnHeaders(k).Text
Next k
For j = 1 To Limit
With Sheets("Yazdir")
.Cells(j + 1, 1) = Format(CDate(ListView1.ListItems(j).Text), "mm/dd/yyyy")
.Cells(j + 1, 2) = ListView1.ListItems(j).SubItems(1)
.Cells(j + 1, 3) = ListView1.ListItems(j).SubItems(2)
End With
Next j
With Sheets("Yazdir")
.Cells(j + 1, 2) = Val(Me.TextBox3)
.Cells(j + 1, 3) = Val(Me.TextBox4)
.PrintOut Copies:=1, Collate:=True
.Cells.ClearContents
End With
End Sub

Örnek çalışma görüntüsü:

iso07
24.10.2006, 12:47
Erdinç hocam emeğinize sağlık, dört dörtlük bir cevap olmuş, tam istediğim gibi. Ancak ben ilk denememde başarılı olamadım :lol:

Biraz daha dikkatli inceleyip bilgi veririm size. Hiçbir hata vermemesine rağmen listview'e gelmedi veriler.

Tekrar teşekkür ederim.

iso07
24.10.2006, 13:46
Erdinç Hocam,

Kodlarla ilgili sormak istediğim birkaç şey var.

1- Tarih bilgilerini girerken C sütununda mevcut tarih aralıklarını girmek gerekiyor. Ben aylık rapor alırken normal olarak 01/10/2006 ve 31/10/2006 tarihlerini giricem, fakat o tarihler C'de yoksa Listview'de görüntülenmiyor veriler.

Tarihler C sütununda sıralı olmasa bile iki tarih arasını süzdürerek alabilir miyiz verileri?

2- Yazdir sayfasını oluşturdum fakat, sadece Listview'in sütun başlıkları ve toplam textboxlarındaki değerler geliyor sayfaya.

Toplam alınan textbox'ların formatı #,###.00 şeklinde yazdırma sayfasına da bu formatta gitmesini nasıl sağlarız.

3- Toplama işleminde ondalıklar toplanmıyor.

Teşekkürler...

Erdinç E. Karaçam
25.10.2006, 00:22
... Ancak ben ilk denememde başarılı olamadım :lol:

Bakınız; resim.


Hiçbir hata vermemesine rağmen listview'e gelmedi veriler.

On Error Resume Next...

Eğer aranan veriler yoksa; Excel'e ilham olması biraz zor. :wink:

Biraz şartları zorladım ama mesela aşağıdaki gibi bir kod maalsef işe yaramadı... :lol:


Sub AşKendiniExcelEfendi()
Dim AklımdakiŞeyler As Variant
If Cells.Find(AklımdakiŞeyler) Is Nothing Then
GetConnectionTo.UserBrain
BeInspiredFrom.UserBrain (AklımdakiŞeyler)
End If
End Sub

iso07
25.10.2006, 00:44
Erdinç Hocam,


Toplam1 = Toplam1 + Format((Sheets(BakilanSayfa).Cells(IlkSatir, 5)) * 1, "##,###.##")

şeklinde düzeltme yaparak ondalıkların toplanmasını ve yazdır sayfasına 12.345,67 şeklinde yazdırılmasını sağladım.

Ancak sizdeki örnekteki gibi yazdır sayfasına tüm verileri alamadım, sadece toplam satırı ve listview başlıkları var.

Tarih problemi için istediğim şekilde işlev gören bir kod buldum fakat kendi dosyama uyarlayamadım.

Uğraşalım bakalım biraz daha.

Erdinç E. Karaçam
25.10.2006, 00:53
...1- Tarih bilgilerini girerken C sütununda mevcut tarih aralıklarını girmek gerekiyor. Ben aylık rapor alırken normal olarak 01/10/2006 ve 31/10/2006 tarihlerini gireceğim, fakat o tarihler C'de yoksa Listview'de görüntülenmiyor veriler.

Tarihler C sütununda sıralı olmasa bile iki tarih arasını süzdürerek alabilir miyiz verileri?...

Alabilirsiniz. Bu tercih sizin. Benim gösterdiğim, ilk söylediğiniz ihtiyaç için yol alabilmenize yardımcı olmak amacına istinaden sadece size bir örnektir.

For-Next veya For-Each-Next gibi bir döngü içinde If-End-If kullanarak yapabilirsiniz.


...2- Yazdir sayfasını oluşturdum fakat, sadece Listview'in sütun başlıkları ve toplam textboxlarındaki değerler geliyor sayfaya....

Nesnelere ve değişkenlere verdiğiniz isimleri dikkatlice denetleyiniz.

Ben bu tür sorularla karşılaşmayayım diye özellikle resim ekliyorum, olduğunu göresiniz diye. Bir ihtimal de şu: diğer mevcut kodlarınız arasına ekleyerek veya bir harmanlama yaparak kodları kullanıyor olabilirsiniz. Buradan kaynaklanan bir sıkıntı olabilir. Emin değilim.



...Toplam alınan textbox'ların formatı #,###.00 şeklinde yazdırma sayfasına da bu formatta gitmesini nasıl sağlarız?...

Ya Yazdir sayfasındaki hücrelere istediğiniz hücre biçimini veriniz. Veya TextBox'ların biçimini düzenleyebilirsiniz; örneğin:

Format(TextBox1,"#,###.00")
gibi...



...3- Toplama işleminde ondalıklar toplanmıyor...

Val fonksiyonu yerine Type Conversion Function'lardan CSng'ı kullanın.
Örneğin:


Toplam1 = Toplam1 + CSng(Sheets(BakilanSayfa).Cells(IlkSatir, 5))


Toplam2 = Toplam2 + CSng(Sheets(BakilanSayfa).Cells(IlkSatir, 14))

Kolay gelsin.

Erdinç E. Karaçam
25.10.2006, 01:00
...Uğraşalım bakalım biraz daha.

Olmazsa dosyayı size gönderirim; inceleyebilirsiniz ama bence olacak bu iş. Az daha gayret... :D

iso07
25.10.2006, 01:39
Erdinç Hocam,


For j = 1 To Limit bu kodu

For j = 1 To ListView1.ListItems.Count

şeklinde değiştirerek yazdırma sayfasındaki problemini de aştık :lol:

Erdinç E. Karaçam
25.10.2006, 02:39
...şeklinde değiştirerek yazdırma sayfasındaki problemini de aştık :lol:


... ama bence olacak bu iş. Az daha gayret... :D


Çok güzel.
:D

iso07
25.10.2006, 08:56
Erdiç Hocam,

Tarihle ilgili çözüm için yardımlarınızı bekliyorum.

Erdinç E. Karaçam
25.10.2006, 22:54
Merhaba,

Fikrinizi değiştirmeniz, sayfadaki arama mantığını tamamen değiştirmek durumunda bıraktı. Ama sonuçta yöntem dediğim gibi for-next içinde if-end-if.

Artı olarak, Tarih sütununa tıklayarak A-Z, Z-A sıralama yapabilirsiniz. API kullanmaya gerek bırakmayan kodları da ekledim. Dikkatlice inceleyiniz.

Kolay gelsin.


Dim Limit As Long

Private Sub UserForm_Initialize()
'ComboBox'a aktar
Dim Sayfa As Worksheet
For Each Sayfa In Worksheets
ComboBox1.AddItem Sayfa.Name
Next Sayfa
End Sub


Private Sub CommandButton1_Click()
'ListView'e aktar
Dim Ilk As Date
Dim Son As Date
Dim BakilanSayfa As String
Dim BakilanSayfadakiSonKullanilanSatir As Long
Dim Listviyv As ListItem
Dim i As Long
Dim Toplam1 As Single
Dim Toplam2 As Single
Dim Hucre As Range
ListView1.ListItems.Clear
ListView1.View = lvwReport
Ilk = Format(CDate(Me.TextBox1), "dd/mm/yyyy")
Son = Format(CDate(Me.TextBox2), "dd/mm/yyyy")
BakilanSayfa = Me.ComboBox1.Value
BakilanSayfadakiSonKullanilanSatir = Sheets(BakilanSayfa).Range("C:C").SpecialCells(xlCellTypeLastCell).Row
On Error Resume Next
Set BS = Sheets(BakilanSayfa)
i = 1
For Each Hucre In BS.Range("C2:C" & BakilanSayfadakiSonKullanilanSatir)
If Hucre <= Son And Hucre >= Ilk Then
ListView1.ListItems.Add , , Format&#40;CDate&#40;Hucre.Value&#41;, "dd/mm/yyyy"&#41;
ListView1.ListItems&#40;i&#41;.SubItems&#40;1&#41; = Hucre.Offset&#40;0, 2&#41;.Value
Toplam1 = Toplam1 + CSng&#40;Hucre.Offset&#40;0, 2&#41;.Value&#41;
ListView1.ListItems&#40;i&#41;.SubItems&#40;2&#41; = Hucre.Offset&#40;0, 11&#41;
Toplam2 = Toplam2 + CSng&#40;Hucre.Offset&#40;0, 11&#41;.Value&#41;
i = i + 1
End If
Next Hucre
Me.TextBox3 = Toplam1
Me.TextBox4 = Toplam2
End Sub


Private Sub CommandButton2_Click&#40;&#41;
'Yazdır
'VB6 için LVExportManager gibi programlar var bildiğim kadarıyla, ancak VBA için ben bir yöntem bulamadım.
Dim k As Byte
Dim j As Long
For k = 1 To ListView1.ColumnHeaders.Count
Sheets&#40;"Yazdir"&#41;.Cells&#40;1, k&#41; = ListView1.ColumnHeaders&#40;k&#41;.Text
Next k
For j = 1 To Limit
With Sheets&#40;"Yazdir"&#41;
.Cells&#40;j + 1, 1&#41; = Format&#40;CDate&#40;ListView1.ListItems&#40;j&#41;.Text&#41;, "mm/dd/yyyy"&#41;
.Cells&#40;j + 1, 2&#41; = ListView1.ListItems&#40;j&#41;.SubItems&#40;1&#41;
.Cells&#40;j + 1, 3&#41; = ListView1.ListItems&#40;j&#41;.SubItems&#40;2&#41;
End With
Next j
With Sheets&#40;"Yazdir"&#41;
.Cells&#40;j + 1, 2&#41; = Val&#40;Me.TextBox3&#41;
.Cells&#40;j + 1, 3&#41; = Val&#40;Me.TextBox4&#41;
.PrintOut Copies&#58;=1, Collate&#58;=True
.Cells.ClearContents
End With
End Sub


Private Sub ListView1_ColumnClick&#40;ByVal ColumnHeader As MSComctlLib.ColumnHeader&#41;
Dim SiralanacakListe As MSComctlLib.ListItem
If ColumnHeader.Index = 2 Then
For Each SiralanacakListe In ListView1.ListItems
SiralanacakListe.SubItems&#40;1&#41; = Format$&#40;SiralanacakListe.ListSubItems&#40;1&#41;.Tag, "dd/mm/yyyy"&#41;
Next SiralanacakListe
End If
With ListView1
.SortKey = ColumnHeader.Index - 1
.Sorted = True
If .SortOrder = lvwAscending Then
.SortOrder = lvwDescending
Else
.SortOrder = lvwAscending
End If
End With
If ColumnHeader.Index = 2 Then
For Each SiralanacakListe In ListView1.ListItems
SiralanacakListe.SubItems&#40;1&#41; = CDate&#40;SiralanacakListe.ListSubItems&#40;1&#41;.Tag&#41;
Next SiralanacakListe
End If
End Sub

iso07
26.10.2006, 19:36
Erdinç Hocam,

Teşekkürler zaman ayırdığınız için, elinize sağlık.

Erdinç E. Karaçam
26.10.2006, 20:23
Rica ederiz.