Gefilterde data gebruiken uit excel sheet

Status
Niet open voor verdere reacties.

phobia

Terugkerende gebruiker
Lid geworden
4 sep 2006
Berichten
1.777
Ik heb een excel sheet welke ik filter op datum.
Dit lukt, maar nu wil ik de gefilterde gegevens gaan gebruiken in een listview.

en dat krijg ik dus niet voor elkaar

mijn code
[CPP]
Dim found As Excel.Range
oSheet.AutoFilterMode = False
oSheet.Range("A1:U1").AutoFilter(Field:=3, Criteria1:=">=" & FdateIn, Operator:=Excel.XlAutoFilterOperator.xlAnd, Criteria2:="<=" & FdateOut)
found = oSheet.UsedRange
Dim lRow As Long = 0
With found
lRow = .Range("A" & .Rows.Count).End(Excel.XlDirection.xlUp).Row
End With
MessageBox.Show("The last row in Col A of Sheet1 which has data is " & lRow)

Do Until (found.Cells(tel, 1) Is Nothing)
Dim listItem As ListViewItem = New ListViewItem(oSheet.Cells(tel, 1).value.ToString)
If (Not found.Cells(tel, 16).value = Nothing) Then listItem.SubItems.Add(found.Cells(tel, 16).value.ToString) Else listItem.SubItems.Add("")
If (Not found.Cells(tel, 17).value = Nothing) Then listItem.SubItems.Add(found.Cells(tel, 17).value.ToString) Else listItem.SubItems.Add("")
If (Not found.Cells(tel, 18).value = Nothing) Then listItem.SubItems.Add(found.Cells(tel, 18).value.ToString) Else listItem.SubItems.Add("")
If (Not found.Cells(tel, 5).value = Nothing) Then listItem.SubItems.Add(found.Cells(tel, 5).value.ToString) Else listItem.SubItems.Add("")

Lv_multiview.Items.Add(listItem)
Main.ToolStripProgressBar1.Value = tel
Main.ToolStripStatusLabel2.Text = "Loading: " & tel
tel += 1
Loop
[/CPP]

Als iemand mijn weer een zetje kan geven, zit er al 3 dagen op te klungelen
 
Kun je dan niet beter zelf direct filteren in je code? Anders moet je waarschijnlijk niet range gebruiken, maar specialscells, omdat range niet wordt beinvloed door filtering
 
heb ook al met specialscells zitten spelen, maar op geen manier lukt het mij om de data van de excel naar de listview te krijgen.

Vandaag ook alweer een dag aan het puzzelen geweest en geen stap vooruit gekomen.
 
Welk deel gaat er precies fout? Krijg je de data niet? teveel data? Worden er wel nieuwe tabs aangemaakt op je listview? Ik dacht eerst dat je niet de juiste sortering kreeg, maar uit je tweede post maak ik op dat het mogelijk in de overdracht zit?
 
voor het testen laat ik het excel even zichtbaar zodat ik kan zien of het filter heeft gewerkt.
dat gebeurt ook, van de 1074 blijven er nog 284 zichtbaar.

Het probleem begin als ik uit die 284 rows data wil halen om een listview mee te vullen.
Op elke manier blijf ik de loopen door 1074 records en krijg ik of nix of de hele sheet in de listview.

Maar op geen een manier alleen die 284 rows.

Zelfs bij google vind ik geen hulp!
 
Blijft de mogelijkheid om handmatig gewoon de criteria te checken in je VB code.

Een mogelijkheid die misschien ook werkt is een variant op deze code:

http://support.microsoft.com/kb/150363

Maar omdat je excel niet direct lijkt te gebruiken kun je waarschijnlijk het beste zelf op de date checken
 
het filter werkt tussen 2 datums.
Maar als row.hidden = false ook werkt in vb dan zal ik morgen eens een kijkje nemen.

Vandaag ben ik er wel even klaar mee LOL
 
nog een mislukking!
[CPP]Dim found As Excel.Range
oSheet.AutoFilterMode = False
oSheet.Range("A1:AD1").AutoFilter(Field:=3, Criteria1:=">=" & FdateIn, Operator:=Excel.XlAutoFilterOperator.xlAnd, Criteria2:="<=" & FdateOut)

found = oSheet.AutoFilter.Range.Columns(2).Offset(1, 0).SpecialCells(Excel.XlCellType.xlCellTypeVisible).Cells(1)
MsgBox(found.Rows.Count)

