Valutazione 4.87/ 5 (100.00%) 5838 voti

Condividi:        

Excel - Sostituire formula con valore

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

Excel - Sostituire formula con valore

Postdi Flash30005 » 01/11/08 22:27

Ciao Antony
Devo riempire un area con dei valori provenienti da una matrice (inizialmente bastava segnalare con delle X ma poi...)
Nel foglio c'era la formula sign che era ripetuta migliaia di volte su tutta l'area appesantendo il file cosicché con una macro metto la formula che mi genera l' X ma poi lo sostituisco con il valore oppure con cella vuota.
La macro funziona ma mi sembra che sia un "doppio lavoro" e vorrei con qualche tuo consiglio mettere direttamente il valore della routine contenuta in questa macro:
Codice: Seleziona tutto
Sub CreaMatrX()
Worksheets("DATI2").Select
Ue = Worksheets("DATI2").Range("I" & Rows.Count).End(xlUp).Row
Sign = "=IF(OR(RC10=R1C,RC11=R1C,RC12=R1C,RC13 =R1C,RC14=R1C,RC15=R1C,RC16=R1C,RC17=R1C,RC18=R1C,RC19=R1C,RC20=R1C,RC21=R1C,RC22=R1C,RC23=R1C,RC24=R1C,RC25=R1C, RC26=R1C,RC27=R1C,RC28=R1C,)=TRUE,""X"","""")"
For I = 2 To Ue
    For Col = 29 To 118
        Cells(I, Col).Select
        ActiveCell.FormulaR1C1 = Sign
If ActiveCell.Value = "X" Then
XVal = Cells(1, Col).Value
            With Worksheets("DATI2").Range("I" & I & ":AB" & I)
            Set c = .Find(XVal, LookIn:=xlValues)
                If Not c Is Nothing Then
                    firstAddress = c.Address
                    RC = Worksheets("DATI2").Cells(I, c.Column + 110)
                    Worksheets("DATI2").Cells(I, Col).Value = RC
             Do
                Set c = .FindNext(c)
                If firstAddress = c.Address Then Exit Do
                    RC = Worksheets("DATI2").Cells(I, c.Column + 110)
                    Worksheets("DATI2").Cells(I, Col).Value = RC
                   
                    Loop While Not c Is Nothing And c.Address <> firstAddress
                End If
        End With
        Else
Worksheets("DATI2").Cells(I, Col).Value = ""
End If
    Next Col
Next I
End Sub

Cosa mi consigli?

Ciao
Flash
Win7 + Office 2010 Ita
"Fotografica" al servizio dell'immagine

Ottime opportunità di lavoro (part-time o full-time) con guadagni immediati. Info in MP
Avatar utente
Flash30005
Moderatore
 
Post: 8460
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Sponsor
 

Re: Excel - Sostituire formula con valore

Postdi Anthony47 » 02/11/08 13:00

Perche' mi vuoi torturare con una formula in stile R1C1 e chiedendomi il reverse engineering di una macro che non so che dovrebbe fare?

Vado a occhio..
Nella prima parte inserisci la formula SIGN, nelle 90 colonne di destra (AC:DN), una cella alla volta, per ogni riga usata.
Una X identifica una corrispondenza tra quanto scritto in intestazione di colonna e quanto scritto in una delle celle J:AB.

In presenza della X, vai a cercare sul range I:AB (e' giusto J:AB o I:AB?) il valore dell' intestazione di colonna, quindi prelevi il valore dalla cella con offset di colonna=110 e metti questo valore al posto della X.
Se e' cosi', allora io sostituirei tutto con una formula del tipo
=SE(VAL.ERRORE(CONFRONTA(AC$1;$J2:$AB2;0));"";SCARTO($J2;0;CONFRONTA(AC$1;$J2:$AB2;0)+109))
che copierei in un solo botto nelle celle AC2:DNxx con queste istruzioni:
Codice: Seleziona tutto
Range("AC2:DN" & Rows.Count).Clearcontents
Ue = Worksheets("DATI2").Range("I" & Rows.Count).End(xlUp).Row
Form1 = "=SE(VAL.ERRORE(CONFRONTA(AC$1;$J2:$AB2;0));"""";SCARTO($J2;0;CONFRONTA(AC$1;$J2:$AB2;0)+109))"
Range("AC2:DN" & Ue).FormulaLocal = Form1

