Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Come si usano le librerie esterne?

39 views
Skip to first unread message

Pietro

unread,
Dec 23, 2022, 5:48:45 AM12/23/22
to
A volte è necessario mettere qualche spunta nell'editor VBA a qualche
libreria che normalmente non viene sempre usata.
Leggendo una discussione di un altro forum (vecchia) un utente
risolveva un problema ad altro utente in maniera diversa da quanto
richiesto e postando la sua soluzione alternativa. Ho provato a
lanciarla ma a me non funziona, onestamente non so il perchè, ho
pensato a qualche riferimento mancante, come ho premesso.
Volevo chiedere a qualche esperto, in generale, come si fa a capire se
è necessario spuntare qualche libreria che normalmente non è spuntata.
L'errore che a me esce è :
Tipo definito dall'utente non definito

La discussione era sui moduli di classe, argomento a me sconosciuto e
su cui stavo cercando di comprendere qualcosa

issdr

unread,
Dec 23, 2022, 6:20:48 AM12/23/22
to
Pietro wrote:

> A volte è necessario mettere qualche spunta nell'editor VBA a qualche
> libreria che normalmente non viene sempre usata.
> Leggendo una discussione di un altro forum (vecchia) un utente
> risolveva un problema ad altro utente in maniera diversa da quanto
> richiesto e postando la sua soluzione alternativa. Ho provato a
> lanciarla ma a me non funziona, onestamente non so il perchè, ho
> pensato a qualche riferimento mancante, come ho premesso.
> Volevo chiedere a qualche esperto, in generale, come si fa a capire se
> è necessario spuntare qualche libreria che normalmente non è spuntata.
> L'errore che a me esce è :
> Tipo definito dall'utente non definito

puoi condividere il codice e indicare la riga in cui s'interrompe?
(opzione di debug che dovresti avere nel messaggio d'errore che riporti)

Pietro

unread,
Dec 26, 2022, 1:28:24 PM12/26/22
to
> puoi condividere il codice e indicare la riga in cui s'interrompe?
> (opzione di debug che dovresti avere nel messaggio d'errore che riporti)

Il codice che si interrompe è questo, e si interrompe subito nella sub
creaalbero

Dim R As Long
Sub avvia()
Application.ScreenUpdating = False
LR = Cells(Rows.Count, "B").End(xlUp).Row
Range("B8") = "PERCORSO"
Range("C8") = "NOME"
Range("D8") = "EST"
Range("B9:D" & LR).ClearContents
R = 9
CreaAlbero PercorsoDiPartenza:=ThisWorkbook.Path
Application.ScreenUpdating = True
End Sub

Sub CreaAlbero(ByVal PercorsoDiPartenza As String)

Dim FdS As FileSystemObject, mNomeFile As String
Set FdS = New FileSystemObject
Dim cartelle As Folders
Set cartelle = FdS.GetFolder(PercorsoDiPartenza).SubFolders
Dim cartella As Folder
For Each cartella In cartelle
For Each Documento In cartella.Files
ObjPercorso = Replace(Documento.Path, ThisWorkbook.Path, "")
mPosizionePunto = InStrRev(ObjPercorso, ".")
mPosizioneSlash = InStrRev(ObjPercorso, "\")
mFile = Right(ObjPercorso, Len(ObjPercorso) -
mPosizioneSlash)
mEstensione = Right(mFile, Len(ObjPercorso) -
mPosizionePunto)
mNomeFile = Left(mFile, InStr(mFile, ".") - 1)
Cells(R, 2) = Left(ObjPercorso, mPosizioneSlash - 1)
Cells(R, 3) = mNomeFile
Cells(R, 4) = mEstensione
R = R + 1
Next

'Ricorsione. Togliere il REM per attivarla.
CreaAlbero PercorsoDiPartenza:=cartella.Path
Next
On Error Resume Next
ActiveSheet.ListObjects.Add(xlSrcRange, Range("B8:D" & R), ,
xlYes).Name = _
"Table"
On Error GoTo 0
Set FdS = Nothing
Set cartelle = Nothing
Set cartella = Nothing
Set Documento = Nothing
End Sub

Bruno Campanini

unread,
Dec 27, 2022, 12:20:28 AM12/27/22
to
Pietro was thinking very hard :
>> puoi condividere il codice e indicare la riga in cui s'interrompe?
>> (opzione di debug che dovresti avere nel messaggio d'errore che riporti)
>
> Il codice che si interrompe è questo, e si interrompe subito nella sub
> creaalbero
>
> Dim R As Long
> Sub avvia()
> Application.ScreenUpdating = False
> LR = Cells(Rows.Count, "B").End(xlUp).Row
> Range("B8") = "PERCORSO"
> Range("C8") = "NOME"
> Range("D8") = "EST"
> Range("B9:D" & LR).ClearContents
> R = 9
> CreaAlbero PercorsoDiPartenza:=ThisWorkbook.Path
> Application.ScreenUpdating = True
> End Sub
>
> Sub CreaAlbero(ByVal PercorsoDiPartenza As String)
>
> Dim FdS As FileSystemObject, mNomeFile As String

FileSystemObject richiede la Reference: Microsoft Scripting Runtime

Non ho guardato ad altro.

Bruno

issdr

unread,
Dec 27, 2022, 8:03:48 AM12/27/22
to
Pietro wrote:

> Sub CreaAlbero(ByVal PercorsoDiPartenza As String)
>
> Dim FdS As FileSystemObject, mNomeFile As String
> Set FdS = New FileSystemObject
> Dim cartelle As Folders
> Set cartelle = FdS.GetFolder(PercorsoDiPartenza).SubFolders
> Dim cartella As Folder
> For Each cartella In cartelle

Sub CreaAlbero(ByVal PercorsoDiPartenza As String)

Dim FdS As Object, cartelle As Object, cartella As Object
Dim mPosizionePunto As String, mPosizioneSlash As String
Dim mFile As String, mEstensione As String, mNomeFile As String
Set FdS = CreateObject("Scripting.FileSystemObject")
Set cartelle = FdS.GetFolder(PercorsoDiPartenza).SubFolders

Bruno Campanini

unread,
Dec 27, 2022, 1:59:09 PM12/27/22
to
issdr laid this down on his screen :
Dopo aver attivato la Library, io procedo sempre così:
Dim Fds As New FileSystemObject.
Analogamente per "svuotarlo", dovendolo poi riutilizzare:
Set Fds As New FileSystemObject.

Questione di gusti

Bruno

issdr

unread,
Dec 27, 2022, 3:03:56 PM12/27/22
to
Bruno Campanini wrote:

> Dopo aver attivato la Library, io procedo sempre così:
> Dim Fds As New FileSystemObject.
> Analogamente per "svuotarlo", dovendolo poi riutilizzare:
> Set Fds As New FileSystemObject.

ciò che ho scritto (male) evita di dover attivare la library, come
richiesto dall'op (che comunque fa puntare gli oggetti a nothing in
chiusura)

Bruno Campanini

unread,
Dec 27, 2022, 7:10:46 PM12/27/22
to
It happens that issdr formulated :
Questione di gusti, come ho già detto.

Comunque lasciami polemizzare un po' su certi aspetti della
circostanza:
1 - "ricorsione" nella lingua italiana non esiste; è di appena
un pelino meno brutta di "scannerizzare", et alias;
2 - far "puntare gli oggetti a nothing in chiusura" non serve a nulla:
quando si chiude la porta tutti gli oggetti creati si annullano.
Provare per credere!
3 - Nè vale la "ricorsione" a tenerli aperti e poi chiuderli al termine
della ricorsività, poiché questa non oltrepassa l'ultimo NEXT e
tutti i Nothing sono a questo successivi.
4 - Non ha senso il rammarico dell'OP circa la sua misconoscenza
dei moduli di classe: non c'è nulla che si possa fare con quelli
che non si possa analogamente fare senza di loro.
A

issdr

unread,
Dec 28, 2022, 2:01:28 AM12/28/22
to
Bruno Campanini wrote:

>> ciò che ho scritto (male) evita di dover attivare la library, come
>> richiesto dall'op (che comunque fa puntare gli oggetti a nothing in
>> chiusura)
>
> Questione di gusti, come ho già detto.

anche di praticità in realtà, tanto che il late binding viene suggerito
su vari manuali

> Comunque lasciami polemizzare un po' su certi aspetti della
> circostanza:
> 1 - "ricorsione" nella lingua italiana non esiste; è di appena
> un pelino meno brutta di "scannerizzare", et alias;

brutte entrambe, vero, ma meno di "basico" per "basilare". la lingua è
convenzione, alla fine vinceranno i "piuttosto che" disgiuntivi, per
motivi statistici. "ricorsione" per "chiamata ricorsiva" è sui libri da
almeno 30 anni; la treccani non la mette in vocabolario, ma sta
sull'enciclopedia

> 2 - far "puntare gli oggetti a nothing in chiusura" non serve a nulla:
> quando si chiude la porta tutti gli oggetti creati si annullano.
> Provare per credere!

ti credo (e non l'ho fatto io; gli oggetti li lascio fluttuare senza
nome talvolta)

> 3 - Nè vale la "ricorsione" a tenerli aperti e poi chiuderli al termine
> della ricorsività, poiché questa non oltrepassa l'ultimo NEXT e
> tutti i Nothing sono a questo successivi.

non è esattamente così, una volta "raggiunto il fondo" si torna
indietro, ed ogni contesto aperto vede l'esecuzione di quelle
assegnazioni al nulla (che hai già detto non servire)

> 4 - Non ha senso il rammarico dell'OP circa la sua misconoscenza
> dei moduli di classe: non c'è nulla che si possa fare con quelli
> che non si possa analogamente fare senza di loro.

un linguaggio è buono perché permette di riutilizzare codice, perché è
leggibile, o sintetico. non usarne i vantaggi può significare dover
reinventare l'acqua calda ogni volta che si affronta un dato problema



0 new messages