Moderatori: Anthony47, Flash30005
[L’estensione rar è stata disattivata e non puó essere visualizzata.]
=CERCA.VERT(C$1;Originali!$B:$C;2;0)
Sub trasp()
SSh = "Originali": DSh = "Incolonnati"
TCol = 5 'N° di colonne da trasporre
Worksheets(SSh).Activate
For I = 0 To TCol - 1
Range("A1").Offset(0, I).Copy Destination:=Sheets(DSh).Range("B1").Offset(I, 0)
Next I
serNum = Range("A2").Value: I = 0
Do
I = I + 1
If Range("A1").Offset(I, 0) > serNum Then GoTo Exita
For J = 0 To TCol - 1
Range("B1").Offset(I, J).Copy Destination:=Sheets(DSh).Range("B1").Offset(J, I)
Next J
Loop
Exita:
End Sub
Ad esempio per chiedere suggerimenti, non soluzioni usa e getta.Hai ragione con le formule più o meno sono autonomo con le macro no. Ma se fossi autonomi cosa posterei a fare ?
[L’estensione rar è stata disattivata e non puó essere visualizzata.]
[L’estensione rar è stata disattivata e non puó essere visualizzata.]
Anthony47 ha scritto:Per quanto riguarda il termine "usa e getta" e' riferito al fatto che la soluzione che ti do' tu non la potrai adattare a bisogni futuri.
Anthony47 ha scritto:Ma allora le altre colonne (h-l-cl) vanno ignorate?
Ciao.
[L’estensione rar è stata disattivata e non puó essere visualizzata.]
Sub TraspRude()
'Non cerca di accodare i nuovi dati, ma ripete dall' inizio
SSh = "Foglio1": DSh = "Foglio2" '<<<Foglio Sorgente e Foglio di destinazione
DRoot = "F1" '<<<Radice dei dati da elaborare
'
Worksheets(SSh).Activate
'[A1] = Timer
'Mette le intestazioni su Destination
Sheets(DSh).Range("A1").Value = "Data": Sheets(DSh).Range("B1").Value = "Open"
For I = 1 To 1000
If Range(DRoot).Offset(I, 1).Value < CurT Then Exit For
CurT = Range(DRoot).Offset(I, 1).Value
Sheets(DSh).Range("B1").Offset(0, I).Value = CurT
Next I
Sheets(DSh).Range("B1").Offset(0, I).Value = "DayMax"
Sheets(DSh).Range("B1").Offset(0, I + 1).Value = "DayMin"
Sheets(DSh).Range("A2", Sheets(DSh).Cells(Rows.Count, I + 4)).Clear
Application.ScreenUpdating = False
'
'Traspone e Accoda i dati
Range(DRoot).Select
'Prima riga di nuova data
Selection.Offset(1, 0).Select
ReData:
If CMax > 0 Then Sheets(DSh).Cells(Rows.Count, 1).End(xlUp).Offset(0, I + 2).Value = CMax
If CMin > 0 Then Sheets(DSh).Cells(Rows.Count, 1).End(xlUp).Offset(0, I + 3).Value = CMin
If ActiveCell.Value = "" Then GoTo Exitb
Cdata = ActiveCell.Value
Sheets(DSh).Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Value = Cdata
Selection.Offset(0, 2).Copy Destination:=Sheets(DSh).Cells(Rows.Count, 1).End(xlUp).Offset(0, 1)
CMax = 0: CMin = 999999
'
For I = 0 To 1440 'Scansione righe
If ActiveCell.Value <> Cdata Then GoTo ReData 'Ritorna a Prima Riga di nuova data
'Calcola Min e Max
If Selection.Offset(0, 3).Value > CMax Then CMax = Selection.Offset(0, 3).Value
If Selection.Offset(0, 4).Value < CMin Then CMin = Selection.Offset(0, 4).Value
'Posiziona Open di orario
Selection.Offset(0, 5).Copy Destination:=Sheets(DSh).Cells(Rows.Count, 1).End(xlUp).Offset(0, I + 2)
Selection.Offset(1, 0).Select 'Next riga
Next I
'
Exitb:
Application.ScreenUpdating = True
'[A2] = Timer
End Sub
Anthony47 ha scritto:Rispetto ai tuoi desideri ho ignorato la richiesta di elaborare solo i dati non ancora trasposti nel secondo foglio; cioe' la macro elabora dall' inizio tutte le volte che la rilanci. Essa elabora un anno di dati in circa 4.25 secondi (circa 26 secondi per 33000 linee su un pc non particolarmente performante), quindi l' appesantimento mi sembra trascurabile.
Anthony47 ha scritto:Ho skippato l' accodamento perche' trovo pericoloso lavorare con una struttura dati che si fa fatica a garantire che rimanga la stessa; non e' difficile, l' avevo gia' abbozzata cosi' ma poi ho cambiato idea.
"Forse" piu' tardi la posso riprendere...
Ciao.
Dim TrDate
Dim DRoot As String
Dim SSh As String, DSh As String
'
Sub TraspRude()
'vedi
'Non cerca di accodare i nuovi dati, ma ripete dall' inizio
'SSh = "Foglio1": DSh = "Foglio2" '<<<Foglio Sorgente e Foglio di destinazione
'DRoot = "F1" '<<<Radice dei dati da elaborare -Eredita da caller
'
If Range(DRoot).Row > 1 Then GoTo Queue
Worksheets(DSh).Activate
Rispo = MsgBox("Posso cancellare tutto il contenuto del foglio " & vbCrLf & "per creare il riepilogo da zero?", vbYesNo)
If Rispo = vbNo Then GoTo Exitb
Worksheets(SSh).Activate
'Mette le intestazioni su Destination
Sheets(DSh).Range("A1").Value = "Data": Sheets(DSh).Range("B1").Value = "Open"
For I = 1 To 1000
If Range(DRoot).Offset(I, 1).Value < CurT Then Exit For
CurT = Range(DRoot).Offset(I, 1).Value
Sheets(DSh).Range("B1").Offset(0, I).Value = CurT
Next I
Sheets(DSh).Range("B1").Offset(0, I).Value = "DayMax"
Sheets(DSh).Range("B1").Offset(0, I + 1).Value = "DayMin"
Sheets(DSh).Range("A2", Sheets(DSh).Cells(Rows.Count, I + 4)).Clear
'Application.ScreenUpdating = False
'
Queue:
'Traspone e Accoda i dati
Range(DRoot).Select
'[A1] = Timer
Application.ScreenUpdating = False
'Prima riga di nuova data
Selection.Offset(1, 0).Select
ReData:
If CMax > 0 Then Sheets(DSh).Cells(Rows.Count, 1).End(xlUp).Offset(0, I + 2).Value = CMax
If CMin > 0 Then Sheets(DSh).Cells(Rows.Count, 1).End(xlUp).Offset(0, I + 3).Value = CMin
If ActiveCell.Value = "" Then GoTo Exitb
Cdata = ActiveCell.Value
Sheets(DSh).Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Value = Cdata
Selection.Offset(0, 2).Copy Destination:=Sheets(DSh).Cells(Rows.Count, 1).End(xlUp).Offset(0, 1)
CMax = 0: CMin = 999999
'
For I = 0 To 1440 'Scansione righe
If ActiveCell.Value <> Cdata Then GoTo ReData 'Ritorna a Prima Riga di nuova data
'Calcola Min e Max
If Selection.Offset(0, 3).Value > CMax Then CMax = Selection.Offset(0, 3).Value
If Selection.Offset(0, 4).Value < CMin Then CMin = Selection.Offset(0, 4).Value
'Posiziona Open di orario
Selection.Offset(0, 5).Copy Destination:=Sheets(DSh).Cells(Rows.Count, 1).End(xlUp).Offset(0, I + 2)
Selection.Offset(1, 0).Select 'Next riga
Next I
'
Exitb:
Sheets(SSh).Select
Application.ScreenUpdating = True
'[A2] = Timer
End Sub
'
'
Sub StarTrasp()
'
'Vedi http://www.pc-facile.com/forum/viewtopic.php?f=26&t=77177
'
SSh = "Foglio1": DSh = "Foglio2" '<<< Foglio Sorgente e Foglio di destinazione
DRoot = "F1" '<<< Radice dei dati
'
Sheets(SSh).Select
Range(DRoot).Select
If Sheets(DSh).Cells(Rows.Count, 1).End(xlUp).Row > 1 Then
LaData = Format(Sheets(DSh).Cells(Rows.Count, 1).End(xlUp).Value, "mm/dd/yyyy")
Range(DRoot).EntireColumn.Select
'Controlla se la stringa di "ultima data" su foglio2 esiste nell' elenco
If Selection.Find(What:=LaData, After:=ActiveCell, LookIn:=xlValues, _
LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False) Is Nothing Then
MsgBox ("Ho cercato in colonna " & DRoot & vbCrLf & _
"la stringa " & LaData & " senza trovarla" & vbCrLf & _
"La trasposizione e' abortita")
Exit Sub
End If
'Attivala e cerca l' ultima occorrenza
Selection.Find(What:=LaData, After:=ActiveCell, LookIn:=xlValues, _
LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False).Activate
TrLaData:
If ActiveCell.Offset(1, 0).Value = LaData Then ActiveCell.Offset(1, 0).Select: GoTo TrLaData
'Comincia da questo indirizzo
DRoot = ActiveCell.Address
End If
Call TraspRude
End Sub
Torna a Applicazioni Office Windows
Macro per aprire file salvato su sharepoint Onedrive Autore: marcopont |
Forum: Applicazioni Office Windows Risposte: 2 |
Come impostare il formato data predefinito in excel? Autore: wallace&gromit |
Forum: Applicazioni Office Windows Risposte: 5 |
Come interrompere macro sndPlaySound Autore: systemcrack |
Forum: Applicazioni Office Windows Risposte: 2 |
Visitano il forum: Nessuno e 34 ospiti