2016-10-18 1 views
0

Meine Benutzer Design Ordnerstruktur in diesem Format zu transformieren:
Tree Wie spezifischen hiearchy Baum Standard hiearchy Baum

würde ich diesen Ordner hiearchy wie Transformation auf "Windows" Format, wie folgt aus:

  • Root \ Ordner1 \ Folder11
  • Root \ Ordner1 \ Folder12
  • Root \ Ordner1 \ Folder13 ....
  • 012.351.

Also habe ich in VBA:

Sub GenerateTree() 
    Dim Level1 As String 
    Dim Level2 As String 
    Dim Level3 As String 

    Dim i As Integer 
    Dim num_line As Integer 
    Dim Result() As String 
    ReDim Result(i) 

    'Init 
    Level1 = ActiveSheet.Range("A2").Value  

    'For each value For num_line = 2 To 11 
     If Len(ActiveSheet.Range("B" & num_line).Value) > 0 Then 'If cell Bx contains something 
      Level2 = ActiveSheet.Range("B" & num_line).Value 'Update Level2 
     End If 
      Level3 = ActiveSheet.Range("C" & num_line).Value 

     'Result(num_line - 2) = Level1 & "/" & Level2 & "/" & Level3 
     ActiveSheet.Range("F" & num_line) = Level1 & "/" & Level2 & "/" & Level3 
    Next num_line 

Aber mein Ergebnis nicht gut ist. enter image description here

Ich habe mehrere Probleme, in meinem Ergebnis:

  • Für Root/Folder2/, ich habe/an diesem Ende. Ich möchte Root/Folder2
  • Ich denke, haben, ich brauche eine Funktion hinzuzufügen, um das Maximum von num_line

ich Ihre Hilfe

Lösung wissen müssen:

Sub GenerateTree() 
    Dim Level1 As String 
    Dim Level2 As String 
    Dim Level3 As String 

    Dim num_line_max As Integer 
    Dim num_line As Integer 
    Dim Result() As String 
    ReDim Result(i) 

    'Init 
    Level1 = ActiveSheet.Range("A2").Value 
    max_line_B = ActiveSheet.Cells(ActiveSheet.Rows.Count, "B").End(xlUp).Row 
    max_line_C = ActiveSheet.Cells(ActiveSheet.Rows.Count, "C").End(xlUp).Row 
    If max_line_B > max_line_C Then 
     num_line_max = max_line_B 
    Else 
     num_line_max = max_line_C 
    End If 

    'For each value 
    For num_line = 2 To num_line_max 
     If Len(ActiveSheet.Range("B" & num_line).Value) > 0 Then 'If cell Bx contains something 
      Level2 = ActiveSheet.Range("B" & num_line).Value 'Update Level2 
     End If 
      Level3 = ActiveSheet.Range("C" & num_line).Value 

     If Level3 <> "" Then 
      ActiveSheet.Range("F" & num_line) = Level1 & "/" & Level2 & "/" & Level3 
     Else 
      ActiveSheet.Range("F" & num_line) = Level1 & "/" & Level2 
     End If 
    Next num_line 



End Sub 
+0

Verwenden Sie nicht IsNull, um zu überprüfen, ob eine Zelle Inhalt hat - etwas wie Len (ActiveSheet.Range ("B" & num_line) .Wert)> 0' funktioniert –

+0

Vielen Dank, ich werde meinen Code in meinem Beitrag – AAzeeze

Antwort

0

1) Der leere Wert ist, weil IsNull für jede Zelle False zurückgibt, da eine leere Zelle alsinterpretiert wirdoder 0. Verwenden Sie IsEmpty oder cell.Value <> "". Natürlich sollten Sie diese Prüfung nicht mit Level3 verwenden, weil Sie möchten, dass das manchmal leer ist.

2) Zu der Hinter / Sie einfach überprüfen könnten, loszuwerden, wenn Level3

If Level3 <> "" Then 
    ActiveSheet.Range("F" & num_line) = Level1 & "/" & Level2 & "/" & Level3 
Else 
    ActiveSheet.Range("F" & num_line) = Level1 & "/" & Level2 
End If 

3) leer

ist gibt es viele Möglichkeiten, um die letzte Reihe zu finden. Die einfachste ist

In Ihrem Fall müssten Sie Zeilen B und C überprüfen und die größere nehmen.

+0

aktualisieren Vielen Dank, es funktioniert – AAzeeze