Newsgroup: it.comp.appl.access
Titolo: prendere il primo file in cima alla lista

salve!
in una cartella ho diversi pdf, che con wba vorrei spostare
in un'atro path.
Il problema è che non riesco a prendere il primo in alto nella
lista, ma solo a random.
Come posso fare?
 
Grazie.
 


non ho ben capito il discorso del primo della lista
se vuoi cmq SPOSTARE il contenuto di una cartella dentro un'altra cartella :
 
     Dim FSO As Object
     Dim Dacartella As String
     Dim Acartella As String
     Dim Fdate As Date
     Dim FileCartella As Object
 
     Dacartella = "c:\sorgente\"
     Acartella = "c:\destinazione\"
 
     Set FSO = CreateObject("scripting.filesystemobject")
 
        For Each FileCartella In FSO.getfolder(Dacartella).Files
         FileCartella.Move Acartella
     Next FileCartella
 
 
dovrai gestire il caso in cui il file sulla cartella destinazione esista 
già se nel tuo caso possono esserci file con lo stesso nome
 
ciao
BFS
 


grazie per la risposta.
Mi spiego meglio;
io devo spostare un pdf alla volta,
aprendolo per poi collocarlo
in un archivio formato da varie cartelle e sottocartelle,
che creo se mancano.
p.e.
MyPath = MyPath & "\" & ftg
If Len(Dir(MyPath, vbDirectory)) = 0 Then
  MkDir (MyPath)
End If
ecc. ecc.
Per leggere il nome del file pdf utilizzo:
MyPath & Dir(MyPath),
ma l'ordine di spostamento non segue alcuna regola.
p.e. se la lista è la seguente:
SKM_C335120052017160_1
SKM_C335120052017160_2
SKM_C335120052017160_3
SKM_C335120052017160_4
SKM_C335120052017160_5
SKM_C335120052017160_6
SKM_C335120052017160_7
SKM_C335120052017160_8
SKM_C335120052017160_9
ecc. ecc.
con
MyPath & Dir(MyPath) 
non mi restituisce: SKM_C335120052017160_1.pdf
ma SKM_C335120052017160_16.pdf,
so che parliamo di variabile string, 
ma come posso fare a scorrere i file iniziando
dal primo in alto e seguendo via, via, l'ordine come nell'esempio
e in pratica l'elenco che ho nella cartella stessa?
 
 
 
 
 
 
 


Dir infatti recupera i nomi senza alcun ordine
dovresti leggere tutti i nomi file prensenti, caricarli in un array, 
ordinare l'array per capire qual'è il primo nome file
 
ciao
BFS
 
 


cosi dovrebbe andare :
 
 
ti carichi un array con tutti i nomi di file presenti nella cartella
 
  Dim FSO As Object
     Dim Dacartella As String
     Dim Acartella As String
 
     Dim FileCartella As Object
     Dim ListaFiles(200) As String
     Dim i As Integer
     i = 0
 
     Dacartella = "c:\tuacartella\"
 
 
     Set FSO = CreateObject("scripting.filesystemobject")
 
     For Each FileCartella In FSO.getfolder(Dacartella).Files
 
         ListaFiles(i) = FileCartella
         i = i + 1
     Next FileCartella
     Array_QuickSort ListaFiles
 
     MsgBox "Primo file " & ListaFiles(0)
 
 
 
e li ordini poi con un algoritmo di ordine array..tipo quick sort
 
Array_QuickSort l'ho copiata senza controllarla ma mi pare funzioni :
 
 
Public Sub Array_QuickSort(ByRef vArrayName As Variant, _
                   Optional ByVal lLower As Long = -1, _
                   Optional ByVal lUpper As Long = -1)
 
Dim vmiddlevalue As Variant
Dim lmiddle As Long
Dim lrowlower As Long
Dim lrowupper As Long
Dim stemp As String
 
    If IsEmpty(vArrayName) = True Then Exit Sub
    If lLower = -1 Then lLower = LBound(vArrayName, 1)
    If lUpper = -1 Then lUpper = UBound(vArrayName, 1)
 
    If lLower < lUpper Then
 
       'lmiddle = lLower
       lmiddle = (lLower + lUpper) / 2
       'lmiddle = VBA.Int(lLower + VBA.Rnd * (lUpper - lLower + 1))
 
       vmiddlevalue = vArrayName(lmiddle)
       lrowlower = lLower
       lrowupper = lUpper
 
       Do While lrowlower < lrowupper
          Do While (vArrayName(lrowupper) >= vmiddlevalue) And 
(lrowlower < lrowupper)
             lrowupper = lrowupper - 1
          Loop
          If (lrowlower <> lrowupper) Then
             stemp = vArrayName(lrowlower)
             vArrayName(lrowlower) = vArrayName(lrowupper)
             vArrayName(lrowupper) = stemp
             lrowlower = lrowlower + 1
          End If
 
          Do While (vArrayName(lrowlower) <= vmiddlevalue) And 
(lrowlower < lrowupper)
             lrowlower = lrowlower + 1
          Loop
          If (lrowlower <> lrowupper) Then
             stemp = vArrayName(lrowupper)
             vArrayName(lrowupper) = vArrayName(lrowlower)
             vArrayName(lrowlower) = stemp
             lrowupper = lrowupper - 1
          End If
       Loop
 
       vArrayName(lrowlower) = vmiddlevalue
       lmiddle = lrowlower
       lrowlower = lLower
       lrowupper = lUpper
 
       If (lrowlower < lmiddle) Then
          Call Array_QuickSort(vArrayName, lrowlower, lmiddle - 1)
       End If
       If (lrowupper > lmiddle) Then
          Call Array_QuickSort(vArrayName, lmiddle + 1, lrowupper)
       End If
    End If
End Sub
 
 


grazie 1000


Aggiungo solo una considerazione... che quello che hai definito "RANDOMICO" in realtà non lo è, semplicemente WINDOWS ha una sua logica di ORDINAMENTO che non è quella applicata da te...!
 
Quando dici "IL PRIMO IN ALTO" per chi sviluppa, non significa NULLA, è una considerazione tua SOGGETTIVA che può esser resa oggettiva solo individuantdo il CRITERIO DI ORDINAZIONE.
 
Quindi il "PRIMO" può essere ordine di 
NOME - DATA - DIMENSIONE (CRESCENTE/DECRESCNETE)
 
 
@Alex


in effetti hai ragione
ma cmq l'unica strada è quella suggerita da BFS
 


ho un problema in questo punto 
ListaFiles(i) = FileCartella
fileCartella mi mostra uno ad uno tutti i file
ma ListaFiles(i) mi da sempre valore ""
 
 

Da dove lo vedi che è vuoto...?
 
Se ti riferisci al MsgBox... punta sempre all'indice zero... anche se dovrebbe essere già riempito.
 
MsgBox "Primo file " & ListaFiles(0) 
 
Credo sia da usare la proprietà Name dell'oggetto FileCartella.
 
Metti magari un Debug.Print nel ciclo For..Next e stampa in Finestra immediata il contenuto.
 
For Each FileCartella In FSO.getfolder(Dacartella).Files
 
     ListaFiles(i) = FileCartella.Name
     Debug.Print ListaFiles(i), FileCartella.Name
     i = i + 1
Next FileCartella 
 
P.S. invece di dimensionare fisso l'array a 200 puoi dinamicamente usare:
 
 FSO.getfolder(Dacartella).Files.Count
 
@Alex


prova cosi, quel quick sort non mi convince.
 
testato e funziona
 
Private Sub Comando1_Click()
 
     Dim FSO As Object
     Dim Dacartella As String
 
     Dim FilesCartella As Object
     Dim FileCartella As Object
 
     Dim i As Integer
     i = 0
 
     Dacartella = "c:\windows\"
 
 
     Set FSO = CreateObject("scripting.filesystemobject")
 
     Set FilesCartella = FSO.getfolder(Dacartella).Files
 
     Dim k As Integer
     k = FilesCartella.Count
     ReDim ListaFiles(k) As String
 
     For Each FileCartella In FilesCartella
 
         ListaFiles(i) = FileCartella.Name
         Debug.Print ListaFiles(i)
         i = i + 1
     Next FileCartella
     SortArray ListaFiles
 
     For i = 1 To k
         Debug.Print ("Posizione " & i & " " & ListaFiles(i))
     Next i
 
     MsgBox "Primo file " & ListaFiles(1)
 
End Sub
 
 
 
Function SortArray(ArrayToSort() As String) As String
 
     Dim First           As Integer
     Dim Last            As Integer
     Dim i               As Integer
     Dim j               As Integer
     Dim Temp            As String
 
     First = LBound(ArrayToSort)
     Last = UBound(ArrayToSort)
     For i = First To Last - 1
         For j = i + 1 To Last
             If ArrayToSort(i) > ArrayToSort(j) Then
                 Temp = ArrayToSort(j)
                 ArrayToSort(j) = ArrayToSort(i)
                 ArrayToSort(i) = Temp
             End If
         Next j
     Next i
 
 
 
End Function
 


così funziona
grazie a tutti
 
 


chiedo scusa
l'ordine che ottengo è questo:
Posizione 1 SKM_C335120051517400_11.pdf
Posizione 2 SKM_C335120051517400_12.pdf
Posizione 3 SKM_C335120051517400_13.pdf
Posizione 4 SKM_C335120051517400_14.pdf
Posizione 5 SKM_C335120051517400_2.pdf
Posizione 6 SKM_C335120051517400_3.pdf
Posizione 7 SKM_C335120051517400_4.pdf
Posizione 8 SKM_C335120051517400_5.pdf
Posizione 9 SKM_C335120051517400_6.pdf
Posizione 10 SKM_C335120051517400_7.pdf
Posizione 11 SKM_C335120051517400_8.pdf
Posizione 12 SKM_C335120051517400_9.pdf
 
non è possibile ottenere l'ordine della cartella?
cioè:
 
