Condividi:        

Problema con apertura MsgBox con duplice 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

Problema con apertura MsgBox con duplice condizione

Postdi systemcrack » 13/10/24 17:28

Buona domenica a tutti,
venerdi alla fine delle ore lavorative uno dei colleghi con cui collaboro si è finalmente sbottonato lanciando qualche idea su possibili aggiunte che si potrebbero fare ad uno schema di cui ho parlato più e più volte in passato qui sul forum e che è una specie di lista che utilizziamo per registrare l'entrata e l'uscita dei camion dal magazzino.
Tra le varie cose ce ne sono state un paio che mi sono sembrate buone e che sto provando a mettere in pratica, senza successo.
L'idea sarebbe che quando in una zona sono assegnati più di un tot di camion si aprisse un MsgBox che avvisa l'operatore.

Il file su cui lavoriamo ha più fogli due di questi sono quelli interessati, infatti sul primo abbiamo la lista dei mezzi,
Immagine

mentre sull'altro foglio (Zona di Carico) ho un elenco dove sono indicate le zone di carico e conteggiati i nr di camion per zona, tenendo cono delle entrate e delle uscite utilizzando la seguente formula:
Codice: Seleziona tutto
=CONTA.PIÙ.SE(ENTRATE!P2:ENTRATE!P201;"S.MARCO"; ENTRATE!I2:ENTRATE!I201;">0"; ENTRATE!K2:ENTRATE!K201;"")

Immagine

Premesso questo pensavo di sfruttare un confronto tra la cella in cui si inserisce la zona di carico sul primo foglio (Range P2:P201) e il nr di camion presenti indicati sul secondo foglio per fare apparire un msgbox nel caso in cui i camion in quella zona superassero un certo nr.

Per fare questo ho provato in due modi:
Il primo:
Codice: Seleziona tutto
If Intersect(Target, Range("P2:P201")) Is Nothing Then
    If Application.WorksheetFunction.CountIf(Sheets("Zona di Carico").Range("G4:G24"), Range("P2:P201").Value) > 0 Then
        MsgBox ("Ok funziona")
    End If
End If

In questo caso ho indicato come valore maggiore di 0 giusto per vedere se funzionava, ma nulla si è mosso ne MsgBox ne errori
Sono quasi certo di stare sbagliando qualche cosa nell'ordine delle istruzioni, ma dopo aver fatto diverse prove non sono riuscito a capire cosa sbaglio.

Il secondo (sicuramente più rudimentale):
Codice: Seleziona tutto
If Range("P2:P201") = "S.MARCO" And (Sheets("Zona di Carico").Range("G18")) > 0 Then
  MsgBox ("OCCHIO TROPPI CAMION!")
End If

Restituisce errore di runtime 13 ed evidenzia la seguente riga di codice:
Codice: Seleziona tutto
If Range("P2:P201") = "S.MARCO" And (Sheets("Zona di Carico").Range("G18")) > 0 Then

Ma solo se la iserisco ad un certo punto della worksheet change perchè se la metto per ultima anche questa non si muove
Anche qui non riesco a capire cosa manca o non va.

Qui per il download del file allo stato attuale delle cose nel caso vogliate dare un'occhiata.
Avatar utente
systemcrack
Utente Senior
 
Post: 447
Iscritto il: 27/07/17 09:40

Sponsor
 

Re: Problema con apertura MsgBox con duplice condizione

Postdi Raffaele53 » 14/10/24 10:37

Ammettiamo che in "Zona di Carico" in colonna H metti il numero massimo dei camion.
Nel foglio "ENTRATE", subito sotto >>>Private Sub Worksheet_Change(ByVal Target As Range) metti questo...
Codice: Seleziona tutto
If Not Intersect(Target, Range("P2:P201")) Is Nothing Then
    If Application.WorksheetFunction.VLookup(Target.Offset(0, 0), Sheets("Zona di Carico").Range("D4:H24"), 4, False) _
    > WorksheetFunction.VLookup(Target.Offset(0, 0), Sheets("Zona di Carico").Range("D4:H24"), 5, False) Then
        MsgBox ("TROPPI CAMION")
   Application.EnableEvents = False
   Target.Offset(0, 0) = ""
   Application.EnableEvents = True
    End If
End If
Raffaele53
Newbie
 
Post: 6
Iscritto il: 03/10/24 13:06

Re: Problema con apertura MsgBox con duplice condizione

Postdi systemcrack » 14/10/24 13:08

Ciao Raffaele53,
grazie della risposta e piacere di conoscerti!
Scusami se ho tardato a risponderti, ma non avevo avuto tempo di provare il tuo codice.
Ho inserito il tuo codice in fondo alla Private Sub Worksheet_Change(ByVal Target As Range) del foglio ENTRATE (ora il codice risulta come di seguito)
Codice: Seleziona tutto
Private Sub Worksheet_Change(ByVal Target As Range)

       Dim rng         As Range, cell As Range
    Dim ordine      As String
   
Dim SClients, YFlag As Boolean, I As Long, CCVal
SClients = Array("EUSIDER", "BIDUE", "METALL STEEL")
    If Not Intersect(Target, Me.Range("H2:H201")) Is Nothing Then
        For Each cell In Target
        'Controlla se cliente speciale:
            YFlag = False
            CCVal = Cells(cell.Row, 6).Value & "....."
            For I = 0 To UBound(SClients)
                If InStr(1, CCVal, SClients(I), vbTextCompare) > 0 Then
                    YFlag = True
                    Exit For
                End If
            Next I
            If YFlag And Not IsEmpty(cell.Value) Then
                ordine = InputBox("Nr.Ordine Eusider")
               If ordine <> "" Then
                    Me.Cells(cell.Row, 15).Value = ordine
                    If Target.Count = 1 Then
                        Cells(cell.Row, "P").Select
                        Exit Sub
                    End If
                End If
            End If
        Next cell
    End If

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, 8).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

Dim myRan As String
'
myRan = "L2:L201"       '<<< L'area per i cui cambiamenti viene subito fatto un File Save
If Not Application.Intersect(Target, Range(myRan)) Is Nothing Then
    Debug.Print Now, Target.Address
    ThisWorkbook.Save
End If

Dim myList

myList = Array("SERBIA", "BOSNIA", "EUROTHENA")
If Target.Count = 1 Then            '1
    If 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, 14).Value = "PRECEDENZA T1"
            Exit For
        End If
    Next I
End If

If Not Intersect(Target, Range("P2:P201")) Is Nothing Then
    If Application.WorksheetFunction.VLookup(Target.Offset(0, 0), Sheets("Zona di Carico").Range("D4:H24"), 4, False) _
    > WorksheetFunction.VLookup(Target.Offset(0, 0), Sheets("Zona di Carico").Range("D4:H24"), 5, False) Then
        MsgBox ("TROPPI CAMION")
   Application.EnableEvents = False
   Target.Offset(0, 0) = ""
   Application.EnableEvents = True
    End If
End If

End Sub

ed ho inserito in colonna H del foglio Zona di Carico un nr massimo per zona
Immagine

Come puoi vedere in zona STR.3 il nr di camion ha sforato di 2 camion, ma non è uscito nessun MsgBox :roll:
Che ci sia un problema di convivenza tra le macro? Ho dimenticato io qualche cosa?
Avatar utente
systemcrack
Utente Senior
 
Post: 447
Iscritto il: 27/07/17 09:40

Re: Problema con apertura MsgBox con duplice condizione

Postdi Raffaele53 » 14/10/24 14:30

Appena selezioni con la Convalida Dati in "P2:P201" si scatena l'evento
Nel Tuo codice esistono dei Exit Sub...???
Ho scritto >>>>>subito sotto<<<<<

Codice: Seleziona tutto
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("P2:P201")) Is Nothing Then
    If Application.WorksheetFunction.VLookup(Target.Offset(0, 0), Sheets("Zona di Carico").Range("D4:H24"), 4, False) _
    > WorksheetFunction.VLookup(Target.Offset(0, 0), Sheets("Zona di Carico").Range("D4:H24"), 5, False) Then
        MsgBox ("TROPPI CAMION")
   Application.EnableEvents = False
   Target.Offset(0, 0) = ""
   Application.EnableEvents = True
    End If
End If
'Ecc
'Ecc
'Ecc
Raffaele53
Newbie
 
Post: 6
Iscritto il: 03/10/24 13:06

Re: Problema con apertura MsgBox con duplice condizione

Postdi Raffaele53 » 14/10/24 15:04

Anzi, metterei pure un Exit Sub sotto Application.EnableEvents = True
Raffaele53
Newbie
 
Post: 6
Iscritto il: 03/10/24 13:06

Re: Problema con apertura MsgBox con duplice condizione

Postdi systemcrack » 14/10/24 16:22

Quindi la tua parte di codice va inserita sopra al codice che già avevo.. spero non ci siano altre macro che richiedevano di essere inserite per prime.
Ora non le ricordo tutte, visto che questo "sviluppo assistito" avviene, ma spalmato negli anni dal 2016.

Comunque se vuoi testare con mano in uno dei posts precedenti c'è il file allegato.
Avatar utente
systemcrack
Utente Senior
 
Post: 447
Iscritto il: 27/07/17 09:40

Re: Problema con apertura MsgBox con duplice condizione

Postdi Raffaele53 » 14/10/24 21:28

Ho dato un'occhiata al Worksheet_Change "non capisco alcuni passaggi". Non mi piace che ci sia un "For Each cell In Target" mà che ci siano due passaggi relativi al Range("H2:H201") rimango perplesso.

Non conosco la procedura/metodo del Tuo lavoro, pertanto non posso compilarTi il codice. Di sicuro va scritto in modo più ordinato e questo potrebbe essere un esempio. Come noterai NON ho messo codice per la colonna H:H e se qualche colonna non serve basta togliere le righe.
Codice: Seleziona tutto
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim myList As String, SClients As String
If Target.Count > 1 Then MsgBox "Devi selezionare solo una cella, esco": Exit Sub
    If Not Intersect(Target, Range("B2:B201")) Is Nothing Then
        'codice
        Target.Offset(0, 1).Activate  'Se desideri spostare la selezione della cella
    ElseIf Not Intersect(Target, Range("C2:C201")) Is Nothing Then
        'codice
        Target.Offset(0, 2).Activate  'Se desideri spostare la selezione della cella
    ElseIf Not Intersect(Target, Range("E2:E201")) Is Nothing Then
        'codice
        Target.Offset(0, 1).Activate  'Se desideri spostare la selezione della cella
'Dare la precedenza???
    ElseIf Not Intersect(Target, Range("F2:F201")) Is Nothing Then 'Exit Sub
        myList = Array("SERBIA", "BOSNIA", "EUROTHENA")
        For I = 0 To UBound(myList)
            If InStr(1, Cells(Target.Row, 6).Value, myList(I), vbTextCompare) > 0 Then
                Cells(Target.Row, 14).Value = "PRECEDENZA T1"
                Exit For
            End If
        Next I
        Target.Offset(0, 2).Activate  'Se desideri spostare la selezione della cella
    ElseIf Not Intersect(Target, Range("H2:H201")) Is Nothing Then
        'codice
        Target.Offset(0, 3).Activate  'Se desideri spostare la selezione della cella
'NULLA PER COLONNA I =FORMULE
'NULLA PER COLONNA K =FORMULE
'L'area per i cui cambiamenti viene subito fatto un File Save
    ElseIf Not Application.Intersect(Target, Range("L2:L201")) Is Nothing Then
        Debug.Print Now, Target.Address
        ThisWorkbook.Save
        Target.Offset(0, 1).Activate  'Se desideri spostare la selezione della cella
    ElseIf Not Intersect(Target, Range("M2:M201")) Is Nothing Then
        'codice
        Target.Offset(0, 2).Activate  'Se desideri spostare la selezione della cella
'NULLA PER COLONNA N =FORMULE
    ElseIf Not Intersect(Target, Range("O2:O201")) Is Nothing Then
        'codice
        Target.Offset(0, 1).Activate  'Se desideri spostare la selezione della cella
    ElseIf Not Intersect(Target, Range("P2:P201")) Is Nothing Then
        If Application.WorksheetFunction.VLookup(Target.Offset(0, 0), Sheets("Zona di Carico").Range("D4:H24"), 4, False) _
        > WorksheetFunction.VLookup(Target.Offset(0, 0), Sheets("Zona di Carico").Range("D4:H24"), 5, False) Then
            MsgBox ("TROPPI CAMION")
            Application.EnableEvents = False
            Target.Offset(0, 0) = ""
            Application.EnableEvents = False
            Target.Offset(1, -14).Activate  'Se desideri spostare la selezione della cella
        End If
    End If
End Sub
Raffaele53
Newbie
 
Post: 6
Iscritto il: 03/10/24 13:06

Re: Problema con apertura MsgBox con duplice condizione

Postdi systemcrack » 15/10/24 10:24

Ciao Raffaele, buongiorno e grazie infinite per il tempo che mi hai dedicato guardando il mio file..
Come avrai intuito sono un autodidatta conosco altri linguaggi, ma non il vba, perciò vado avanti per tentativi, adatto le macro alle mie esigenze, ma non sono in grado di riordinare il codice in modo che le macro non vadano "in conflitto" tra loro.
Ma posso provare a spiegarmi meglio nell'utilizzo del file e dei codici contenuti nel worksheet change:

Questa prima parte fa aprire un MsgBox in cui inserire il nr di ordine se sono presenti alcuni nomi di clienti.
Codice: Seleziona tutto
 Dim rng         As Range, cell As Range
    Dim ordine      As String
   
Dim SClients, YFlag As Boolean, I As Long, CCVal
SClients = Array("EUSIDER", "BIDUE", "METALL STEEL")
    If Not Intersect(Target, Me.Range("H2:H201")) Is Nothing Then
        For Each cell In Target
        'Controlla se cliente speciale:
            YFlag = False
            CCVal = Cells(cell.Row, 6).Value & "....."
            For I = 0 To UBound(SClients)
                If InStr(1, CCVal, SClients(I), vbTextCompare) > 0 Then
                    YFlag = True
                    Exit For
                End If
            Next I
            If YFlag And Not IsEmpty(cell.Value) Then
                ordine = InputBox("Nr.Ordine Eusider")
               If ordine <> "" Then
                    Me.Cells(cell.Row, 15).Value = ordine
                    If Target.Count = 1 Then
                        Cells(cell.Row, "P").Select
                        Exit Sub
                    End If
                End If
            End If
        Next cell
    End If

Questa parte di codice permette lo scorrimento in orizzontale saltando le celle di non interesse:
Codice: Seleziona tutto
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, 8).Select      '..P
            Case Is = 16                        'P..
                Target.Offset(1, -14).Select    '..B+1
        End Select
    End If
End If

Questa parte di codice insieme a quella sopra serviva per gestire un eventuale scansione di codice a barre e quindi gestire la suddivisione dei dati nelle varie celle:
Codice: Seleziona tutto
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

Questa parte di codice gestisce l'elenco delle merci da inserire e nel caso ve ne siano di nuove le aggiunge nel foglio "MERCI"
Codice: Seleziona tutto
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

Questo salvataggio serve perchè il file viene visto in sola lettura anche in altri reparti e serve sia aggiornato di frequente:
Codice: Seleziona tutto
Dim myRan As String
'
myRan = "L2:L201"       '<<< L'area per i cui cambiamenti viene subito fatto un File Save
If Not Application.Intersect(Target, Range(myRan)) Is Nothing Then
    Debug.Print Now, Target.Address
    ThisWorkbook.Save
End If


Questo serve ad aggiungere una dicitura in caso siano presenti alcune destinazioni estere:
Codice: Seleziona tutto
Dim myList

myList = Array("SERBIA", "BOSNIA", "EUROTHENA")
If Target.Count = 1 Then            '1
    If 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, 14).Value = "PRECEDENZA T1"
            Exit For
        End If
    Next I
End If


L'operatore inserisce i dati in questo ordine:
Immagine

1) Targa (colonna B)
2) Vettore (colonna C)
3) Cliente (colonna F)
4) Merce (colonna H)
5) Ora di entrata (colonna I si autocompila tramite formula)
6) Zona di carico (colonna P)

Dopo tutta questa anticipazione, volevo anche che sapessi che non chiedo un codice già pronto che funzioni (anche se non ci sputo sopra :lol: ), ma capire perchè il mio ed il tuo non funzionino in modo da progredire nella mia conoscenza del vba e magari arrivare ad un certo punto da riuscire a fare da solo senza bloccarmi.

Ti auguro una buona giornata e grazie davvero per il tempo che mi hai dedicato.
Avatar utente
systemcrack
Utente Senior
 
Post: 447
Iscritto il: 27/07/17 09:40

Re: Problema con apertura MsgBox con duplice condizione

Postdi systemcrack » 15/10/24 10:52

Comunque credo di essere riuscito a far funzionare il tuo codice.. inserendolo tra la seconda e la terza macro il messaggio funziona!!!
Avatar utente
systemcrack
Utente Senior
 
Post: 447
Iscritto il: 27/07/17 09:40

Re: Problema con apertura MsgBox con duplice condizione

Postdi Anthony47 » 15/10/24 15:22

Sono stato felicemente scollegato per alcuni giorni e scopro con piacere un nuovo utente che ha abbastanza pazienza e curiosità per aiutare chi ha bisogno: grazie Raffaele53

Quanto al problema che ora mi pare "risolto", chiedo: ma operativamente si potrebbe anticipare il controllo a quando l'operatore si prepara a compilare la colonna P, dandogli in quel momento l'informazione di quale scelta sarebbe piu' opportuna? Se Sì allora spiega quali sono le informazioni da tener presente e vedremo come farlo.

Ho guardato anche le formule in ZonaDiCarico colonna G e le trovo un po "tribolate":
-in riga 4 c'e la formula =CONTA.PIÙ.SE(ENTRATE!P2:ENTRATE!P201;"2"; ENTRATE!I2:ENTRATE!I201;">0"; ENTRATE!K2:ENTRATE!K201;"")
-in riga 5 =CONTA.PIÙ.SE(ENTRATE!P2:ENTRATE!P201;"STR.3"; ENTRATE!I2:ENTRATE!I201;">0"; ENTRATE!K2:ENTRATE!K201;"")
-e così via altre 19 formule diverse in ogni riga.
Avresti invece potuto scrivere in G4
Codice: Seleziona tutto
=CONTA.PIÙ.SE(ENTRATE!$P$2:$P$201;D4; ENTRATE!$I$2:$I$201;">0"; ENTRATE!$K$2:$K$201;"")
e poi copiarla verso il basso
Noterai l'indirizzo "assoluto" sugli intervalli dei "criteri" e l'indirizzo "relativo" sul campo del primo criterio, in modo che copiando la formula si aggiorni il valore del criterio
Avatar utente
Anthony47
Moderatore
 
Post: 19392
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Problema con apertura MsgBox con duplice condizione

Postdi systemcrack » 15/10/24 15:57

Anthony47 ha scritto:Sono stato felicemente scollegato per alcuni giorni e scopro con piacere un nuovo utente che ha abbastanza pazienza e curiosità per aiutare chi ha bisogno: grazie Raffaele53

Concordo davvero un piacevole incontro anche se temo lo sia stato solo per me :roll: :lol:

Anthony47 ha scritto:Quanto al problema che ora mi pare "risolto", chiedo: ma operativamente si potrebbe anticipare il controllo a quando l'operatore si prepara a compilare la colonna P, dandogli in quel momento l'informazione di quale scelta sarebbe piu' opportuna? Se Sì allora spiega quali sono le informazioni da tener presente e vedremo come farlo.

Ciao Anthony ben ritrovato!
Per il momento la macro così come lavora fa ciò che mi serve e non ho bisogno di ulteriori modifiche è sempre un circa per aiutarci quando siamo travolti dalla baraonda di lavoro.

L'unica cosa che non riesco a risolvere è che se cancello la cella P (per esempio l'operatore si è sbagliato, il camion non carica più, ecc) ricevo questo errore.
Immagine

a cui ho provato a mettere una pezza inserendo On error resume next così:
Codice: Seleziona tutto
If Not Intersect(Target, Range("P2:P201")) Is Nothing Then
On Error Resume Next
    If Application.WorksheetFunction.VLookup(Target.Offset(0, 0), Sheets("Zona di Carico").Range("D4:H24"), 4, False) _
    > WorksheetFunction.VLookup(Target.Offset(0, 0), Sheets("Zona di Carico").Range("D4:H24"), 5, False) Then
        MsgBox ("TROPPI CAMION")
   Application.EnableEvents = False
   Target.Offset(0, 0) = ""
   Application.EnableEvents = True
    End If
End If

Ma in questo modo il box si apre anche se la condizione non si avvera (il nr di camion max superati)
Ho provato ad aggiungere anche dopo On Error GoTo 0, ma anche così mi appare il box.

Anthony47 ha scritto:Ho guardato anche le formule in ZonaDiCarico colonna G e le trovo un po "tribolate":
-in riga 4 c'e la formula =CONTA.PIÙ.SE(ENTRATE!P2:ENTRATE!P201;"2"; ENTRATE!I2:ENTRATE!I201;">0"; ENTRATE!K2:ENTRATE!K201;"")
-in riga 5 =CONTA.PIÙ.SE(ENTRATE!P2:ENTRATE!P201;"STR.3"; ENTRATE!I2:ENTRATE!I201;">0"; ENTRATE!K2:ENTRATE!K201;"")
-e così via altre 19 formule diverse in ogni riga.
Avresti invece potuto scrivere in G4
Codice: Seleziona tutto
=CONTA.PIÙ.SE(ENTRATE!$P$2:$P$201;D4; ENTRATE!$I$2:$I$201;">0"; ENTRATE!$K$2:$K$201;"")
e poi copiarla verso il basso
Noterai l'indirizzo "assoluto" sugli intervalli dei "criteri" e l'indirizzo "relativo" sul campo del primo criterio, in modo che copiando la formula si aggiorni il valore del criterio

Seguirò il tuo consiglio/esempio soprattutto per le prossime volte.
Grazie Anthony ;)
Avatar utente
systemcrack
Utente Senior
 
Post: 447
Iscritto il: 27/07/17 09:40

Re: Problema con apertura MsgBox con duplice condizione

Postdi Raffaele53 » 15/10/24 17:13

A riguardo il codice... Spiega meglio queste frasi che cosa dovrebbero fare
1)Questa prima parte fa aprire un MsgBox in cui inserire il nr di ordine se sono presenti alcuni nomi di clienti (fai un esempio)
2)Questo non credo che serva...permette lo scorrimento in orizzontale...
3)Questo serve ancora...? serviva per gestire un eventuale scansione di codice a barre
4)Questa parte di codice gestisce l'elenco delle merci da inserire e nel caso ve ne siano di nuove le aggiunge nel foglio "MERCI" (fai un esempio)
5)OK Relativo a "L2:L201"
6)Ok Relativo a "F2:F201"

Finchè capita un'errore VBA nel Worksheet_Change, devi riavviarlo manualmente con questo:
Codice: Seleziona tutto
Sub Riavvia()
Application.EnableEvents = True
End Sub


Per quanto riguarda il fatto che desideri cancellare un camion gia stato inserito
Codice: Seleziona tutto
If Not Intersect(Target, Range("P2:P201")) Is Nothing Then
         If Target.Offset(0, 0) <> "" Then
            If Application.WorksheetFunction.VLookup(Target.Offset(0, 0), Sheets("Zona di Carico").Range("D4:H24"), 4, False) _
            > WorksheetFunction.VLookup(Target.Offset(0, 0), Sheets("Zona di Carico").Range("D4:H24"), 5, False) Then
                MsgBox ("TROPPI CAMION"): Target.Offset(0, 0) = ""
                Application.EnableEvents = False
                Target.Offset(0, 0) = ""
                Application.EnableEvents = False
            End If
        End If
End if
Raffaele53
Newbie
 
Post: 6
Iscritto il: 03/10/24 13:06

Re: Problema con apertura MsgBox con duplice condizione

Postdi Raffaele53 » 15/10/24 17:46

Allega un files con 20/30 righe compilate
Raffaele53
Newbie
 
Post: 6
Iscritto il: 03/10/24 13:06

Re: Problema con apertura MsgBox con duplice condizione

Postdi systemcrack » 15/10/24 17:51

Raffaele53 ha scritto:A riguardo il codice... Spiega meglio queste frasi che cosa dovrebbero fare
1)Questa prima parte fa aprire un MsgBox in cui inserire il nr di ordine se sono presenti alcuni nomi di clienti (fai un esempio)

Diciamo che stiamo compilando lo schema e si parte inserendo:
TARGA (B), VETTORE (C), CLIENTE SPECIFICO (F), MERCE (H), Ora entrata (I), a questo punto si apre il msgbox e mi chiede di inserire il nr di ordine e lo inserisce in colonna (O), poi si piazza sulla cella in (P) in cui si inserirà la zona di carico.

Raffaele53 ha scritto:2)Questo non credo che serva...permette lo scorrimento in orizzontale...

Serve serve velocizza l'inserimento in quanto permette all'operatore di saltare da una cella d'interesse a quella successiva semplicemente con un invio e poi una volta arrivato infondo alla riga ti fa ricominciare da capo sulla riga successiva. In questo modo si lavora soprattutto di tastiera e si evita il mouse.

Raffaele53 ha scritto:3)Questo serve ancora...? serviva per gestire un eventuale scansione di codice a barre

Diciamo che è una situazione in standby la pistola scanner non è mai arrivata sebbene ci fosse stato un ok dal boss, ma nel fra tempo l'azienda è stata venduta.. attendo eventuali sviluppi dalla nuova direzione, appena si vedrà qualcuno.

Raffaele53 ha scritto:4)Questa parte di codice gestisce l'elenco delle merci da inserire e nel caso ve ne siano di nuove le aggiunge nel foglio "MERCI" (fai un esempio)

Diciamo che inseriamo un nuovo tipo di merce, invece degli standard, invece che restituire errori la macro verifica l'elenco delle merci standard e se non è presente la aggiunge all'elenco.
Anche questa soluzione era stata escogitata per l'inserimento da codice a barre, ma che torna utile anche per l'inserimento manuale.

Raffaele53 ha scritto:Per quanto riguarda il fatto che desideri cancellare un camion gia stato inserito
Codice: Seleziona tutto
If Not Intersect(Target, Range("P2:P201")) Is Nothing Then
         If Target.Offset(0, 0) <> "" Then
            If Application.WorksheetFunction.VLookup(Target.Offset(0, 0), Sheets("Zona di Carico").Range("D4:H24"), 4, False) _
            > WorksheetFunction.VLookup(Target.Offset(0, 0), Sheets("Zona di Carico").Range("D4:H24"), 5, False) Then
                MsgBox ("TROPPI CAMION"): Target.Offset(0, 0) = ""
                Application.EnableEvents = False
                Target.Offset(0, 0) = ""
                Application.EnableEvents = False
            End If
        End If
End if

Domani al lavoro proverò a vedere come reagisce questo tuo nuovo consiglio.
Avatar utente
systemcrack
Utente Senior
 
Post: 447
Iscritto il: 27/07/17 09:40

Re: Problema con apertura MsgBox con duplice condizione

Postdi systemcrack » 15/10/24 18:11

Raffaele53 ha scritto:Allega un files con 20/30 righe compilate

Di seguito il file compilato nelle prime 20 - 30 righe.
Ovviamente non ho usato nomi e riferimenti veri per ovvi motivi, ma così dovrebbe rendere l'idea del funzionamento e di come viene utilizzato.
I vari errori che riceverai sono ovviamente dovuti dai vari collegamenti con altri files con cui comunica lo schema o cartelle per il salvataggio.

Grazie ancora per tutto e ti auguro una buona serata Raffaele.
Avatar utente
systemcrack
Utente Senior
 
Post: 447
Iscritto il: 27/07/17 09:40


Torna a Applicazioni Office Windows


Topic correlati a "Problema con apertura MsgBox con duplice condizione":

Problema Tiktok
Autore: Fra_rey
Forum: Discussioni
Risposte: 1

Chi c’è in linea

Visitano il forum: Nessuno e 14 ospiti