Condividi:        

Input box range di celle di destinazione variabile

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

Input box range di celle di destinazione variabile

Postdi systemcrack » 12/09/24 15:29

Buon pomeriggio a tutti,
dopo aver guardato e letto diversi tutorial in rete in proposito alla creazione di una input box sto cercando di inserirne una nel mio schema entrate.
Visti tutti i posts passati inizio specificando che:

Lo schema entrate è uno schema che utilizzo in ufficio per registrare l'entrata e l'uscita dei mezzi dal magazzino.
Lo schema è composto da 17 colonne e 200 righe.
Immagine

L'operatore compila lo schema riga per riga, compilata la cella nella colonna H e a questo punto vorrei che si aprisse la input box, ma con le seguenti caratteristiche:

Vorrei che la input box
1) si apra al verificarsi di 2 condizioni
-che in colonna F sia presente un testo che per il momento sarà "NOMECLIENTEPARTICOLARE" + che in colonna H sulla medesima riga la cella non sia vuota

2) che riporti il testo immesso nella input box sulla stessa riga in colonna O
-che permetta anche la NON immissione di dati (cioè di clickare invio sebbene la text area sia vuota).

Premesso questo, ecco come ho pensato di affrontare la cosa:

Nel foglio Entrate (foglio1) in Private Sub Worksheet_Change(ByVal Target As Range) ho inserito una macro che dovrebbe rilevare nel range di celle F2:F201 se c'è la fatidica parola e nel caso richiama l'apertura dell'input box (chiamato inputboxeu):
Codice: Seleziona tutto
If Not IsError(Application.Match("*NOMECLIENTEPARTICOLARE*", Range("F2:F201"), 0)) Then
       Call inputboxeu
End If


a questo punto in un modulo a parte ho inserito:
Codice: Seleziona tutto
Sub inputboxeu()
ordine = InputBox("Inserisci Nr. di Ordine")
If ordine = "" Then Exit Sub
If rng = "" Then Exit Sub
Range ("O2:O201") = ordine
End Sub


Ora così composta la macro apre il popup appena scritto il testo specifico "NOMECLIENTEPARTICOLARE" e quando si inserisce il testo e si da l'ok non riporta il testo da nessuna parte.

Come faccio ad aggiungere in questo caso una seconda coondizione di apertura nella prima macro e un range variabile nella seconda?
Avatar utente
systemcrack
Utente Senior
 
Post: 454
Iscritto il: 27/07/17 09:40

Sponsor
 

Re: Input box range di celle di destinazione variabile

Postdi Anthony47 » 13/09/24 18:23

Sono in crisi di tempo forse per tutto il weekend, quindi non riesco a ragionarci; pero' tu approfittane per spiegare quale problema devi risolvere (non solo "come hai pensato di risolverlo")
Avatar utente
Anthony47
Moderatore
 
Post: 19432
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Input box range di celle di destinazione variabile

Postdi systemcrack » 13/09/24 20:29

Anthony47 ha scritto:Sono in crisi di tempo forse per tutto il weekend, quindi non riesco a ragionarci;

Figurati Anthony.. io non ho fretta.
Anthony47 ha scritto:pero' tu approfittane per spiegare quale problema devi risolvere (non solo "come hai pensato di risolverlo")

Faccio qualche altra ricerca e prova e poi ti faccio sapere a che punto sono arrivato e cosa non va. ;)
Avatar utente
systemcrack
Utente Senior
 
Post: 454
Iscritto il: 27/07/17 09:40

Re: Input box range di celle di destinazione variabile

Postdi FRIEDRICH » 14/09/24 18:43

Ciao a tutti, :)
approfitto dell'assenza di Anthony per proporre la mia soluzione, da inserire nel modulo del foglio interessato:
Codice: Seleziona tutto
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim rng         As Range, cell As Range
    Dim ordine      As String
   
       If Not Intersect(Target, Me.Range("H2:H200")) Is Nothing Then       
        For Each cell In Target           
            If Me.Cells(cell.Row, 6).Value = "NOMECLIENTEPARTICOLARE" And Not IsEmpty(cell.Value) Then
                ordine = InputBox("Inserisci Nr. di Ordine")                               
                If ordine = "" Then
                    Exit Sub
                End If               
                Me.Cells(cell.Row, 15).Value = ordine               
            End If
        Next cell
    End If
End Sub
Avatar utente
FRIEDRICH
Utente Junior
 
Post: 36
Iscritto il: 09/07/17 17:14

Re: Input box range di celle di destinazione variabile

Postdi systemcrack » 16/09/24 06:33

Ciao Friedrich, buongiorno e scusami per il ritardo nella risposta.. non mi aspettavo risposte da altri .. oggi appena ho un attimo testo il tuo codice e ti faccio sapere.
Per il momento grazie e ti auguro un buon inizio settimana.
Avatar utente
systemcrack
Utente Senior
 
Post: 454
Iscritto il: 27/07/17 09:40

Re: Input box range di celle di destinazione variabile

Postdi systemcrack » 16/09/24 10:43

FRIEDRICH ha scritto:Ciao a tutti, :)
approfitto dell'assenza di Anthony per proporre la mia soluzione, da inserire nel modulo del foglio interessato:
Codice: Seleziona tutto
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim rng         As Range, cell As Range
    Dim ordine      As String
   
       If Not Intersect(Target, Me.Range("H2:H200")) Is Nothing Then       
        For Each cell In Target           
            If Me.Cells(cell.Row, 6).Value = "NOMECLIENTEPARTICOLARE" And Not IsEmpty(cell.Value) Then
                ordine = InputBox("Inserisci Nr. di Ordine")                               
                If ordine = "" Then
                    Exit Sub
                End If               
                Me.Cells(cell.Row, 15).Value = ordine               
            End If
        Next cell
    End If
End Sub

Fantastico FRIEDRICH funziona quasi perfettamente!
L'unica cosa che è da aggiustare è il fatto che quando si immette NOMECLIENTEPARTICOLARE il 99% delle volte è associato ad un altro nome in quanto questo cliente è un grossista e quindi a sua volta rivende ad altri.
Premesso questo la maggior parte delle volte quindi la cella F risulterà così assegnata: "NOMECLIENTEPARTICOLARE / altro nome cliente o località di destinazione".
Facendo alcune prove mi sono accorto che la macro che hai composto reagisce se c'è solo il nome specifico, vedo se riesco ad arrivare da solo ad aggiustare quest'ultima parte.. non voglio approfittare troppo della tua disponibilità. Grazie ancora FRIEDRICH e buon inizio settimana. ;)
Avatar utente
systemcrack
Utente Senior
 
Post: 454
Iscritto il: 27/07/17 09:40

Re: Input box range di celle di destinazione variabile

Postdi systemcrack » 16/09/24 12:16

Dopo alcune prove sono riuscito a trovare il modo di farlo andare come voglio io.. riporto la parte di codice modificata per i posteri:
Codice: Seleziona tutto
If Me.Cells(cell.Row, 6).Value Like "*" & "NomeClienteParticolare" & "*" And Not IsEmpty(cell.Value) Then


Ho variato la parte di codice che FRIEDRICH aveva proposto così:
Codice: Seleziona tutto
....Value = "NomeClienteParticolare" And Not IsEmpty...


In questo modo:
Codice: Seleziona tutto
...Value Like "*" & "NomeClienteParticolare" & "*" And Not IsEmpty...


In questo modo ci sarebbero problemi se ci fosse una differenza tra maiuscole e minuscole, ma la schema viene prettamente compilato in maiuscolo, pertanto il problema non sussiste.

Un buon proseguimento di giornata a tutti! ;)
Avatar utente
systemcrack
Utente Senior
 
Post: 454
Iscritto il: 27/07/17 09:40

Re: Input box range di celle di destinazione variabile

Postdi FRIEDRICH » 16/09/24 16:23

Ciao systemcrack e a tutto il forum.
grazie mille per il riscontro, per ovviare al problema del maiuscolo/minuscolo dovrebbe bastare questa istruzione, che trasforma in maiuscolo il valore contenuto nella cella F e lo confronta con il contenuto della stringa scritto anch'esso in maiuscolo:
Codice: Seleziona tutto
If UCase(Me.Cells(cell.Row, 6).Value) Like "*" & "NomeClienteParticolare" & "*" And Not IsEmpty(cell.Value) Then
Avatar utente
FRIEDRICH
Utente Junior
 
Post: 36
Iscritto il: 09/07/17 17:14

Re: Input box range di celle di destinazione variabile

Postdi systemcrack » 16/09/24 18:16

Grazie per la dritta FRIEDRICH lo terrò a mente nel caso mi servisse per una prossima volta.
Buona serata.
Avatar utente
systemcrack
Utente Senior
 
Post: 454
Iscritto il: 27/07/17 09:40

Re: Input box range di celle di destinazione variabile

Postdi Anthony47 » 16/09/24 18:52

Bravi che avete fatto tutto da soli, posso tornarmene in vacanza :D :D

Io in genere per cercare la presenza di una stringa uso INSTR (https://support.microsoft.com/it-it/top ... d0cb8a55b), e poi con l'argomento "compare" indico se voglio una ricerca Case-Sensitive (vbBinaryCompare) o Case-insensitive (vbTextCompare)
Avatar utente
Anthony47
Moderatore
 
Post: 19432
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Input box range di celle di destinazione variabile

Postdi systemcrack » 16/09/24 19:21

Buona vacanza Anthony :D
Avatar utente
systemcrack
Utente Senior
 
Post: 454
Iscritto il: 27/07/17 09:40

Re: Input box range di celle di destinazione variabile

Postdi systemcrack » 18/09/24 10:22

FRIEDRICH ha scritto:Ciao a tutti, :)
approfitto dell'assenza di Anthony per proporre la mia soluzione, da inserire nel modulo del foglio interessato:
Codice: Seleziona tutto
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim rng         As Range, cell As Range
    Dim ordine      As String
   
       If Not Intersect(Target, Me.Range("H2:H200")) Is Nothing Then       
        For Each cell In Target           
            If Me.Cells(cell.Row, 6).Value = "NOMECLIENTEPARTICOLARE" And Not IsEmpty(cell.Value) Then
                ordine = InputBox("Inserisci Nr. di Ordine")                               
                If ordine = "" Then
                    Exit Sub
                End If               
                Me.Cells(cell.Row, 15).Value = ordine               
            End If
        Next cell
    End If
End Sub


Buongiorno a tutti,
ma se avessi bisogno di cercare più di una parola non solo NOMECLIENTEPARTICOLARE ma anche NOMECLIENTEPARTICOLARE2, NOMECLIENTEPARTICOLARE3, NOMECLIENTEPARTICOLARE4, ecc (ovviamente indico NOMECLIENTEPARTICOLARE per privacy aziendale i nomi dei clienti in realtà saranno differenti)?

Io ho provato così:
Codice: Seleziona tutto
If Me.Cells(cell.Row, 6).Value = ("NOMECLIENTEPARTICOLARE", "NOMECLIENTEPARTICOLARE2")  And Not IsEmpty(cell.Value) Then

Ma ricevo errore.
Avatar utente
systemcrack
Utente Senior
 
Post: 454
Iscritto il: 27/07/17 09:40

Re: Input box range di celle di destinazione variabile

Postdi systemcrack » 18/09/24 11:30

Altra cosa.. vorrei che dopo aver scritto saltasse dalla colonna O alla P che è la cella a fianco..
Se non sbaglio è
Codice: Seleziona tutto
End If
        Next cell
    End If

Next cell il comando da "manipolare" giusto?
Avatar utente
systemcrack
Utente Senior
 
Post: 454
Iscritto il: 27/07/17 09:40

Re: Input box range di celle di destinazione variabile

Postdi Anthony47 » 18/09/24 14:22

Nel caso tu voglia controllare se all'interno di un testo ci siano più stringhe allora devi fare un loop che testa ognuna delle stringhe.

Ad esempio, partendo dal tuo codice più le modifiche dei messaggi di FRIEDRICH:
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("Cliente1", "Cliente2", "Cliente3")
    If Not Intersect(Target, Me.Range("H2:H200")) 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("Inserisci Nr. di Ordine")
                If ordine <> "" Then                         'VEDI NOTA
                    Me.Cells(cell.Row, 15).Value = ordine
                End If
            End If
        Next cell
    End If
End Sub

Vedo che il codice ipotizza che possano essere modificate più di una cella contemporaneamente, tipicamente dovute a cancellazione di un'area, oppure Copia e Incolla di un range; probabilmente si tratta di una complicazione inutile, ma visto che e' fatto oramai non provo a semplificarlo.

Altra cosa.. vorrei che dopo aver scritto saltasse dalla colonna O alla P che è la cella a fianco..