Do Until (found.Cells(tel, 1).value = Nothing)
If (found.Rows.Hidden = False) Then
Dim listItem As ListViewItem = New ListViewItem(oSheet.Cells(tel, 1).value.ToString)
If (Not found.Cells(tel, 16).value = Nothing) Then listItem.SubItems.Add(found.Cells(tel, 16).value.ToString) Else listItem.SubItems.Add("")
If (Not found.Cells(tel, 17).value = Nothing) Then listItem.SubItems.Add(found.Cells(tel, 17).value.ToString) Else listItem.SubItems.Add("")
If (Not found.Cells(tel, 18).value = Nothing) Then listItem.SubItems.Add(found.Cells(tel, 18).value.ToString) Else listItem.SubItems.Add("")
If (Not found.Cells(tel, 5).value = Nothing) Then listItem.SubItems.Add(found.Cells(tel, 5).value.ToString) Else listItem.SubItems.Add("")

Lv_multiview.Items.Add(listItem)
Main.ToolStripProgressBar1.Value = tel
Main.ToolStripStatusLabel2.Text = "Loading: " & tel
tel += 1
End If
Loop
found.Clear()
found = Nothing
oSheet.AutoFilterMode = False[/CPP]
 
Maar je kunt toch ook eenvoudig door alle cellen lopen en van elke lijn bepalen dat de datum tussen twee andere valt?

Code:
            Dim found As Excel.Range
            found = oSheet.UsedRange 
            Do Until (found.Cells(tel, 1).value = Nothing) 'mogelijk overbodig omdat je usedrange gebruikt
                If (found.Cells(tel, 1).value >= date) and ((found.Cells(tel, 1).value <= date) then 'even uit de losse pols. Eventueel kun je met value2 de dagen value krijgen
                    Dim listItem As ListViewItem = New ListViewItem(oSheet.Cells(tel, 1).value.ToString)
                    If (Not found.Cells(tel, 16).value = Nothing) Then listItem.SubItems.Add(found.Cells(tel, 16).value.ToString) Else listItem.SubItems.Add("")
                    If (Not found.Cells(tel, 17).value = Nothing) Then listItem.SubItems.Add(found.Cells(tel, 17).value.ToString) Else listItem.SubItems.Add("")
                    If (Not found.Cells(tel, 18).value = Nothing) Then listItem.SubItems.Add(found.Cells(tel, 18).value.ToString) Else listItem.SubItems.Add("")
                    If (Not found.Cells(tel, 5).value = Nothing) Then listItem.SubItems.Add(found.Cells(tel, 5).value.ToString) Else listItem.SubItems.Add("")
 
                    Lv_multiview.Items.Add(listItem)
                    Main.ToolStripProgressBar1.Value = tel
                    Main.ToolStripStatusLabel2.Text = "Loading: " & tel
                    tel += 1
               End if
            Loop
            found.Clear()
            found = Nothing
            oSheet.AutoFilterMode = False
 
is mogelijk.

Maar dit is mijn uiteindelijke oplossing:
[CPP]If (oSheet.AutoFilterMode = True) Then oSheet.AutoFilterMode = False
'filter
oSheet.Range("A1:AD1").AutoFilter(Field:=3, Criteria1:=">=" & FdateIn, Operator:=Excel.XlAutoFilterOperator.xlAnd, Criteria2:="<=" & FdateOut)

Dim rowcount As Integer
Dim UpperLeftCorner As Excel.Range
' UpperLeftCorner should be set to the upper-left
' corner of the list range:
UpperLeftCorner = oSheet.Range("A1")

rowcount = -1
For Each area In _
UpperLeftCorner.CurrentRegion.SpecialCells(Excel.XlCellType.xlCellTypeVisible).Areas
rowcount = rowcount + area.Rows.Count
Next

'Set progressbar
Main.ToolStripProgressBar1.Maximum = rowcount
tel = 0

For Each row As Excel.Range In UpperLeftCorner.CurrentRegion.SpecialCells(Excel.XlCellType.xlCellTypeVisible).Rows
row.Offset(1, 0).Select()
If (tel > 0) Then 'Skip first row (header)
Dim listItem As ListViewItem = New ListViewItem(row.Cells(1, 1).value.ToString)
If (Not row.Cells(1, 16).value = Nothing) Then listItem.SubItems.Add(row.Cells(1, 16).value.ToString) Else listItem.SubItems.Add("")
If (Not row.Cells(1, 17).value = Nothing) Then listItem.SubItems.Add(row.Cells(1, 17).value.ToString) Else listItem.SubItems.Add("")
If (Not row.Cells(1, 18).value = Nothing) Then listItem.SubItems.Add(row.Cells(1, 18).value.ToString) Else listItem.SubItems.Add("")
If (Not row.Cells(1, 5).value = Nothing) Then listItem.SubItems.Add(row.Cells(1, 5).value.ToString) Else listItem.SubItems.Add("")

Lv_multiview.Items.Add(listItem)
End If
Main.ToolStripProgressBar1.Value = tel
Main.ToolStripStatusLabel2.Text = "Loading: " & tel
tel += 1
Next[/CPP]
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan