Moderatori: Anthony47, Flash30005
Call Formatter
End Sub
Sub Formatter()
Dim I As Long, bgCol As Long
'
For I = 1 To Cells(Rows.Count, "F").End(xlUp).Row
If Cells(I, "F").HasFormula Then
bgCol = RGB(250, 250, 200) 'usare 250, 250, 200 per "giallino" '<<<
Cells(I, "A").Value = Replace(Cells(I, "A").Value, " Totale", "", , , vbTextCompare)
Cells(I, "A").Interior.Color = bgCol
Cells(I, "F").Interior.Color = bgCol
Cells(I, "A").Resize(1, 6).Font.Size = Cells(I - 1, "A").Font.Size + 4 '<<<
End If
Next I
End Sub
Option Explicit
Sub Riporta()
Dim sh1 As Worksheet, sh2 As Worksheet
Dim ur As Long, ur2 As Long, i As Long, j As Long, rg As Long
Dim elenco As String, itm As String
Application.ScreenUpdating = False
Set sh1 = Sheets("Foglio1") '<===== da modificare col nome del Foglio
Set sh2 = Sheets("Orders - FILE DI PARTENZA")
ur = sh2.Cells(Rows.Count, 1).End(xlUp).Row
ur2 = sh2.Cells(Rows.Count, 1).End(xlUp).Row
On Error Resume Next
With sh1.Range("A2:F" & ur2 + 100)
.ClearContents
.Rows.Ungroup
.Interior.ColorIndex = xlNone
.Font.Bold = False
.Font.Size = 11
End With
On Error GoTo 0
ReDim nItm(1 To ur - 1)
ReDim nNum(1 To ur - 1)
ReDim nDat(1 To ur - 1)
ReDim nSta(1 To ur - 1)
ReDim nSku(1 To ur - 1)
ReDim nQty(1 To ur - 1)
For i = 2 To ur
With sh2
nItm(i - 1) = .Cells(i, 5).Value
nNum(i - 1) = .Cells(i, 1).Value
nDat(i - 1) = .Cells(i, 2).Value
nSta(i - 1) = .Cells(i, 3).Value
nSku(i - 1) = .Cells(i, 4).Text
nQty(i - 1) = .Cells(i, 6).Value
End With
Next i
For i = 2 To ur
With sh1
.Cells(i, 1) = nItm(i - 1)
.Cells(i, 2) = nNum(i - 1)
.Cells(i, 3) = nDat(i - 1)
.Cells(i, 4) = nSta(i - 1)
.Cells(i, 5) = nSku(i - 1)
.Cells(i, 6) = nQty(i - 1)
End With
Next i
With sh1
elenco = "A1:F" & ur
.Range(elenco).Sort Key1:=Range("A1"), Order1:=xlAscending, Header:=xlYes, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
End With
For i = ur To 2 Step -1
itm = sh1.Cells(i, 1)
For j = i - 1 To 2 Step -1
If sh1.Cells(j, 1) <> itm Then
rg = j + 1
Range(Cells(rg, 1), Cells(i, 6)).Select
Rows(i + 1).EntireRow.Insert
Range(Cells(rg, 1), Cells(i, 6)).Rows.Group
Cells(i + 1, 1) = Cells(i, 1)
Cells(i + 1, 1).Font.Bold = True
Cells(i + 1, 1).Font.Size = 14
Cells(i + 1, 1).Interior.ColorIndex = 15
Cells(i + 1, 6) = Application.Sum(Range("F" & rg & ":F" & i))
Cells(i + 1, 6).Font.Bold = True
Cells(i + 1, 6).Font.Size = 14
Cells(i + 1, 6).Interior.ColorIndex = 15
i = rg
Exit For
End If
Next j
Next i
Application.ScreenUpdating = True
sh1.Cells(1, 7).Select
End Sub
Anthony47 ha scritto:Una risposta rapida, mentre guardero' poi con calma per (eventuali) altri suggerimenti.
Mi pare che puoi fare quasi tutto in proprio con una macro autoregistrata, usando comandi gia' disponibili in Excel. Il procedimento:
-avvia la registrazione di una nuova macro
-seleziona il foglio Orders - FILE DI PARTENZA, tasto dx sul tab col suo nome, scegli Sposta o Copia, spunta Crea una copia; completa con Ok. Questo ti creera' una copia del tuo foglio
-se vuoi spostare le colonne rispetto alla loro posizione attuale: seleziona l'intera colonna E (per esempio), premi Contr-x (taglia); seleziona A1 (se vuoi mettere la colonna E a sinistra dell'attuale colonna A), premi Enter. Continua spostando cosi' tutte le colonne che vuoi riposizionare
[etc etc]
.....
With sh1
elenco = "A1:F" & ur
.Range(elenco).Sort Key1:=.Range("A1"), Order1:=xlAscending, Header:=xlYes, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
End With
.....
Buon anno anche a te, Mario.Mario ha scritto:Buon anno Nuovo a tutti
Visto che l'ho fatto posto anche la mia soluzione (molto, ma molto meno professionale di quella di Anthony).
Registrare una macro e' un gioco di pazienza e diligenza. Devi avere chiaro l'elenco delle cose da fare e la loro sequenza; quindi conviene scriverle, fare le prove, e solo alla fine partire con la registrazione.DaniBy ha scritto:Antony, innanzitutto BUON ANNO A TE!!!
ti ringrazio di cuore anche e solo per avermi promosso sul campo come uno che con le macro si sbizzarrisce con maestria, ma ho provato a costruirla come da te indicato, ma non funziona.
Marius44 ha scritto:Ciao
BUON ANNO ANCHE A TE (speriamo che ci mantenga in buona salute, il resto verrà da solo).
Allora, nel Foglio totali devi mettere le intestazioni in prima riga.
Poi devi aggiustare una mia mia piccola (ma essenziale) svista di ieri sera (saranno state le abbondanti libagioni)
in questa codice ho saltato un . (punto) - deve essere così
- Codice: Seleziona tutto
.....
With sh1
elenco = "A1:F" & ur
.Range(elenco).Sort Key1:=.Range("A1"), Order1:=xlAscending, Header:=xlYes, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
End With
.....
in pratica manca il punto prima di Range dopo Key1
Ho riprovato il codice sul file che hai allegato e a me funziona. Ambrosia sono 4.
https://www.dropbox.com/s/nnnram5otxkr7ow/PICKING%20orders-2020-12-31-12-43-45-Marius.xlsm?dl=0
Ciao,
Mario
Anthony47 ha scritto:Buon anno anche a te, Mario.Mario ha scritto:Buon anno Nuovo a tutti
Visto che l'ho fatto posto anche la mia soluzione (molto, ma molto meno professionale di quella di Anthony).
No, la mi soluzione non e' piu' professionale, visto che invito l'utente a registrarsela da solo. D'altra parte se uno compera una licenza che gli offre un tot di prestazioni penso sia meglio spiegargli come puo' sfruttare a suo vantaggio i soldi spesi, piuttosto che proporgli una equivalente macro probabilmente non manutenibile dall'utente.
D'altra parte registrare una macro e' anche l'occasione per imparare le basi del vba, acquisire immediatamente la capacita' di risolvere i problemi piu' semplici, e da questi esempi imparare a risolvere problemi piu' complessi. Insomma imparare a usare sempre meglio i soldi della licenza.Registrare una macro e' un gioco di pazienza e diligenza. Devi avere chiaro l'elenco delle cose da fare e la loro sequenza; quindi conviene scriverle, fare le prove, e solo alla fine partire con la registrazione.DaniBy ha scritto:Antony, innanzitutto BUON ANNO A TE!!!
ti ringrazio di cuore anche e solo per avermi promosso sul campo come uno che con le macro si sbizzarrisce con maestria, ma ho provato a costruirla come da te indicato, ma non funziona.
Per le istruzioni su come registrare una macro e i suggerimenti di base guarda qui:
viewtopic.php?f=26&t=103893&p=622593#p622593
Io ho cominciato ("qualche anno fa") registrando macro; poi ho imparato a modificarle (vedi viewtopic.php?f=26&t=103893&p=647676#p647676); poi ho imparato come assemblare da quei pezzi di codice macro totalmente diverse. Ancora oggi in ogni mia macro non mancano pezzi derivati da codice ottenuto col registratore di macro.
Ciao a tutti
PS: C'e' un messaggio di Mario prima di questo
Marius44 ha scritto:Ciao
Mi scuso in anticipo con Anthony ma, vista la tua sincerità, ti suggerisco cosa fare:
1°) in entrambi i files correggi un mio errore
For i = ur To 2 Step -1
itm = sh1.Cells(i, 1)
For j = i - 1 To 1 Step -1
il valore in rosso è esatto (correggi da 2 a 1)
2°) anche se non conosci l'inglese le cifre sono scritte in egual maniera.
Pertanto tutte le righe di codice che si riferivano alla colonna 6 devono essere cambiate in 7, cioè
Cells(i + 1,7) = Application.Sum(Range("G" & rg & ":G" & i))
Cells(i + 1,7).Font.Bold = True
Cells(i + 1, 7).Font.Size = 14
Cells(i + 1, 7).Interior.ColorIndex = 6
3°) la riga di codice che fa la somma deve essere riferita alla colonna G, quindi
Cells(i + 1, 7) = Application.Sum(Range("G" & rg & ":G" & i))
4°) prima di assegnare valori ad una matrice la devi dimensionare. Dove vedi il codice con dei ripetuti ReDim inserisci
ReDim nCom(1 To ur - 1)
Apporta le correzioni, prova e fai sapere.
Ciao,
Mario
danibi60 ha scritto:Ecco, proprio con quest'ultimo esempio (che ho poi apportato al file ottenedo ciò che desideravo) si manifesta in pieno la mia incapacità di comprednere il linguaggio VBA.
Ora, mettiamo da parte per un attimo l'inglese, e limitiamoci a capire cosa significa quello che mi hai indicato:
Tu scrivi:
For i = 2 To Step - 1
Mentre invece doveva essere (come lo era infatti)
For i = 2 To ur
Che significa nello specifico tutto questo? Step - 1 che significa? ur sta per cosa?
Per non parlare di queste stringhe di testo:
With sh1
.Cells(i, 1) = nItm(i - 1)
.Cells(i, 2) = nNum(i - 1)
.Cells(i, 3) = nDat(i - 1)
.Cells(i, 4) = nSta(i - 1)
.Cells(i, 5) = nCom(i - 1)
.Cells(i, 6) = nSku(i - 1)
.Cells(i, 7) = nQty(i - 1)
tra le quali comprendo che vi sia dopo la lettera n il nome abbreviato della intestazione della colonna) ma tutto il resto cosa sta a significare? . Cell?? (i, 6 - i, 7 ecc ecc) ??? (i - 1) ??
Qui stanno le mie difficoltà Mario, nel capire queste terminologie da tecnici...
Ora, come detto prima il file funziona alla perfezione mentre invece devo risolvere quanto detto due messaggi fa:
"Nel file su allegato in riga due compare un Item Name (evidenziato in verde) che dovrebbe essere posizionato nella alla riga 29 in poi, come mai è finito li?
Inoltre una delucidazione di carattere operativo, nel momento estraggo il file d'origine (Orders - FILE DI PARTENZA) e lo copiassi sopra il file d'origine del giorno prima, la macro funzionerà senza intoppi?"
Devo sostituire nel codice quanto segnalato da te prima? e cioè:
For i = 2 To ur
Attendo, grazie,
Daniby
Torna a Applicazioni Office Windows
Visitano il forum: Nessuno e 2 ospiti