Questa non l'ho capita. Probabilmente vorresti che dopo aver compilato la colonna O (caso Clente Speciale) venga selezionata la colonna P. Ma (vedi commento precedente) la Sub controlla piu' di una cella, quindi teoricamente potrebbe trovare un Cliente Speciale su H2 e un altro in H10 (e' un esempio), quindi su quale P vorresti saltare, P2 o P10?
Volendo potremmo selezionare colonna P qualora "Target" indichi che e' stata modificata una sola cella, modificando il blocco If /End If marcato "VEDI NOTA" con queste istruzioni:
Codice: Seleziona tutto
                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
Avatar utente
Anthony47
Moderatore
 
Post: 19432
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Input box range di celle di destinazione variabile

Postdi systemcrack » 18/09/24 18:52

Anthony47 ha scritto:Nel caso tu voglia controllare se all'interno di un testo ci siano più stringhe allora devi fare un loop che testa ognuna delle stringhe.

Ad esempio, partendo dal tuo codice più le modifiche dei messaggi di FRIEDRICH:
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("Cliente1", "Cliente2", "Cliente3")
    If Not Intersect(Target, Me.Range("H2:H200")) 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("Inserisci Nr. di Ordine")
                If ordine <> "" Then                         'VEDI NOTA
                    Me.Cells(cell.Row, 15).Value = ordine
                End If
            End If
        Next cell
    End If
End Sub

Vedo che il codice ipotizza che possano essere modificate più di una cella contemporaneamente, tipicamente dovute a cancellazione di un'area, oppure Copia e Incolla di un range; probabilmente si tratta di una complicazione inutile, ma visto che e' fatto oramai non provo a semplificarlo.

Grazie Anthony, appena torno a casa ed ho 5 min farò qualche esperimento sul codice che hai suggerito.
Anthony47 ha scritto:Questa non l'ho capita. Probabilmente vorresti che dopo aver compilato la colonna O (caso Clente Speciale) venga selezionata la colonna P. Ma (vedi commento precedente) la Sub controlla piu' di una cella, quindi teoricamente potrebbe trovare un Cliente Speciale su H2 e un altro in H10 (e' un esempio), quindi su quale P vorresti saltare, P2 o P10?
Volendo potremmo selezionare colonna P qualora "Target" indichi che e' stata modificata una sola cella, modificando il blocco If /End If marcato "VEDI NOTA" con queste istruzioni:
Codice: Seleziona tutto
                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
[/quote][/quote]
In pratica ora che succede.. chi compila lo schema in colonna F inserisce il nome speciale cliente, dopo di che va in colonna H ed inserisce il tipo di materiale, a questo punto scatta l'inputbox, si inserisce l'ordine e si clicka su ok o invio, il nr d'ordine viene riportato in colonna O (tutto sulla stessa riga), ora se si clicca di nuovo invio la la cella selezionata successivamente sarà la I in quanto contiene questa formula che reagisce alla compilazione di H =SE(H6<>""; SE(I6=""; ADESSO(); I6); "")
Ora vorrei che invece che tornare indietro alla colonna I proseguisse sulla stessa riga fino a P (dopo aver inserito il nr di ordine).
Spero di essermi spiegato in modo più chiaro questa volta.. ad ogni modo farò qualche esperimento e ti farò sapere.
Buona serata e grazie ancora!
Avatar utente
systemcrack
Utente Senior
 
Post: 454
Iscritto il: 27/07/17 09:40

Re: Input box range di celle di destinazione variabile

Postdi systemcrack » 18/09/24 21:10

Ok ho testato il tuo codice e così sarebbe perfetto se non ci fosse un'errore di compilazione dovuto ad una "Dichiarazione doppia" all'interno della Worksheet_Change. Nello specifico le due macro che per così dire vanno in conflitto sono quella appena redatta:
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("Cliente1", "Cliente2", "Cliente3")
    If Not Intersect(Target, Me.Range("H2:H200")) 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("Inserisci Nr. di Ordine")
               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

e questa
Codice: Seleziona tutto
Dim myList, I As Long

myList = Array("SERBIA", "BOSNIA", "Etc")
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

Nello specifico la "ripetizione" indicata è I As Long :roll:
Avatar utente
systemcrack
Utente Senior
 
Post: 454
Iscritto il: 27/07/17 09:40

Re: Input box range di celle di destinazione variabile

Postdi Anthony47 » 18/09/24 22:04

Lascia solo la prima dichiarazione, cancellando la parte in rosso in questa linea:
Dim myList, I As Long
Avatar utente
Anthony47
Moderatore
 
Post: 19432
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Input box range di celle di destinazione variabile

Postdi systemcrack » 19/09/24 12:51

FANTASTICO! Funziona perfettamente!!! Grazie Anthony.
Avatar utente
systemcrack
Utente Senior
 
Post: 454
Iscritto il: 27/07/17 09:40


Torna a Applicazioni Office Windows


Topic correlati a "Input box range di celle di destinazione variabile":


Chi c’è in linea

Visitano il forum: Nessuno e 12 ospiti