massimo78
27-02-2006, 11:00
Ho un applicazione su Excel strutturata nel seguente modo :
http://img161.imageshack.us/img161/9707/excel4jr.gif
dove abbiamo :
La colonna ID contenente tutti gli identificativi (rami e fogliei).
La colonna Parent_ID che contiene gli id dei rispettivi rami, e G dove si trova il ramo.
Il mio problema è questo :
Devo fare una funzione che dato un ID rimuova il ramo e tutte le foglie sottostanti.
Da qui ho realizzato 2 Sub di cui una ricorsiva.
La prima Remove_Leaf che altro non fa che eliminare la riga contenente una foglia.
Private Sub Remove_Leaf(rmv_gate)
i = 1
With Worksheets("FTA")
While .Range("id").Cells(i).Value <> rmv_gate And .Range("id").Cells(i).Value <> ""
If .Range("id").Cells(i).Value = rmv_gate Then
.Range("id").Cells(i).Select
Selection.EntireRow.Delete
End If
i = i + 1
Wend
Worksheets("FTA").Calculate
End With
End Sub
e l'altra Remove_Node che verifica se è una foglia, se lo è la elimina, altrimenti continua a scorrere i nodi del ramo interessato e si autorilancia.
Public Sub Remove_Node(rmv_gate As String)
i = 1
' se è una foglia toglila con il Remove_Leaf
If IsLeaf(rmv_gate) Then
Remove_Leaf (rmv_gate)
Exit Sub
Else
With Worksheets("FTA")
' cerca tutte le foglie che hanno come id padre l'id del nodo
While (.Range("parent_id").Cells(i).Value <> "")
' se tra gli id padre trovo una G e il corrispettivo id è quello del nodo, elimino l'intera riga
If (.Range("parent_id").Cells(i + 1).Value = "G") And (.Range("id").Cells(i + 1).Value = rmv_gate) Then
.Range("id").Cells(i + 1).Select
Selection.EntireRow.Delete
End If
' se la cella corrente è uguale all'id del nodo richiama ricorsivamente Remove_Node
If (.Range("parent_id").Cells(i).Value = rmv_gate) Then
Remove_Node (.Range("id").Cells(i).Value)
End If
i = i + 1
Wend
End With
End If
End Sub
Ovviamente la funzione IsLeaf funziona correttamente...
il problema è che se al posto di quella riga (nella Remove_Node) inserisco una MsgBox funziona correttamente e mi riporta esattamente TUTTI gli id da rimuovere.
Se la lascio così non funziona :(
Al primo nodo che rimuove si ferma... come se facesse un exit sub.
qualcuno mi può aiutare ?
Che cos'ha la Selection.EntireRow.Delete che non va ?
http://img161.imageshack.us/img161/9707/excel4jr.gif
dove abbiamo :
La colonna ID contenente tutti gli identificativi (rami e fogliei).
La colonna Parent_ID che contiene gli id dei rispettivi rami, e G dove si trova il ramo.
Il mio problema è questo :
Devo fare una funzione che dato un ID rimuova il ramo e tutte le foglie sottostanti.
Da qui ho realizzato 2 Sub di cui una ricorsiva.
La prima Remove_Leaf che altro non fa che eliminare la riga contenente una foglia.
Private Sub Remove_Leaf(rmv_gate)
i = 1
With Worksheets("FTA")
While .Range("id").Cells(i).Value <> rmv_gate And .Range("id").Cells(i).Value <> ""
If .Range("id").Cells(i).Value = rmv_gate Then
.Range("id").Cells(i).Select
Selection.EntireRow.Delete
End If
i = i + 1
Wend
Worksheets("FTA").Calculate
End With
End Sub
e l'altra Remove_Node che verifica se è una foglia, se lo è la elimina, altrimenti continua a scorrere i nodi del ramo interessato e si autorilancia.
Public Sub Remove_Node(rmv_gate As String)
i = 1
' se è una foglia toglila con il Remove_Leaf
If IsLeaf(rmv_gate) Then
Remove_Leaf (rmv_gate)
Exit Sub
Else
With Worksheets("FTA")
' cerca tutte le foglie che hanno come id padre l'id del nodo
While (.Range("parent_id").Cells(i).Value <> "")
' se tra gli id padre trovo una G e il corrispettivo id è quello del nodo, elimino l'intera riga
If (.Range("parent_id").Cells(i + 1).Value = "G") And (.Range("id").Cells(i + 1).Value = rmv_gate) Then
.Range("id").Cells(i + 1).Select
Selection.EntireRow.Delete
End If
' se la cella corrente è uguale all'id del nodo richiama ricorsivamente Remove_Node
If (.Range("parent_id").Cells(i).Value = rmv_gate) Then
Remove_Node (.Range("id").Cells(i).Value)
End If
i = i + 1
Wend
End With
End If
End Sub
Ovviamente la funzione IsLeaf funziona correttamente...
il problema è che se al posto di quella riga (nella Remove_Node) inserisco una MsgBox funziona correttamente e mi riporta esattamente TUTTI gli id da rimuovere.
Se la lascio così non funziona :(
Al primo nodo che rimuove si ferma... come se facesse un exit sub.
qualcuno mi può aiutare ?
Che cos'ha la Selection.EntireRow.Delete che non va ?