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,270 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. Anonimo
    2022-07-06T12:27:25+00:00

    Grazie infinite per la risposta,

    è esattamente ciò di cui avevo bisogno.

    Il codice però non funziona con la pistola per codice a barre che ho.

    In ogni caso grazie davvero.

    Inoltre io avevo questo codice già inserito in vba:

    Private Sub Worksheet_Change(ByVal Target As Range)
    'Update 20140722
    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

    Ora il secondo codice funziona solo se cambio manualmente i valori delle quantità (colonna E) e non in automatico con il bellissimo codice che mi hai dato tu. è possibile avere che mi inserisce la data e l'ora dell'ultima modifica della quantità di prodotto in automatico?

    Grazie mille ancora sei stat gentilissimo

    La risposta è stata utile?

    0 commenti Nessun commento