Excel - sostituire un'intera cella con un'altra

Anonimo
2022-07-06T10:25:18+00:00

Buongiorno a tutti,

Volevo chiedervi gentilmente aiuto a risolvere questo quesito:

Io ho due colonne di numeri, la prima si riferisce al codice identificativo di un determinato prodotto (nel mio caso la colonna A), la seconda alla quantità di prodotti che ho (nel mio caso la colonna E). Esempio: colonna A 01 (che so che sono le pere); colonna E 3. Vuol dire che in magazzino ho 3 pere.

Vorrei che se digito in una cella al di fuori di queste due colonne (sempre e solo la stessa cella- nel mio caso K3), il codice identificativo del prodotto, il programma diminuisca di un'unità la seconda colonna delle quantità, corrispondente al prodotto inserito. Esempio: se nella cella K3 inserisco 01 vorrei che nella cella E affianco al codice articolo 01, non ho più 3 pere ma 2.

Sono riuscito ad ottenere ciò che ho in mente con questa funzione: =CERCA(K3;A3:A15;E3:E15-1); il problema è che riesco ad ottenerlo solamente al di fuori delle due colonne in questione, e non riesco a sostituire il nuovo numero di quantità al vecchio. Vorrei anche che questo metodo fosse iterativo, quindi se io inserisco per una seconda volta il numero del prodotto nella cella di immissione, la quantità di prodotto corrispondente diminuisca ancora un'altra volta. Esempio: quindi se inserisco nuovamente nella cella K3 il codice 01 vorrei che nella cella E affianco al codice articolo 01, non ho più 2 pere ma 1.

Spero di essere stato sufficentemente chiaro,

Grazie mille a chiunque mi aiuterà.

Microsoft 365 e Office | Excel | Per l'istruzione | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento
Risposta accettata dall'autore della domanda
Gianfranco55 25,190 Punti di reputazione Moderatore volontario
2022-07-06T12:20:54+00:00

ciao

fatto bene

si nota la differenza tra un esperto vba

e un principiante

ma intanto l'ho fatta e funziona😂

mi dimentico sempre

Application.EnableEvents = false

Application.EnableEvents = True

La risposta è stata utile?

2 persone hanno trovato utile questa risposta.
0 commenti Nessun commento
Risposta accettata dall'autore della domanda
Anonimo
2022-07-06T12:49:42+00:00

Ciao Gianfranco,

ciao

fatto bene

si nota la differenza tra un esperto vba

e un principiante

ma intanto l'ho fatta e funziona😂

mi dimentico sempre

Application.EnableEvents = false

Application.EnableEvents = True

Grazie per la tua risposta molto gentile.

Non dubito che molte volte in futuro sarai in grado di offrire commenti e critiche costruttive per il miglioramento del mio codice e, anzi, lo accoglierò con favore.

Alla prossima.

===

Regards,

Norman

Immagine

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento
Risposta accettata dall'autore della domanda
Anonimo
2022-07-06T12:39:12+00:00

Ciao rikygio,

Grazie mille per la risposta, è esattamente ciò che mi serviva.

Io avevo già un codice inserito in vba per tenere traccia dell'orario di modifica della colonna delle quantità, in modo da tenere sempre aggiornato il giorno e l'ora in cui ho levato un articolo.

Come posso tenere entrambi i codici che lavorano parallelamente?

Private Sub Worksheet_Change(ByVal Target As Range) Dim WorkRng As Range Dim Rng As Range Dim xOffsetColumn As Integer Set WorkRng = Intersect(Application.ActiveSheet.Range("B:B"), Target) xOffsetColumn = 1 If Not WorkRng Is Nothing Then Application.EnableEvents = False For Each Rng In WorkRng If Not VBA.IsEmpty(Rng.Value) Then Rng.Offset(0, xOffsetColumn).Value = Now Rng.Offset(0, xOffsetColumn).NumberFormat = "dd-mm-yyyy, hh:mm:ss" Else Rng.Offset(0, xOffsetColumn).ClearContents End If Next Application.EnableEvents = True End If End Sub Grazie ancora

Prova qualcosa del genere:

'========>>

Option Explicit

'-------->>

Private Sub Worksheet_Change(ByVal Target As Range)

Dim Rng As Range, rngTabella As Range, rngProdotto As Range 

Dim rngFind As Range 

Dim WorkRng As Range 

Dim Rng2 As Range 

Dim xOffsetColumn As **Long** 

Const sTabella As String = "A3: E16"            '<<=== Modifica 

Const sCella\_Prodotto As String = "K3"        '<<=== Modifica 

With Me 

    Set rngTabella = .Range(sTabella) 

    Set rngProdotto = .Range(sCella\_Prodotto) 

End With 

If Not Intersect(rngProdotto, Target) Is Nothing Then 

    Set rngFind = rngTabella.Columns(1).Find(What:=rngProdotto.Value, After:=rngTabella.Cells(1), LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False) 

    If Not rngFind Is Nothing Then 

        On Error GoTo XIT 

        Application.EnableEvents = False 

        With rngFind.Offset(0, 4) 

            .Value = .Value - 1 

        End With 

    Else 

        Call MsgBox(Prompt:="il prodotto " & rngProdotto.Value & " non trovato!", \_ 

            Buttons:=vbCritical, \_ 

            Title:="REPORT") 

    End If 

    **GoTo XIT** 

End If 

    Set WorkRng = Intersect(**Me**.Range("B:B"), Target) 

    xOffsetColumn = 1 

    If Not WorkRng Is Nothing Then 

    **On Error GoTo XIT** 

        Application.EnableEvents = False 

        For Each Rng In WorkRng.Cells 

            If Not VBA.IsEmpty(Rng.Value) Then 

                Rng.Offset(0, xOffsetColumn).Value = Now 

                Rng.Offset(0, xOffsetColumn).NumberFormat = "dd-mm-yyyy, hh:mm:ss" 

            Else 

                Rng.Offset(0, xOffsetColumn).ClearContents 

            End If 

        Next  **Rng** 

XIT:

    Application.EnableEvents = True 

End If 

End Sub

'<<========

Nota che ho leggermente modificato il tuo codice, come indicato in rosso, anche per motivi di predelizioni personali.

===

Regards,

Norman

Immagine

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento
Risposta accettata dall'autore della domanda
Anonimo
2022-07-06T12:13:45+00:00

Ciao Gianfranco,

Chiedo scusa, vedo che quando ho postato il mio suggerimento, tu avevi già postato una soluzione.

Comunque ho deciso di lasciare la mia risposta in parte perché avevo già scritto il mio codice e in parte perché penso che sia importante disabilitare gli eventi quando una procedura Worksheet_Change scrive nel foglio di lavoro, questo perché, altrimenti, il codice farà chiamate ricorsive a se stesso e, a seconda del codice, tali chiamate potrebbero causare un messaggio di errore di memoria esaurita.

Questo non è inteso in alcun modo come una critica alla tua eccellente soluzione, ma piuttosto come un suggerimento per un piccolo miglioramento.

===

Regards,

Norman

Immagine

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento
Risposta accettata dall'autore della domanda
Anonimo
2022-07-06T11:53:14+00:00

Ciao rikygio,

Volevo chiedervi gentilmente aiuto a risolvere questo quesito:

Io ho due colonne di numeri, la prima si riferisce al codice identificativo di un determinato prodotto (nel mio caso la colonna A), la seconda alla quantità di prodotti che ho (nel mio caso la colonna E). Esempio: colonna A 01 (che so che sono le pere); colonna E 3. Vuol dire che in magazzino ho 3 pere.

Vorrei che se digito in una cella al di fuori di queste due colonne (sempre e solo la stessa cella- nel mio caso K3), il codice identificativo del prodotto, il programma diminuisca di un'unità la seconda colonna delle quantità, corrispondente al prodotto inserito. Esempio: se nella cella K3 inserisco 01 vorrei che nella cella E affianco al codice articolo 01, non ho più 3 pere ma 2.

Sono riuscito ad ottenere ciò che ho in mente con questa funzione: =CERCA(K3;A3:A15;E3:E15-1); il problema è che riesco ad ottenerlo solamente al di fuori delle due colonne in questione, e non riesco a sostituire il nuovo numero di quantità al vecchio. Vorrei anche che questo metodo fosse iterativo, quindi se io inserisco per una seconda volta il numero del prodotto nella cella di immissione, la quantità di prodotto corrispondente diminuisca ancora un'altra volta. Esempio: quindi se inserisco nuovamente nella cella K3 il codice 01 vorrei che nella cella E affianco al codice articolo 01, non ho più 2 pere ma 1.

Spero di essere stato sufficentemente chiaro,

Una soluzione sarebbe sfruttare VBA.

Quindi, prova qualcosa del genere:

  • Fai clic dx sulla linguetta del foglio di interesse
  • Seleziona l'opzione Visualizza Codice dal **** menu contestuale risultante
  • Incolla il seguente codice:

 '========>>

Option Explicit

'-------->>

Private Sub Worksheet_Change(ByVal Target As Range)

Dim Rng As Range, rngTabella As Range, rngProdotto As Range 

Dim rngFind As Range 

Const sTabella As String = **"A3: E16"               '&lt;&lt;=== Modifica** 

Const sCella\_Prodotto As String = **"K3"           '&lt;&lt;=== Modifica** 

With Me 

    Set rngTabella = .Range(sTabella) 

    Set rngProdotto = .Range(sCella\_Prodotto) 

End With 

If Not Intersect(rngProdotto, Target) Is Nothing Then 

    Set rngFind = rngTabella.Columns(1).Find(What:=rngProdotto.Value, After:=rngTabella.Cells(1), LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False) 

    If Not rngFind Is Nothing Then 

        On Error GoTo XIT 

        Application.EnableEvents = False 

        With rngFind.Offset(0, 4) 

            .Value = .Value - 1 

        End With 

    Else 

        Call MsgBox(Prompt:="il prodotto " & rngProdotto.Value & " non trovato!", \_ 

        Buttons:=vbCritical, \_ 

        Title:="REPORT") 

    End If 

XIT:

    Application.EnableEvents = True 

End If 

End Sub

'<<======== 

  • Alt+Q per chiudere l'editor di VBA e tornare a Excel.
  • Salva il file con l'estensione xlsm.

Ora, inserendo il codice di un prodotto nella cella K3, la quantità del prodotto corrispondente nella tabella viene ridotta di 1.

Potresti svcaricare il mio file di prova Rikygio20220706.xlsm

===

Regards,

Norman

Immagine

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento

10 risposte aggiuntive

Ordina per: Più utili
  1. Gianfranco55 25,190 Punti di reputazione Moderatore volontario
    2022-07-06T11:47:13+00:00

    ciao

    metti questa sul foglio interessato

    Private Sub Worksheet_Change(ByVal Target As Range)

    Dim Lista As Range

    If Not Intersect(Target, Range("K3")) Is Nothing Then

    Set Lista = Range(Cells(2, 1), Cells(2, 1).End(xlDown))

    For Each CL In Lista

    If CL = Target.Value Then

    CL.Offset(0, 4) = CL.Offset(0, 4) - 1

    End If

    Next

    End If

    End Sub

    quando scrivi in K3 ricerca il codice e diminuisce di uno la quantità

    esempio

    https://www.dropbox.com/s/zrmgzaxzgcrv6jy/cl%20con%20diminuzione%20valore.xlsm?dl=0

    La risposta è stata utile?

    0 commenti Nessun commento