Condividi:        

macro pigra anzi dormiente

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

macro pigra anzi dormiente

Postdi giorgioa » 26/07/23 15:57

Salve, esiste un modo per velocizzare una macro?
sotto un for principale che determina il campo d'azione
ho provato ad annidare le operazioni che la macro deve
in sotto for.
cosa farebbe questa macro dormiente legge i dati di 5 celle (c:g) e li deve sottrarre
l'una all'altra cella che in tutto per ogni riga fanno 10 sottrazioni
i dati li pone nelle celle da H4:Q
cioè in h4=c-d in i4=c-e,
in j4=c-f;
in k4=c-g
poi in i4=d-e
ecc
io ho fatto cosi
For c = 1 To c
For x = 1 To 4
Cells(3 + c, 7 + x).Value = Abs(Cells(3 + c, "c").Value - Cells(3 + c, 3 + x).Value) + Cells(3 + c, "A")
Next x
Next c
For c = 1 To c
For y = 1 To 3
Cells(3 + c, 11 + y).Value = Abs(Cells(3 + c, "d").Value - Cells(3 + c, 4 + y).Value) + Cells(3 + c, "A")
Next y
Next c
For c = 1 To c
For z = 1 To 2
Cells(3 + c, 14 + z).Value = Abs(Cells(3 + c, "e").Value - Cells(3 + c, 5 + z).Value) + Cells(3 + c, "A")
Next z
Next c
For c = 1 To c
For i = 1 To 1
Cells(3 + c, 17).Value = Abs(Cells(3 + c, "f").Value - Cells(3 + c, 7).Value) + Cells(3 + c, "A")
Next i
Next c
Voi come avreste fatto per renderla più veloce?
una persona di buona volontà

Grazie
giorgioa
Utente Senior
 
Post: 773
Iscritto il: 16/04/12 15:00

Sponsor
 

Re: macro pigra anzi dormiente

Postdi giorgioa » 26/07/23 16:46

dimenticavo e per non complicare
alla fine di ogni riga di codice c'è +cells(2+c,"A")
non va presa in considerazione
giorgioa
Utente Senior
 
Post: 773
Iscritto il: 16/04/12 15:00

Re: macro pigra anzi dormiente

Postdi Anthony47 » 26/07/23 22:03

Nell'ipotesi che vuoi calcolare quei valori per un blocco di righe (non una singola riga), prova:
Codice: Seleziona tutto
Sub boh()
Dim Start As Range, oRan As Range
Dim wArr, I As Long, J As Long, K As Long
Dim oArr(), iOar As Long
'
Set Start = Range("C4")         '<<< Dove cominciano i dati di partenza
Set oRan = Range("H4")          '<<< Dove scrivere i risultati
'
wArr = Range(Start, Start.End(xlDown)).Resize(, 5).Value
ReDim oArr(1 To UBound(wArr), 1 To 10)
For I = 1 To UBound(wArr)
    iOar = 1
    For J = 1 To UBound(wArr, 2) - 1
        For k = J + 1 To UBound(wArr, 2)
            oArr(I, iOar) = wArr(I, J) - wArr(I, k)
            iOar = iOar + 1
        Next k
    Next J
Next I
oRan.Resize(UBound(wArr), 10) = oArr
End Sub

Inserisci il codice in un modulo standard del vba, controlla che le due righe marcate <<< siano compilate correttamente secondo il tuo layout dati, esegui la macro
Avatar utente
Anthony47
Moderatore
 
Post: 19425
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: macro pigra anzi dormiente

Postdi giorgioa » 27/07/23 04:01

solo una aggiunta che nella sottrazione deve prendere il numero + grande e sottrarre il + piccolo

ho risolto il problema

Grazie

Macro super veloce
giorgioa
Utente Senior
 
Post: 773
Iscritto il: 16/04/12 15:00

Re: macro pigra anzi dormiente

Postdi Anthony47 » 27/07/23 08:49

solo una aggiunta che nella sottrazione deve prendere il numero + grande e sottrarre il + piccolo
Io avrei usato ABS:
Codice: Seleziona tutto
            oArr(I, iOar) = Abs(wArr(I, J) - wArr(I, K))
Avatar utente
Anthony47
Moderatore
 
Post: 19425
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: macro pigra anzi dormiente

Postdi giorgioa » 27/07/23 11:27

si l'ho individuato subito

un ultimo soffio e poi ...
alla riga abs potresti aggiungere il valore di riga di colonna A?
ho provato con +cells(1+n (variabile che somma le righe complessive), "A") sarebbe come rif.riga
ma mi aggiunge alla somma trovata + il totale delle righe occupate
giorgioa
Utente Senior
 
Post: 773
Iscritto il: 16/04/12 15:00

Re: macro pigra anzi dormiente

Postdi Anthony47 » 27/07/23 14:14

alla riga abs potresti aggiungere il valore di riga di colonna A?

Quindi
Codice: Seleziona tutto
            oArr(I, iOar) = Abs(wArr(I, J) - wArr(I, K)) + Start.Cells(I, 1).Row

Prova...
Avatar utente
Anthony47
Moderatore
 
Post: 19425
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: macro pigra anzi dormiente

Postdi giorgioa » 27/07/23 14:20

tanto va la gatta al lardo che ci lascia lo zampino

Set zonar = Range(Cells(1, 1), Cells(1, 1).End(xlDown))
y = zonar.Rows.Count

oArr(I, iOar) = Abs(wArr(I, J) - wArr(I, K))+cells(y,"A")

ok e grazie per la macro

non avevo visto il tuo aiuto = +start.cells(i,1).row
giorgioa
Utente Senior
 
Post: 773
Iscritto il: 16/04/12 15:00

Re: macro pigra anzi dormiente

Postdi Anthony47 » 27/07/23 14:29

Qualsiasi soluzione che funzioni "è perfetta" (anche se fosse ...migliorabile :D )
Avatar utente
Anthony47
Moderatore
 
Post: 19425
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: macro pigra anzi dormiente

Postdi giorgioa » 29/07/23 08:06

Salve,

hai ragione sul perfezionamento, anzi sul non funzionamento
ho dovuto ripiegare sul tuo aiuto.

Buona giornata
giorgioa
Utente Senior
 
Post: 773
Iscritto il: 16/04/12 15:00


Torna a Applicazioni Office Windows


Topic correlati a "macro pigra anzi dormiente":


Chi c’è in linea

Visitano il forum: Nessuno e 8 ospiti