Condividi:        

condizione if con operatori and e or

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

condizione if con operatori and e or

Postdi miko » 03/04/25 13:48

Buonasera,
con un ciclo For scorro solo i vari moduli standard e di classe presenti in una cartella;
vorrei però selezionare solo alcuni di essi, ed escludere ad esempio Modulo1, Modulo2, Modulo3 etc..
ho scritto quanto segue:

Codice: Seleziona tutto
....
For Each VBComp In .VBComponents
If ((VBComp.Type = vbext_ct_StdModule)  Or (VBComp.Type = vbext_ct_ClassModule)) _
                      And (VBComp.CodeModule.Name <> "Modulo1") _
                      And (VBComp.CodeModule.Name <> "Modulo2") _
                      And (VBComp.CodeModule.Name <> "Modulo3") Then

        MsgBox VBComp.Name
.....
       

ma non funziona la condizione If perchè nel ciclo For esclude solo il Modulo1 e non anche gli atri.
ho provato con altri operatori, ma non ottengo il risultato che mi aspetto.
come faccio a modificare la condizione If, mantenendo la prima condizione Or se possibile, in una forma
compatta senza ricorrere ad altri If annidati o Select Case?
saluti grazie
windows 10 - office 2013
miko
Utente Senior
 
Post: 533
Iscritto il: 29/12/09 10:44

Sponsor
 

Re: condizione if con operatori and e or

Postdi Anthony47 » 03/04/25 23:10

A me pare che gia’ la prima condizione dell’ If restituira’ sempre FALSO, per cui se il tuo codice misterioso deve attivarsi quando tutto e’ VERO allora non si attivera’ mai; a meno che vbext_ct_StdModule e vbext_ct_ClassModule (che sono delle keyword vba) tu le hai dichiarate “Variabili” o “Costanti” vba assegnandogli rispettivamente i valori numerici 1 e 2 (ma tu hai inserito nel tuo vba dei “moduli di classe”, che non siano i moduli vba dei fogli e del workbook? Perche’ invece questi altri moduli sono caratterizzati dal type = 100)
Insomma QUEL ciclo secondo me non produrra’ mai una condizione VERO

Secondo me dovresti usare
Codice: Seleziona tutto
For Each VBComp In .VBComponents
    If ((VBComp.Type = 1) Or (VBComp.Type = AAA)) _
                          And (VBComp.CodeModule.Name <> "Modulo1") _
                          And (VBComp.CodeModule.Name <> "Modulo2") _
                          And (VBComp.CodeModule.Name <> "Modulo3") Then

        ‘Il codice da eseguire
       
    End If
Next VBComp

Al posto di AAA scriverai:
3 se vuoi indicare tuoi moduli di classe
100 se vuoi indicare i moduli vba dei vari fogli o del workbook (tecnicamente sono “moduli di classe”)
Avatar utente
Anthony47
Moderatore
 
Post: 19584
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: condizione if con operatori and e or

Postdi miko » 04/04/25 04:48

Buongiorno,
il codice misterioso è costituito da qualche altra semplice riga che ritenevo inutile inserire
focalizzando il problema sulla condizione che crea problemi
il codice integrale è quello che segue in cui ho sostituito la tua condizione IF

Codice: Seleziona tutto
Sub SELEZIONA_MODULI()

Dim VBComp As VBComponent

If TypeName(ThisWorkbook) = "Nothing" Then Exit Sub

With ThisWorkbook.VBProject

For Each VBComp In .VBComponents

If ((VBComp.Type = 1) Or (VBComp.Type = 100)) _
                          And (VBComp.CodeModule.Name <> "Modulo1") _
                          And (VBComp.CodeModule.Name <> "Modulo2") _
                          And (VBComp.CodeModule.Name <> "Modulo3") Then

MsgBox VBComp.Name

'Call AddLineNumbers

End If

    Next VBComp
 
  End With
 
End Sub