Se hai paura che tante formule impattino la velocita' di calcolo, continua la macro per sostituire le formule coi valori:
Codice: Seleziona tutto
Range("AC2:DN" & Ue).Select
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
Application.CutCopyMode = False

Questo PERO' vale solo se in J:AB non hai numeri duplicati.

Fai sapere, ciao.
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13899
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Excel - Sostituire formula con valore

Postdi Flash30005 » 02/11/08 21:45

Si, grazie Anthony
Il metodo confronta funziona (non sapevo come "codificarlo" specialmente abbinato a scarto) :oops:
pero... i tempi sono un po' lunghi e siccome la vita è breve... ho cercato qualcosa di diverso:
da J2 a AB2 ho i miei numeri che devo confrontare con il range AC1 - DN1
da AC1:AL1 ho
Codice: Seleziona tutto
11   21   31   41   51   61   71   81   91   101

(sono 10 colonne) poi di seguito da AM1 a AV1 ho
Codice: Seleziona tutto
12   22   32   42   52   62   72   82   92   102

e così via fino ad arrivare al nono gruppo in DE1 DN1
Codice: Seleziona tutto
19   29   39   49   59   69   79   89   99   109

Allora mi sono detto che avrei potuto innanzitutto trovare la colonna di apparteneza senza confrontare con formule ma semplicemente sapendo che il numero più a destra determina la decina (di colonne) e quello/li rimanenti la colonna all'interno della decina es:
92 = 2*10 + 9 = 29 (peccato solo che ho anche numeri con 3 cifre altrimenti avrei potuto solo invertire le due cifre) e il 29 è posizionato nella colonna AU che corrisponde alla colonna 47 ho preso come riferimento la colonna R (che è 18) per addizionare il 29 e avere il numero di colonna (18+29=47) da utilizzare per mettere il valore dell'altra matrice (spostata di 110 colonne rispetto ai numeri dell'area Jx:ABx) in pratica con questo codice:
Codice: Seleziona tutto
Sub CreaMatrX()
Application.Calculation = xlManual
Worksheets("DATI2").Select
Ue = Worksheets("DATI2").Range("I" & Rows.Count).End(xlUp).Row
For I = 2 To Ue
 For CC = 10 To 28
 If Cells(I, CC).Value = 0 Then GoTo Newcc
 LungVal = Len(Cells(I, CC).Value) - 1
    ColMat = Right(Cells(I, CC).Value, 1) * 10 + Left(Cells(I, CC).Value, LungVal)
Sheets("DATI2").Range("R" & I).Offset(0, ColMat).Value = Cells(I, CC + 110)
Next CC
Newcc:
Next I
End Sub

ottengo in quattro secondi quello che prima ottenevo in più di un minuto ;)
(ma tu questo non potevi saperlo e nemmeno io fino a che non si è "accesa la lampadina").
Devo dire inoltre che non avrei potuto realizzare la macro senza aver imparato da te l'istruzione Offset

Ciao e grazie ancora
Flash
Win7 + Office 2010 Ita
"Fotografica" al servizio dell'immagine

Ottime opportunità di lavoro (part-time o full-time) con guadagni immediati. Info in MP
Avatar utente
Flash30005
Moderatore
 
Post: 8460
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: Excel - Sostituire formula con valore

Postdi Anthony47 » 03/11/08 14:23

In effetti quello che dovevi fare mi pare leggermente diverso da quanto avevo immaginato; se nonostante cio' la formula "Confronta" funzionava e' stata pura combinazione.

Ciao.
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13899
Iscritto il: 21/03/06 16:03
Località: Ivrea


Torna a Applicazioni Office Windows


Topic correlati a "Excel - Sostituire formula con valore":


Chi c’è in linea

Visitano il forum: Nessuno e 9 ospiti