Condividi:        

Macro riporta testo specifico se condizione

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

Macro riporta testo specifico se condizione

Postdi systemcrack » 10/09/24 07:55

Buongiorno a tutti,
mi sono bloccato nella costruzione di una macro che rilevi in colonna F se sono contenute alcune parole (SERBIA, BOSNIA, ecc) e nel caso siano presenti venga riportato in colonna N, sulla stessa riga, la dicitura "PRECEDENZA T1".
Per fare questo ho scritto il codice in questo modo:
Codice: Seleziona tutto
If Not Intersect(Target, Range("F2:F201")) Is Nothing Then Exit Sub
       If Cells(Riga, 6).Value = "SERBIA" Then
          Cells(Riga, 13).Value = "PRECEDENZA T1"
       End If
       If Cells(Riga, 6).Value = "BOSNIA" Then
          Cells(Riga, 13).Value = "PRECEDENZA T1"
       End If
End If

Ma ricevo un errore in cui viene indicato l'ultimo End If come di troppo.. ma non capisco il perchè dal momento che ci sono tutte le aperture e le chiusure (dell' If).

Immagine

Andando per tentativi (a casaccio :roll: ) ho provato anche così:
Codice: Seleziona tutto
If Not Intersect(Target, Range("F2:F201")) Is Nothing Then Exit Sub
       If Cells(Riga, 6).Value = "SERBIA" Then
          Cells(Riga, 13).Value = "PRECEDENZA T1"
       Else
       If Cells(Riga, 6).Value = "BOSNIA" Then
          Cells(Riga, 13).Value = "PRECEDENZA T1"
       End If
End If

Non ricevo errore, ma la macro non fa il suo dovere.
Che il problema sia legato al resto del codice che compone Private Sub Worksheet_Change?

Per completezza riporto di seguito tutto il codice che compone la Worksheet_Change e dove ho piazzato il pezzo di macro incriminato:
Codice: Seleziona tutto
Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Count = 1 Then
    If Not Intersect(Target, Range("B2:P201")) Is Nothing Then
        Select Case Target.Column
            Case Is = 2                         'B..
                Target.Offset(0, 1).Select      '..C
            Case Is = 3                         'C..
                Target.Offset(0, 3).Select      '..F
            Case Is = 6                         'F..
                Target.Offset(0, 2).Select      '..H
            Case Is = 8                         'H..
                Target.Offset(0, 1).Select      '..I
            Case Is = 9                         'I..
                Target.Offset(0, 7).Select      '..P
            Case Is = 16                        'P..
                Target.Offset(1, -14).Select    '..B+1
        End Select
    End If
End If

If Target.Count = 1 Then
    If Target.Column = 2 Then
        Application.EnableEvents = False
        Call Pusher(Target.Value, "|", Target.Row)
        Application.EnableEvents = True
    End If
End If

Dim cvArea As String, cvElenco As Range, myCk
Dim DizArea As Range
'
'Parametri>>>:
cvArea = "H2:H201"                                       'Area Convalidata
Set cvElenco = Sheets("MERCI").Range("B16:B100")       'Area con le voci di convalida
Set DizArea = Sheets("MERCI").Range("D2:E50")        'Area del Dizionario
'
'Controlla se va fatta la verifica:
If Target.Count = 1 And (Not Application.Intersect(Target, Range(cvArea)) Is Nothing) Then
    myCk = Application.WorksheetFunction.CountIf(cvElenco, Target.Value)    'Controlla se l'input e' in elenco
    If myCk = 0 And Target.Value <> "" Then                                 'Non c'è
        Application.EnableEvents = False
        myCk = Application.VLookup(Target.Value, DizArea, 2, False)         'Cerca.Vert nel dizionario
        If IsError(myCk) Then                                               'Non c'è:
            With cvElenco.Cells(1, 1).End(xlDown).Offset(1, 0)              'Va in fondo all'elenco...
                .Value = Target.Value                                       '...ci aggiunge quel valore
                .Interior.Color = RGB(255, 200, 200)                        '...e lo coloora in rossastro
            End With
        Else                                                                'Se trova quella voce...
            Target.Value = myCk                                             '...sostituisce l'input
        End If
        Application.EnableEvents = True
    End If
End If

If Not Intersect(Target, Range("F2:F201")) Is Nothing Then Exit Sub
       If Cells(Riga, 6).Value = "SERBIA" Then
          Cells(Riga, 13).Value = "PRECEDENZA T1"
       Else
       If Cells(Riga, 6).Value = "BOSNIA" Then
          Cells(Riga, 13).Value = "PRECEDENZA T1"
       End If
End If

End Sub
Avatar utente
systemcrack
Utente Senior
 
Post: 435
Iscritto il: 27/07/17 09:40

Sponsor
 

Re: Macro riporta testo specifico se condizione

Postdi Anthony47 » 10/09/24 09:58

Il primo If si apre e si chiude nella stessa riga, quindi l’ultimo End If non ha nessun If da chiudere e va eliminato
Vedi https://learn.microsoft.com/it-it/offic ... -statement

Se hai poche parole da controllare va bene una sequela di If then / End if; altrimenti puoi optare per creare un elenco di termini che poi scansioni in un loop; del tipo:
Codice: Seleziona tutto
Dim myList, I As Long


myList = Array("SERBIA", "BOSNIA", "Etc")
If Target.Count = 1 Then            '1
    If Not Intersect(Target, Range("F2:F201")) Is Nothing Then Exit Sub
    For I = 0 To UBound(myList)
        If InStr(1, Cells(Target.Row, 6).Value, myList(I), vbTextCompare) > 0 Then
            Cells(Target.Row, 13).Value = "PRECEDENZA T1"
            Exit For
        End If
    Next I
End If                              'chiude 1
Avatar utente
Anthony47
Moderatore
 
Post: 19375
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Macro riporta testo specifico se condizione

Postdi systemcrack » 10/09/24 10:57

Anthony47 ha scritto:Il primo If si apre e si chiude nella stessa riga, quindi l’ultimo End If non ha nessun If da chiudere e va eliminato
Vedi https://learn.microsoft.com/it-it/offic ... -statement

Abbi pazienza Anthony, ma questa non l'ho capita.. :undecided:
Codice: Seleziona tutto
If Not Intersect(Target, Range("F2:F201")) Is Nothing Then Exit Sub

Sicuramente la tua soluzione è più elegante e performante, ma per capire bene, se avessi voluto proseguire per la mia soluzione, come avrei dovuto fare per farla funzionare..
Avatar utente
systemcrack
Utente Senior
 
Post: 435
Iscritto il: 27/07/17 09:40

Re: Macro riporta testo specifico se condizione

Postdi Anthony47 » 10/09/24 11:42

L'istruzione If Not Intersect(Target etc etc si completa nella sua riga; quindi l'ultimo If va eliminato e basta.

Poi se hai pochi termini va benissimo quello che avevi fatto:
Codice: Seleziona tutto
       If Cells(Riga, 6).Value = "SERBIA" Then
          Cells(Riga, 13).Value = "PRECEDENZA T1"
       End If
       If Cells(Riga, 6).Value = "BOSNIA" Then
          Cells(Riga, 13).Value = "PRECEDENZA T1"
       End If
(sarebbe piu' efficiente usando If Then /ElseIf then /... /End If ma con pochi termini e' piu' il tempo che si perde a pensarlo che quello che si guadagna nei prossimi 2 anni)
Avatar utente
Anthony47
Moderatore
 
Post: 19375
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Macro riporta testo specifico se condizione

Postdi systemcrack » 10/09/24 12:03

Grazie Anthony, sicuramente seguirò il tuo consiglio, ma prima voglio fare due prove per capire perché prima non sono riuscito a farlo andare. Infatti tra i test (non menzionati) che ho fatto c'era anche il togliere l'ultimo End If, ma non funzionava comunque.. ti saprò dire più tardi dopo aver fatto tutte le prove del caso.

P.s.
Buon pranzo!
Avatar utente
systemcrack
Utente Senior
 
Post: 435
Iscritto il: 27/07/17 09:40

Re: Macro riporta testo specifico se condizione

Postdi systemcrack » 10/09/24 16:32

Dopo aver fatto qualche prova sia con il "mio codice corretto" che con il tuo e purtroppo in colonna 13 non compare la dicitura sebbene non dia più errore..
Avatar utente
systemcrack
Utente Senior
 
Post: 435
Iscritto il: 27/07/17 09:40

Re: Macro riporta testo specifico se condizione

Postdi Anthony47 » 10/09/24 17:25

Gli e' che questa istruzione e' sbagliata:
Codice: Seleziona tutto
If Not Intersect(Target, Range("F2:F201")) Is Nothing Then Exit Sub

Togli Not e riprova
Avatar utente
Anthony47
Moderatore
 
Post: 19375
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Macro riporta testo specifico se condizione

Postdi systemcrack » 10/09/24 17:46

Anthony47 ha scritto:Gli e' che questa istruzione e' sbagliata:
Codice: Seleziona tutto
If Not Intersect(Target, Range("F2:F201")) Is Nothing Then Exit Sub

Togli Not e riprova

Beh però con il codice fornito da te
Codice: Seleziona tutto
Dim myList, I As Long


myList = Array("SERBIA", "BOSNIA", "Etc")
If Target.Count = 1 Then            '1
    If Not Intersect(Target, Range("F2:F201")) Is Nothing Then Exit Sub
    For I = 0 To UBound(myList)
        If InStr(1, Cells(Target.Row, 6).Value, myList(I), vbTextCompare) > 0 Then
            Cells(Target.Row, 13).Value = "PRECEDENZA T1"
            Exit For
        End If
    Next I
End If                              'chiude 1

dovrebbe andare ed invece non compare nulla nemmeno così, (ma non da erroe).
Nel frattempo ho fatto la prova seguendo il tuo ultimo consiglio (cioè provando con il "mio codice" con le modifiche da te consigliate), ma oltre a non scrivere il testo in colona 13 ricevo un errore di RunTime 1004 e nel debug mi viene evidenziata questa riga:
Codice: Seleziona tutto
If Cells(Riga, 6).Value = "SERBIA" Then

Errore che ricevo sia se provo ad immettere SERBIA o BOSNIA, sia se immetto un qualsiasi altro testo sia se lo cancello.
Sarò sincero pensavo fosse più semplice.. :undecided:

Ma non voglio arrendermi. 8)

Per completezza allego il file (SCHEMA ENTRATE) su cui vorrei apportare la modifica.
Avatar utente
systemcrack
Utente Senior
 
Post: 435
Iscritto il: 27/07/17 09:40

Re: Macro riporta testo specifico se condizione

Postdi Anthony47 » 10/09/24 20:15

Il Not e' da togliere anche al mio codice (sì, confesso che alcune istruzioni le ho copiate dal tuo codice di partenza)

Quanto all'errore sull'istruzione If Cells(Riga, 6).Value = "SERBIA" Then , beh dipende da come hai compilato Riga. Ma in effetti, guardando la Sub Worksheet_Change completa che avevi pubblicato all'inizio, Riga e' una variabile non compilata, vuota, e quindi non puo' essere usata come parametro di Cells; usa Target.Row invece che Riga.
Avatar utente
Anthony47
Moderatore
 
Post: 19375
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Macro riporta testo specifico se condizione

Postdi systemcrack » 10/09/24 21:08

Anthony47 ha scritto:Il Not e' da togliere anche al mio codice (sì, confesso che alcune istruzioni le ho copiate dal tuo codice di partenza)

Sono un pollo! Non ci avevo fatto proprio caso.. :aaah
Anthony47 ha scritto:Quanto all'errore sull'istruzione If Cells(Riga, 6).Value = "SERBIA" Then , beh dipende da come hai compilato Riga. Ma in effetti, guardando la Sub Worksheet_Change completa che avevi pubblicato all'inizio, Riga e' una variabile non compilata, vuota, e quindi non puo' essere usata come parametro di Cells; usa Target.Row invece che Riga.

Ok.. testerò i tuoi consigli.
Grazie e per il momento buona serata. ;)

5 MIN dopo
Ho fatto alcune prove ed ora funziona.. rimane un'ultima cosa da sistemare:
In pratica se scrivo solo SERBIA o BOSNIA funziona, ma in realtà quando si compilerà quel campo non sarà mai solo una delle due parole, ma "TESTO VARIO / SERBIA" oppure "TESTO VARIO / BOSNIA".
Avatar utente
systemcrack
Utente Senior
 
Post: 435
Iscritto il: 27/07/17 09:40

Re: Macro riporta testo specifico se condizione

Postdi Anthony47 » 10/09/24 22:37

Allora usa la mia versione, che usa INSTR per cercare se la cella contiene quella parola
Avatar utente
Anthony47
Moderatore
 
Post: 19375
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Macro riporta testo specifico se condizione

Postdi systemcrack » 11/09/24 07:45

Anthony47 ha scritto:Allora usa la mia versione, che usa INSTR per cercare se la cella contiene quella parola

Ok..

Volevo chiederti un'ultima cosa che non mi è chiara..
facendo le prove mi sono accorto che il comando in cui indico la colonna N, in cui riportare il testo e che dovrebbe essere la 13 invece non funziona.. cioè riporta il testo nella colonna prima.. perchè?
Ovviamente ho risolto indicando la colonna in cui riportare il testo come nr.14, ma volevo chiederti il perchè di questa particolarità.

Grazie e buona giornata.
Avatar utente
systemcrack
Utente Senior
 
Post: 435
Iscritto il: 27/07/17 09:40

Re: Macro riporta testo specifico se condizione

Postdi Anthony47 » 11/09/24 09:57

Ok..
Tieni presente che con INSTR c'e' il rischio di trovare RUSSIA anche se c'e' scritto BIELORUSSIA. Se credi che, nella tua situazione reale, il rischio esista allora esiste anche un rimedio

facendo le prove mi sono accorto che il comando in cui indico la colonna N, in cui riportare il testo e che dovrebbe essere la 13 invece non funziona.. cioè riporta il testo nella colonna prima.. perchè?
Non sono un chiaroveggente, e senza vedere quello che hai scritto non ho una risposta attendibile.
Certo, se avessi scritto Cells(Target.Row, N) allora N e' una variabile e il comportamento dipende dal contenuto della variabile
Se hai scritto Cells(Target.Row, "N") allora N e' una stringa e viene (nel contesto) convertita in "colonna N"
Avatar utente
Anthony47
Moderatore
 
Post: 19375
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Macro riporta testo specifico se condizione

Postdi systemcrack » 11/09/24 10:30

Il codice che ho scritto è quello che ho riportato qualche post sopra. Ma la stessa situazione si va a creare anche con il codice che mi hai passato tu a cui ho cambiato il dato 13 con 14 perché riporti il dato nella colonna giusta.
Avatar utente
systemcrack
Utente Senior
 
Post: 435
Iscritto il: 27/07/17 09:40

Re: Macro riporta testo specifico se condizione

Postdi systemcrack » 11/09/24 10:55

Anthony47 ha scritto:Tieni presente che con INSTR c'e' il rischio di trovare RUSSIA anche se c'e' scritto BIELORUSSIA. Se credi che, nella tua situazione reale, il rischio esista allora esiste anche un rimedio

Vista la situazione geopolitica internazionale non credo che avremo questo problema.. per il momento la maggior parte dei viaggi extra ue che facciamo è per la bosnia, serbia e svizzera.

Mi riservo la possibilità di tornare sull'argomento nel caso in cui dovessero presentarsi nuove combinazioni. ;)

Grazie Anthony.
Avatar utente
systemcrack
Utente Senior
 
Post: 435
Iscritto il: 27/07/17 09:40

Re: Macro riporta testo specifico se condizione

Postdi Anthony47 » 11/09/24 14:57

Il codice che ho scritto è quello che ho riportato qualche post sopra. Ma la stessa situazione si va a creare anche con il codice che mi hai passato tu a cui ho cambiato il dato 13 con 14 perché riporti il dato nella colonna giusta
Non ho capito se il risultato va nella posizione giusta o non ancora
Avatar utente
Anthony47
Moderatore
 
Post: 19375
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Macro riporta testo specifico se condizione

Postdi systemcrack » 11/09/24 16:42

Se metto colonna 14 si ma N sarebbe 13 a meno che io non stia prendendo un abbaglio.. volevo capire perché usare un numero in più per "centrare" una colonna che in realtà sarebbe un numero in meno.. spero non sembri mi sia venuto un ictus mentre scrivo :lol:
Avatar utente
systemcrack
Utente Senior
 
Post: 435
Iscritto il: 27/07/17 09:40

Re: Macro riporta testo specifico se condizione

Postdi Anthony47 » 11/09/24 16:58

Se metto colonna 14 si ma N sarebbe 13 a meno che io non stia prendendo un abbaglio
La seconda che hai detto? :D :D

Infatti:
Codice: Seleziona tutto
A=1; B=2; C=3; D=4; E=5; F=6; G=7; H=8; I=9; J=10; K=11; L=12; M=13; N=14; O=15; P=16; Q=17; R=18; S=19; T=20; U=21; V=22; W=23; X=24; Y=25; Z=26
Avatar utente
Anthony47
Moderatore
 
Post: 19375
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Macro riporta testo specifico se condizione

Postdi systemcrack » 12/09/24 10:05

Beh dai.. a 45 anni ho già iniziato a zavagliare tipo vecchio malato di alzheimer :lol: :lol: :lol:
Avatar utente
systemcrack
Utente Senior
 
Post: 435
Iscritto il: 27/07/17 09:40


Torna a Applicazioni Office Windows


Topic correlati a "Macro riporta testo specifico se condizione":


Chi c’è in linea

Visitano il forum: raimea e 6 ospiti