per il funzionamento ho attivato
Microsoft Visual Basic for Applications Extensibility library
attualmente non ho moduli di classe.
tuttavia anche la tua la condizione if non funziona in quanto esclude i moduli dei fogli, quello del Workbook
ed il Modulo1, mentre continua a selezionare i Modulo2 e Modulo3 che invece devono essere anche esclusi.
la macro AddLineNumbers è inesistente perchè tutta da realizzare, per questo ho inserito la msgbox.
sto cercando di realizzare un codice che aggiunge i numeri di linea alle righe di codice di alcune macro-moduli
escludendo quelle di altri moduli.
ma credo che non mi sarà possibile perchè mi sto studiando gli argomenti al riguardo, molte cose tecniche,
e se per una semplice condizione if ho problemi figuriamoci per quelle cose più complesse.
saluti grazie
windows 10 - office 2013
miko
Utente Senior
 
Post: 533
Iscritto il: 29/12/09 10:44

Re: condizione if con operatori and e or

Postdi Anthony47 » 04/04/25 09:05

Premessa: ThisWorkbook.VBProject fa riferimento al progetto vba del workbook che contiene le macro. Se cerchi di far riferimento ad altri workbooks devi usare ActiveWorkbook.VBProject

A me il codice funziona secondo le previsioni.
Ho usato per debug il seguente codice:
Codice: Seleziona tutto
Sub Pippa()
Debug.Print
For Each VBComp In ActiveWorkbook.VBProject.VBComponents
    If ((VBComp.Type = 1) Or (VBComp.Type = 100)) _
                          And (VBComp.CodeModule.Name <> "Modulo1") _
                          And (VBComp.CodeModule.Name <> "Modulo2") _
                          And (VBComp.CodeModule.Name <> "Modulo3") Then
                                 
        Debug.Print "Eseguo su: #" & VBComp.CodeModule.Name & "#"
   
    Else
   
        Debug.Print "Skippo: #" & VBComp.CodeModule.Name & "#"
       
    End If
Next VBComp
Debug.Print ("COMPLETATO su " & ActiveWorkbook.Name)
End Sub

Durante l'esecuzione scrivo sulla "finestra Immediata" del vba i nomi dei fogli che seleziono e quelli che invece skippo.
A fine esecuzione io (col mio workbook di test) nella finestra Immediata leggo:
Codice: Seleziona tutto
Eseguo su: #Questa_cartella_di_lavoro#
Eseguo su: #Foglio1#
Eseguo su: #Foglio2#
SKIPPO: #Modulo1#
Eseguo su: #Foglio3#
Eseguo su: #Foglio4#
Eseguo su: #Modulo22#
SKIPPO: #Modulo2#
SKIPPO: #Modulo3#
COMPLETATO su TestWB.xlsm

Ho incapsulato i nomi fogli tra # # in modo che puoi verificare l'effettivo nome dei fogli

La "finestra Immediata" non e' aperta di default sul vba; per aprirla, dalla finestra del vba, dovrebbe bastare premere Contr-g oppure usare Menu /Visualizza /Finestra Immediata

Usa la Sub Pippa per documentare quali moduli vengono esaminati, quali selezionati e quali skippati; se non ti si accende nessuna lucina pubblica una immagine da cui si vede il contenuto del vbaProject del file in esame piu' il contenuto della finestra Immediata quando si esegue la Sub Pippa (solo l'ultimo blocco, dalla riga vuota alla fine)
Avatar utente
Anthony47
Moderatore
 
Post: 19584
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: condizione if con operatori and e or

Postdi miko » 04/04/25 14:36

Salve,
non avevo dubbi sul tuo codice, le tue macro funzionano sempre bene al primo colpo
volevo solo informarti che con il mio excel non funzionava.
ho allora creato una nuova cartella con vari fogli e moduli ed in uno di questi ho inserito
la sub Pippa ed ottengo i tuoi stessi risultati
tutto funziona perfettamente sia con il riferimento ad ...Applications Extensibility library che senza
non capisco perchè nella cartella precedente non funzionava.
devo solo capire qual'è la priorità degli operatori and e or perchè ho notato che cambiando la loro posizione
cambia il risultato
saluti grazie
windows 10 - office 2013
miko
Utente Senior
 
Post: 533
Iscritto il: 29/12/09 10:44


Torna a Applicazioni Office Windows


Topic correlati a "condizione if con operatori and e or":


Chi c’è in linea

Visitano il forum: Nessuno e 27 ospiti