Posizione 1 SKM_C335120051517400_2.pdf
Posizione 2 SKM_C335120051517400_3.pdf
Posizione 3 SKM_C335120051517400_4.pdf
Posizione 4 SKM_C335120051517400_5.pdf
Posizione 5 SKM_C335120051517400_6.pdf
Posizione 6 SKM_C335120051517400_7.pdf
Posizione 7 SKM_C335120051517400_8.pdf
Posizione 8 SKM_C335120051517400_9.pdf
Posizione 9 SKM_C335120051517400_11.pdf
Posizione 10 SKM_C335120051517400_12.pdf
Posizione 11 SKM_C335120051517400_13.pdf
Posizione 12 SKM_C335120051517400_14.pdf
ecc. ecc.
grazie


ottieni quel ordine perchè si parla di stringhe
 
se il file si chiama sempre SKM_C335120051517400_xxx
invece di memorizzarti nel array di stringhe il nome file memorizza 
solamente il numero dopo il trattino basso in un array di interi
 
memorizza il numero direttamente nella posizione del array es
il file che finisce per 4 lo metti in listafile(4), il 12 in listafile(12)
 
una volta finito scorri l'array da 1 a xxx il primo valore non vuoto che 
trovi sarà il numero del file al primo posto nella cartella
 
dovrai accodarlo a SKM_C335120051517400_  per ottenere il nome completo 
del file
 
spero di essere stato chiaro
 
BFS
 
 
 
 
 
 
 
 
 


anzi scusa ancora più semplice
 
Set FSO = CreateObject("scripting.filesystemobject")
 
     Set FilesCartella = FSO.getfolder(Dacartella).Files
 
 
     Dim primonome As String
     primonome = "xxx_99999.pdf"
     For Each FileCartella In FilesCartella
 
          If CDbl(Replace(Mid(FileCartella.Name, InStr(1, 
FileCartella.Name, "_") + 1), ".pdf", "")) < CDbl(Replace(Mid(primonome, 
InStr(1, primonome, "_") + 1), ".pdf", "")) Then
             primonome = FileCartella.Name
          End If
     Next FileCartella
     MsgBox "il primo è " & primonome
 
 


OK
grazie


benissimo


Speriamo che i Decimali non servano... bastava un VAL(....)
 
@Alex


un val dove?
 
BFS


scusa p.e.

 BFS
 
Dicevo che non serve convertire in DOUBLE la parte STRINGA del progressivo... "005" dal momento che sono assolutamente INTERI... basta convertirli in NUMERO con VAL(stringa)...
 
@Alex

 
 
 
Quando avete finito co sti messaggi che bisogna scorrere mezz'ora ce lo 
dite eh
Mi si intorciglia il dito indice a srotellare sul mouse


premere "fine" sulla tastiera no? :-)

Roberto usando Google Group nemmeno lo vedo il quote...
 
A prescindere per molti è bene ci sia tutto il messaggio così leggendo imparano... anche se leggere tutto e scrollare costa 1€/rigo...
 
Nel mio browser però è a gratisse sia la lettura che lo scroll...
 
@Alex

      MsgBox "il primo è " & primonome
 
ciao
e per ricavare il secondo record?
grazie


aggiungi
 
Dim secondonome As String
 
e dentro l'if diventa
 
secondonome=primonome
primonome = FileCartella.Name
 
 
 
BFS
 


grazie


credo di fare un'errore, ho fatto cosi:
primonome = "xxx_999.pdf"
 
For Each FileCartella In FilesCartella
 If Val(Replace(Replace(Right(FileCartella.Name, 7), "_", ""), ".pdf", "")) < Val(Replace(Replace(Right(primonome, 7), "_", ""), ".pdf", "")) Then
 secondonome = primonome
 primonome = FileCartella.Name
End If
Next FileCartella
MsgBox "il primo è " & primonome
MsgBox "il secondo è " & secondonome
 
il risultato del primonome è corretto
ma del secondonome no, mi da xxx_999.pdf


hai ragione
i file vanno ciclati due volte tutti. cosi dovremmo esserci
 
 
Dim primonome As String
     Dim secondonome As String
     primonome = "xxx_99999.pdf"
     secondonome = "xxx_99999.pdf"
     For Each FileCartella In FilesCartella
 
          If CDbl(Replace(Mid(FileCartella.Name, InStr(1, 
FileCartella.Name, "_") + 1), ".pdf", "")) < CDbl(Replace(Mid(primonome, 
InStr(1, primonome, "_") + 1), ".pdf", "")) Then
 
             primonome = FileCartella.Name
          End If
     Next FileCartella
 
 
     For Each FileCartella In FilesCartella
         If primonome <> FileCartella.Name Then
             If CDbl(Replace(Mid(FileCartella.Name, InStr(1, 
FileCartella.Name, "_") + 1), ".pdf", "")) < 
CDbl(Replace(Mid(secondonome, InStr(1, secondonome, "_") + 1), ".pdf", 
"")) Then
 
                 secondonome = FileCartella.Name
             End If



grazie 1000
ora va bene