Moderatori: Anthony47, Flash30005
Sub Cerca()
Dim nr(6)
Worksheets("Scenario").Select
Application.ScreenUpdating = False
'Application.Calculation = xlCalculationManual
fin = Range("G" & Rows.Count).End(xlUp).Row
For rig = 1 To fin
conta = 0
For col = 7 To 12
conta = conta + 1
If Cells(rig, col) < 10 Then
nr(conta) = 90 + Cells(rig, col)
Else
nr(conta) = Cells(rig, col)
End If
Next col
Cells(rig, 13) = Piramida(nr(1), nr(2), nr(3), nr(4), nr(5), nr(6))
Next rig
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub
Function Piramida(n1, Optional n2, Optional n3, Optional n4, Optional n5, Optional n6)
Dim Vet_Numeri(6): Dim Vet_Cifre(12)
Vet_Numeri(1) = n1: Vet_Numeri(2) = n2: Vet_Numeri(3) = n3: Vet_Numeri(4) = n4: Vet_Numeri(5) = n5: Vet_Numeri(6) = n6
conta = 0
For K = 1 To 6
If Not IsMissing(Vet_Numeri(K)) Then
Select Case Vet_Numeri(K)
Case 0: conta = conta
Case 10 To 99
conta = conta + 1
Vet_Cifre(conta) = Left(Vet_Numeri(K), 1)
conta = conta + 1
Vet_Cifre(conta) = Right(Vet_Numeri(K), 1)
End Select
End If
Next K
If conta = 0 Then Piramida = 0
If conta = 1 Then Piramida = Vet_Cifre(conta)
If conta > 1 Then
Num_linee_pir = conta - 1
ReDim Vet_linee(Num_linee_pir, conta)
For K = 1 To conta
Vet_linee(Num_linee_pir, K) = Vet_Cifre(K)
Next K
For Linea = Num_linee_pir - 1 To 1 Step -1
For num = 1 To Linea + 1
Vet_linee(Linea, num) = (Vet_linee(Linea + 1, num) + Vet_linee(Linea + 1, num + 1)) Mod 9
Next num
Next Linea
Piramida = (Vet_linee(1, 1) * 10 + Vet_linee(1, 2)) Mod 90
If Piramida = 0 Then Piramida = 90
End If
End Function
If Cells(rig, col) < 10 Then
nr(conta) = 90 + Cells(rig, col)
Else
nr(conta) = Cells(rig, col)
End If
For num = 1 To Linea + 1
Vet_linee(Linea, num) = (Vet_linee(Linea + 1, num) + Vet_linee(Linea + 1, num + 1)) Mod 9
'La linea sotto devi aggiungerla alla macro Piramida
If Vet_linee(Linea, num) = 0 Then Vet_linee(Linea, num) = 9
Next num
Sub PyraIKAll()
Dim wArr, oArr()
Dim myRan As Range, myArr(0 To 1) As String, myRow As String
Dim I As Long, J As Long, K As Long, cSum As Long, Dbg As Boolean
'
Dbg = False
wArr = Range(ActiveCell.Offset(0, -6), ActiveCell.Offset(0, -6).End(xlDown)).Resize(, 6).Value
ReDim oArr(1 To UBound(wArr), 1 To 1)
'
If Dbg Then Debug.Print ">>>>>>"
For K = 1 To UBound(wArr)
myArr(J) = ""
For I = 1 To 6
myArr(J) = myArr(J) & Format(wArr(K, I), "00")
Next I
Do
myRow = myArr(J)
J = (J + 1) Mod 2
myArr(J) = ""
For I = 2 To Len(myRow)
cSum = (CLng(Mid(myRow, I, 1)) + CLng(Mid(myRow, I - 1, 1))) Mod 9
If cSum = 0 Then cSum = 9
myArr(J) = myArr(J) & CStr(cSum)
Next I
If Dbg Then Debug.Print myArr(J)
If Len(myArr(J)) < 2 Then Exit Do
DoEvents
Loop
oArr(K, 1) = CLng(myArr(J))
Next K
ActiveCell.Resize(UBound(wArr), 1) = oArr
If Dbg Then Debug.Print UBound(wArr) & " <<<<"
End Sub
E' difficile difficile, ma ci proviamo lo stesso con questa variante:Se è una modifica semplice ti chiedo, con molta calma e se hai voglia, se puoi fare in modo che la piramide finisca, dove è necessario a due cifre ossia minore o uguale a 90.
Sub PyraIKAll()
Dim wArr, oArr()
Dim myRan As Range, myArr(0 To 1) As String, myRow As String
Dim I As Long, J As Long, K As Long, cSum As Long, Dbg As Boolean
'
Dbg = False
wArr = Range(ActiveCell.Offset(0, -6), ActiveCell.Offset(0, -6).End(xlDown)).Resize(, 6).Value
ReDim oArr(1 To UBound(wArr), 1 To 1)
'
If Dbg Then Debug.Print ">>>>>>"
For K = 1 To UBound(wArr)
myArr(J) = ""
For I = 1 To 6
myArr(J) = myArr(J) & Format(wArr(K, I), "00")
Next I
Do
myRow = myArr(J)
J = (J + 1) Mod 2
myArr(J) = ""
For I = 2 To Len(myRow)
cSum = (CLng(Mid(myRow, I, 1)) + CLng(Mid(myRow, I - 1, 1))) Mod 9
If cSum = 0 Then cSum = 9
myArr(J) = myArr(J) & CStr(cSum)
Next I
If Dbg Then Debug.Print myArr(J)
If Len(myArr(J)) < 3 Then Exit Do
' DoEvents
Loop
oArr(K, 1) = CLng("0" & myArr(J)) Mod 90
Next K
ActiveCell.Resize(UBound(wArr), 1) = oArr
If Dbg Then Debug.Print UBound(wArr) & " <<<<"
End Sub
...anche perche' quella che ho pubblicata è la versione piu' veloce tra quelle che ho sperimentato, di più non son capaceNon è una richiesta per velocizzare la macro va bene così
ikwae ha scritto:[..]sono arrivato al rigo Format(wArr(K, I), "00") [...]
Ebbene l’istruzione Format(wArr(K, I), "00") serve a mettere lo “0” dove serve, perche’ trasforma il valore (esempio) 3 in “03” mentre crea una stringa con i 6 numeri iniziali da cui il ciclo Do /Loop parte per la piramidazione.ikwae ha scritto:I Padri Fondatori, dello sviluppo dei numeri a piramide, dicono di aggiungere ai
numeretti (dall’1 al 9) lo 0(zero) o il 9 per avere la giusta piramidazione.
Udite_Udite nella macro di Anthony è “tutto compreso” non serve né lo 0 e neppure il 9.
Qui la precisazione e’ che basta selezionare la prima cella libera accanto all’elenco da “lavorare” e non l’intera colonna: nella maggior parte dei casi non succede niente di strano, ma in qualche circostanza marginale la macro potrebbe interpretare male il punto di partenza.ikwae ha scritto:selezionate l’intera colonna a destra delle sestine e mandate in
esecuzione la seconda macro e, dopo un tot di tempo, arrivano i risultati della piramidazione.
Sub PyraIKAll2()
Dim wArr, oArr()
Dim myRan As Range, myArr(0 To 1) As String, myRow As String
Dim I As Long, J As Long, K As Long, cSum As Long, Dbg As Boolean
'
Dbg = False
myTim = Timer
wArr = Range(ActiveCell.Offset(0, -6), ActiveCell.Offset(0, -6).End(xlDown)).Resize(, 6).Value
ReDim oArr(1 To UBound(wArr), 1 To 1)
'
If Dbg Then Debug.Print "------>>>"
For K = 1 To UBound(wArr)
myArr(J) = ""
For I = 1 To 6
myArr(J) = myArr(J) & Format(wArr(K, I), "00")
Next I
Do
myRow = myArr(J)
J = (J + 1) Mod 2
myArr(J) = ""
For I = 2 To Len(myRow) - 1
cSum = (2 * CLng(Mid(myRow, I, 1)) + CLng(Mid(myRow, I - 1, 1)) + CLng(Mid(myRow, I + 1, 1))) Mod 9
If cSum = 0 Then cSum = 9
myArr(J) = myArr(J) & CStr(cSum)
Next I
If Dbg And K < 4 Then Debug.Print myArr(J)
If Len(myArr(J)) < 3 Then Exit Do
' DoEvents
Loop
oArr(K, 1) = CLng("0" & myArr(J)) Mod 90
Next K
ActiveCell.Resize(UBound(wArr), 1) = oArr
Debug.Print "IKAll2", K, Format(Timer - myTim, "0.0")
If Dbg Then Debug.Print UBound(wArr) & " <<<<"
End Sub
Sub Seleziona_Tutta_la_Colonna()
Dim Y As Long
For Y = Columns.Count To 1 Step -1
Set zona = Columns(Y)
conta = Application.WorksheetFunction.CountA(zona)
If conta > 0 Then
If Y < Columns.Count Then
Columns(Y + 1).Select
Exit Sub
End If
End If
Next Y
End Sub
Se leggo bene si presume che ci sia anche un’ultima macro ma non ti chiedo nulla io come ho scritto su sono super contento naturalmente poi vedi te.Anthony ha scritto:Ne approfitto per pubblicare una penultima revisione della macro
No no, non c'è nessuna evoluzione in vista, io mi fermo sempre alla penultima versione...ikwae ha scritto:Se leggo bene si presume che ci sia anche un’ultima macro ma non ti chiedo nulla io come ho scritto su sono super contento naturalmente poi vedi teAnthony ha scritto:Ne approfitto per pubblicare una penultima revisione della macro
Torna a Applicazioni Office Windows
Aggiornare cella con somma quando aggiungo nuova colonna Autore: marcopont |
Forum: Applicazioni Office Windows Risposte: 1 |
Inserire in colonna dati presi da altra colonna Autore: Ricky0185 |
Forum: Applicazioni Office Windows Risposte: 4 |
Macro sposta riga se data in colonna più vecchia di 3 mesi Autore: systemcrack |
Forum: Applicazioni Office Windows Risposte: 23 |
gestire e togliere oggetti in colonna con condizione Autore: raimea |
Forum: Applicazioni Office Windows Risposte: 2 |
Excel Estrazione casuale testo da colonna per bingo ca**ate Autore: Dylan666 |
Forum: Applicazioni Office Windows Risposte: 7 |
Visitano il forum: Nessuno e 11 ospiti