Blocco formule all'interno di una cella

Anonimo
2016-11-11T10:30:39+00:00

Buongiorno,

in un file excel ho inserito delle formule in alcune celle: queste formule elaborano i dati provenienti da un foglio di lavoro "dati" che cambia utilizzando una macro all'interno del file excel stesso.

Quando faccio "girare la macro" per aggiornare il foglio "dati" mi ritrovo nell'altro foglio con le formule nelle celle cambiate, nonostante abbia provato a bloccarle con il "$" e bloccando le celle e proteggendo il foglio di lavoro.

Grazie

Microsoft 365 e Office | Excel | Per la casa | 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

3 risposte

Ordina per: Più utili
  1. Anonimo
    2016-11-11T15:05:53+00:00

    Ciao Giurino,

    La macro è molto lunga 

    [cut]

    Ho dato un'occhiata veloce al tuo codice e credo che possa essere notevolemente acciorciato e reso molto più efficiente.

    Tuttavia, prima di fare suggerimenti, ti chiederei gentilmente di caricare il file problematico, privo di dati sensibili, su un servizio di condivisione di file, come MicrosoftOneDrive o DropBox, e di postare un link al file in una risposta qui.

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2016-11-11T14:41:45+00:00

    La macro è molto lunga in quanto adatta il formato dei dati ad una successiva elaborazione che viene fatta da altre macro... Ho comunque visto che dopo l'esecuzione di questa macro nel foglio di riepilogo la formule cambiano.


    Sub mise_en_forme_ordo()

        Dim col, n, i, j As Integer      'col rappresenta il numero di colonna, n dà il numero di linee di rapporto, i e j sono dei contatori

        Dim copie, mat As String     'copie rappresenta il valore da copiare (data, calandra tipo ..), mat è il tipo di prodotto

        Dim cel As Range

    Worksheets("ordo").Select

        n = Cells(Rows.Count, 1).End(xlUp).Row

           Cells.Replace What:="PET RATELIER ", Replacement:="", LookAt:=xlPart, _

            SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _

            ReplaceFormat:=False

            'Cancella CNOPK del rappoto d'ordo che non apporta valore aggiunto

           Cells.Replace What:=" CNOPK", Replacement:="", LookAt:=xlPart, _

            SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _

            ReplaceFormat:=False

       'Cancella MFD  del rapporto d'ordo che non apporta valore aggiunto

           Cells.Replace What:="MFD ", Replacement:="", LookAt:=xlPart, _

            SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _

            ReplaceFormat:=False

        'Annulla la fusione delle celle per poterle ordinare

        n = Rows(1).Find("Commentaire Planneur").Column

        If n = 5 Then

        Else

        Columns(n).Select

        Application.CutCopyMode = False

        Selection.Copy

        Application.CutCopyMode = False

        Selection.Cut

        Columns(5).Select

        Selection.Insert Shift:=xlToRight

        End If

        'Trova l'ultima linea del rapporto (prende n-1 per non contare il totale). E' importante fare questo contaggio prima di spostare le colonne, altrimenti tutto il calcolo risulta sbagliato

        n = Cells(Rows.Count, 1).End(xlUp).Row

           col1 = Rows(1).Find("Date Fabrication").Column

           col3 = Rows(1).Find("Journée Michelin").Column

        'Questo ciclo permette di copiare e riempire le celle vuote con MAG-PK.

            For i = 2 To n

                If Cells(i, 5) = "" Then

                Cells(i, 5) = "MAG-PK"

                End If

               Cells(i, col1) = DateValue(Cells(i, col1))

               Cells(i, col3) = DateValue(Cells(i, col3))

            Next i

       ' Next col

    'Questo passaggio permette di cancellare la produzione sulle calandre EB

    n = Rows(1).Find("Machine").Column

        If n = 1 Then

        Else

        Columns(n).Select

        Application.CutCopyMode = False

        Selection.Copy

        Application.CutCopyMode = False

        Selection.Cut

        Columns(1).Select

        Selection.Insert Shift:=xlToRight

        End If

        n = Cells(Rows.Count, 1).End(xlUp).Row

         ActiveWorkbook.Worksheets("ordo").Sort.SortFields.Clear

    'Mette come 1° criterio di ordinamento la calandra

        ActiveWorkbook.Worksheets("ordo").Sort.SortFields.Add Key:=Range("A2:A" & n) _

            , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal

           With ActiveWorkbook.Worksheets("ordo").Sort

            .SetRange Range("A1:BA" & n)

            .Header = xlYes

            .MatchCase = False

            .Orientation = xlTopToBottom

            .SortMethod = xlPinYin

            .Apply

        End With

      Min = Columns(1).Find("EB").Row

      Rows(Min & ":" & n).Select

      Selection.Delete Shift:=xlUp

    'Questo passaggio permette di ordinare le colonne secondo un ordine fisso, qualsiasi posizione di partenza le colonne hanno. Il codice è dettagliato solo per la prima colonna.

    'Posiziona la data Michelin sulla prima colonna

    n = Rows(1).Find("Journée Michelin").Column 'Questo n rappresenta la colonna dove prima si trovava il dato "Michelin date"

        If n = 1 Then 'Questo test vede se la colonna è gia ben posizionata; in caso affermativo, non fa nulla...

        Else          '...altrimenti la mette al buon posto

        Columns(n).Select

        Application.CutCopyMode = False

        Selection.Copy

        Application.CutCopyMode = False

        Selection.Cut

        Columns(1).Select

        Selection.Insert Shift:=xlToRight

        End If

    'La colonna Machine è gia correttamente posizionata

    'Posiziona la colonna heure fabrication sulla 3° colonna

    n = Rows(1).Find("Heure Fabrication").Column

        If n = 3 Then

        Else

        Columns(n).Select

        Application.CutCopyMode = False

        Selection.Copy

        Application.CutCopyMode = False

        Selection.Cut

        Columns(3).Select

        Selection.Insert Shift:=xlToRight

      End If

    'Posiziona la colonna resource sulla 4° colonna

    n = Rows(1).Find("Ressource").Column

        If n = 4 Then

        Else

        Columns(n).Select

        Application.CutCopyMode = False

        Selection.Copy

        Application.CutCopyMode = False

        Selection.Cut

        Columns(4).Select

        Selection.Insert Shift:=xlToRight

        End If

    'Posiziona la colonna Product Code sulla 5° colonna

    n = Rows(1).Find("Produit").Column

        If n = 5 Then

        Else

        Columns(n).Select

        Application.CutCopyMode = False

        Selection.Copy

        Application.CutCopyMode = False

        Selection.Cut

        Columns(5).Select

        Selection.Insert Shift:=xlToRight

        End If

    'Posiziona la colonna Quantité (Pièce) sulla 6° colonna

    n = Rows(1).Find("Quantité (Pièce)").Column

        If n = 6 Then

        Else

        Columns(n).Select

        Application.CutCopyMode = False

        Selection.Copy

        Application.CutCopyMode = False

        Selection.Cut

        Columns(6).Select

        Selection.Insert Shift:=xlToRight

        End If

    'Posiziona la colonna Quantité (M2) sulla 7° colonna

    n = Rows(1).Find("Quantité (M2)").Column

        If n = 7 Then

        Else

        Columns(n).Select

        Application.CutCopyMode = False

        Selection.Copy

        Application.CutCopyMode = False

        Selection.Cut

        Columns(7).Select

        Selection.Insert Shift:=xlToRight

        End If

    'Posiziona la colonna Commentaires sulla 8° colonna

    n = Rows(1).Find("Commentaire Planneur").Column

        If n = 8 Then

        Else

        Columns(n).Select

        Application.CutCopyMode = False

        Selection.Copy

        Application.CutCopyMode = False

        Selection.Cut

        Columns(8).Select

        Selection.Insert Shift:=xlToRight

        End If

    'Posiziona la colonna Renfort Code sulla 9° colonna

    n = Rows(1).Find("Code Renfort").Column

        If n = 9 Then

        Else

        Columns(n).Select

        Application.CutCopyMode = False

        Selection.Copy

        Application.CutCopyMode = False

        Selection.Cut

        Columns(9).Select

        Selection.Insert Shift:=xlToRight

        End If

    'Posiziona la colonna longueur renfort sulla 10° colonna

    n = Rows(1).Find("Longueur renfort (m)").Column

        If n = 10 Then

        Else

        Columns(n).Select

        Application.CutCopyMode = False

        Selection.Copy

        Application.CutCopyMode = False

        Selection.Cut

        Columns(10).Select

        Selection.Insert Shift:=xlToRight

        End If

    'Posiziona la colonna Nb de fils sulla 11° colonna

    n = Rows(1).Find("Nb de fils").Column

        If n = 11 Then

        Else

        Columns(n).Select

        Application.CutCopyMode = False

        Selection.Copy

        Application.CutCopyMode = False

        Selection.Cut

        Columns(11).Select

        Selection.Insert Shift:=xlToRight

        End If

    'Posiziona la colonna pas sulla 12° colonna

    n = Rows(1).Find("Pas").Column

        If n = 12 Then

        Else

        Columns(n).Select

        Application.CutCopyMode = False

        Selection.Copy

        Application.CutCopyMode = False

        Selection.Cut

        Columns(12).Select

        Selection.Insert Shift:=xlToRight

        End If

    'Posiziona la colonna Tps réglage sulla 13° colonna

    n = Rows(1).Find("Tps réglage").Column

        If n = 13 Then

        Else

        Columns(n).Select

        Application.CutCopyMode = False

        Selection.Copy

        Application.CutCopyMode = False

        Selection.Cut

        Columns(13).Select

        Selection.Insert Shift:=xlToRight

        End If

    'Questo passagio permette di ordinare bene i dati: verranno divisi in 1) giorno, 2) macchina, 3) campagna

     col1 = Rows(1).Find("Date Fabrication").Column

     col3 = Rows(1).Find("Journée Michelin").Column

       n = Cells(Rows.Count, 1).End(xlUp).Row

        ActiveWorkbook.Worksheets("ordo").Sort.SortFields.Clear 'cancella tutte le regole di ordinamento

        'Mette come primo criterio di ordinamento la calandra

        ActiveWorkbook.Worksheets("ordo").Sort.SortFields.Add Key:=Range("B2:B" & n) _

            , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal

        'Mette come secondo criterio di ordinamento la data Michelin

        ActiveWorkbook.Worksheets("ordo").Sort.SortFields.Add Key:=Range(Cells(2, col3), Cells(n, col3)) _

            , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _

            xlSortTextAsDate 'Mette come primo criterio di ordinamento la data

        'Mette come secondo criterio di ordinamento la data di fabbricazione

        ActiveWorkbook.Worksheets("ordo").Sort.SortFields.Add Key:=Range(Cells(2, col1), Cells(n, col1)) _

            , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _

            xlSortTextAsDate 'Mette come primo criterio di ordinamento la data

        'Mette come terzo criterio di ordinamento l'ora della campagna

            ActiveWorkbook.Worksheets("ordo").Sort.SortFields.Add Key:=Range("C2:C" & n) _

            , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortTextAsNumbers

        'Applica l'ordinamento

        With ActiveWorkbook.Worksheets("ordo").Sort

            .SetRange Range("A1:AF" & n)

            .Header = xlYes

            .MatchCase = False

            .Orientation = xlTopToBottom

            .SortMethod = xlPinYin

            .Apply

        End With

    '

    '

          'Inserimento di una colonna Compteur che serve a fare la differenza tra le campagne

    col = Rows(1).Find("Tps réglage").Column

        Columns(col + 1).Select

        Selection.Insert Shift:=xlToLeft, CopyOrigin:=xlFormatFromLeftOrAbove

    Cells(1, col + 1) = "Compteur"

    'questa parte permette di differenziare le campagne secondo il tempo di cambio dimensione (se =0 allora è la stessa campagna)

    compteur = 0    'variabile che permette di identificare le campagne

    machinebis = "" 'variabile che permette di conservare in memoria la macchina prima per fare la fusione dei cells (ergonomia) e fare un paragone con la linea prima

        For i = 2 To n  'n è il massimo di linee

        machine = Cells(i, 2)

      If machine = "WKC CAL CAL804" Or machine = "WKC CAL CAL802" Then

            If Cells(i, col) = "0h 0m 0s" Then

                If machine = machinebis Then    'se è la stessa calandra e che il cambio dimensione =0 allora è lo stesso numero

                Else

                compteur = compteur + 1          'se la calandra è diversa allora il compteur cambia (nuova campagna giustamente !)

                machinebis = machine             ' cambia il riferimento per la calandra

                End If

            Else

                compteur = compteur + 1         'se il cambio di dimensione è diverso di 0 allora è un cambio di campagna

                machinebis = machine

                End If

        Else

            If Cells(i, col) = "0h 0m 0s" Or Cells(i, col) = "1h 0m 0s" Or Cells(i, col) = "0h 30m 0s" Then

                If machine = machinebis Then    'se è la stessa calandra e che il cambio dimensione =0 allora è lo stesso numero

                Else

                compteur = compteur + 1          'se la calandra è diversa allora il compteur cambia (nuova campagna giustamente !)

                machinebis = machine             ' cambia il riferimento per la calandra

                End If

            Else

                compteur = compteur + 1         'se il cambio di dimensione è diverso di 0 allora è un cambio di campagna

               ' If i = 3 Then

                machinebis = machine

              '  End If

            End If

        End If

        Cells(i, col + 1) = compteur            'indicare il numero della campagna

        Next i

        Worksheets("Azioni").Select

    End Sub


    In partica mi servirebbe bloccare il foglio di lavoro in cui ci sono le formule affichè la macro non le cambi e riattivarlo quando la macro ha terminato l'esecuzione.

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2016-11-11T14:26:35+00:00

    Ciao Giurino,

    in un file excel ho inserito delle formule in alcune celle: queste formule elaborano i dati provenienti da un foglio di lavoro "dati" che cambia utilizzando una macro all'interno del file excel stesso.

    Quando faccio "girare la macro" per aggiornare il foglio "dati" mi ritrovo nell'altro foglio con le formule nelle celle cambiate, nonostante abbia provato a bloccarle con il "$" e bloccando le celle e proteggendo il foglio di lavoro.

    Prova a postare il codice della macro.

    Postscriptum:

    Sarebbe anche molto utile se potessi caricare il file problematico, privo di dati sensibili, su un servizio di condivisione di file, come MicrosoftOneDrive o DropBox, e di postare un link al file in una risposta qui.

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento