Este debate contiene 2 respuestas, tiene 2 mensajes y lo actualizó AngelGil hace 5 años .
-
AutorPublicaciones
-
Hola a todos, tengo hecha una macro que lista carpetas de 1 ruta y después con los datos de la 1 lista saco 2 lista de carpetas. Pero se ve al listar la 2 ruta se guarda en los datos de la 1, nose como hacer que cada una tenga su lista.
Code: arbitrary (select)1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.'mySourcePath es la ruta princpical de la 1 lista
Sub ListMyFiles(mySourcePath)
' List the files and directories within "C:\".
mySourcePath = mySourcePath & "\"
Dim fList As String
Dim fLists As String
Dim fName As String
Dim fNames As String
Dim numero As String
numero = 0
iRow = 2
For inicios = 0 To Total
fName = Dir(mySourcePath, vbDirectory)
' The variable fName now contains the name of the first file or directory within "C:\".
If InStr(fNames, ".") > 0 Then
numero = Left(fNames, InStr(fNames, ".") - 1)
ElseIf InStr(fNames, "..") > 0 Then
numero = Left(fNames, InStr(fNames, "..") - 1)
End If
If numero = "" Then
inicios = 0
End If
Do While fName <> ""
' Store the current file or directory name in the string fList.
fList = fList & vbNewLine & fName
datos = Range("A" & iRow).Value
aux = 0
MsgBox "Ruta 1.1: " & fList
MsgBox "Datos: " & datos
If datos <> fName Then
fName = Dir()
ElseIf datos = fName Then
'la otra ruta modifica para que lista otras carpetas
rutas = mySourcePath & fName & "\ASUNTOS\"
fNames = Dir(rutas, vbDirectory)
Do While fNames <> ""
'fLists = fLists & vbNewLine & fNames
' Get the next file or directory within "C:\".
If InStr(fNames, ".") > 0 Then
numero = Left(fNames, InStr(fNames, ".") - 1)
ElseIf InStr(fNames, "-") > 0 Then
numero = Left(fNames, InStr(fNames, "-") - 1)
ElseIf InStr(fNames, "_") > 0 Then
numero = Left(fNames, InStr(fNames, "_") - 1)
End If
If numero = "" Then
fNames = Dir()
End If
If numero <> "" Then
iRows = 2
For inicio = 0 To Total
dato = Range("B" & iRows).Value
If dato = numero Then
Range("F" & iRows).Value = numero
ruta = fNames + numero
ActiveSheet.Hyperlinks.Add Anchor:=Cells(iRows, "E"), Address:=ruta, TextToDisplay:=numero
End If
If dato <> numero Then
End If
If dato = "" Then
End If
iRows = iRows + 1
Next inicio
fNames = Dir()
End If
Loop
iRow = iRow + 1
End If
Loop
fName = fName
fName = Dir()
iRow = iRow + 1
Next inicios
End SubTotal es cuantos datos hay en las columna E, que lo recorro con un For para comprar los datos, si es igual al nombre de la carpeta.
Busco en sub carpetas si existe un nombre de la columna H, que se llame igual y si es así hago el hipervínculo.
Ejemplo:
Columna E Columna H
500 Alfredo
752 Maria
800 Ana
450 Ethan
1052 AlvaroRutas:
C:\Users\usuario\Documents\500
C:\Users\usuario\Documents\800
C:\Users\usuario\Documents\450
C:\Users\usuario\Documents\500\ASUNTOS\Maria
C:\Users\usuario\Documents\500\ASUNTOS\Alvaro
C:\Users\usuario\Documents\800\ASUNTOS\AnaEn fList me sale:
.
..
500
500Tendría que salir:
.
..
500
752Hola
Hay varias cosas…-Imagino que la variable Total la tendrás declarada como variable global y le asignarás valor en otro procedimiento.
-No sé qué haces con la variable inicios. En principio es el contador del bucle for, pero no la utilizas para nada más. Sin embargo, hay una instrucción que le asigna valor 0. Imagino que será para que no cuente los resultados «.» y «..»
-Tienes dos instrucciones Dir() anidadas. Esto no se puede hacer (que yo sepa) y da error.Hasta donde yo sé, puedes hacer un primer recorrido con Dir() repasando todos los archivos y carpetas del primer nivel, y almacenando cada valor en una lista, un array o un diccionario, como prefieras.
Posteriormente, empieza a recorrer tu array y ahí es donde haces el Dir() de los subdirectorios (en tu caso lo que cuelga dentro de \ASUNTOS\)De todas maneras, obviando todo el trabajo dentro de los directorios, tu bucle es algo así:
Code: arbitrary (select)1.
2.
3.
4.
5.If datos<> fName then
fName = Dir()
Else
Hace muchas cosas
End IfUna nota formal: no te hace falta escribir «ElseIf datos = fName» porque no hay más opciones. O es igual o no. Por lo tanto, con poner un if.. else.. end if sería suficiente.
Y ahora a lo importante: cuando datos = fName, no actualizas fName. Es decir, no le asignas el siguiente valor. Por eso te sale repetido en fList.
Prueba a escribir algo como:Code: arbitrary (select)1.
2.
3.
4.
5.
6.If datos<> fName then
fName = Dir()
Else
Hace muchas cosas
fName = Dir
End IfO mejor:
Un saludo
-
AutorPublicaciones
Debes estar registrado para responder a este debate.