Valutazione 4.87/ 5 (100.00%) 5838 voti

Condividi:        

macro Confrontare - Ordinare dati

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 Confrontare - Ordinare dati

Postdi sandrin81a » 11/02/14 23:01

Ciao a tutti..
scusate il disturbo, ma non ci vengo fuori...
ho un file con in prima colonna un numero progressivo non continuo da 1 a n,
la macro ce ho scritto formatta il file una volta importato, aggiunge una colonna vuota e crea una serie progressiva continua da 1 a n.
Lo scopo del gioco, in cui ho miseramente fallito, è confrontare la colonna B con la colonna A e traslare i dati in B man mano che si trovano le corrispondenze.

1,1,
2,3,
3,5,
4,8,
5,10,
ecc ecc

dovrebbe diventare
1,1,
2,
3,3,
4,
5,5,
6,
7,
8,8,
ecc ecc

il file è http://www.filedropper.com/test_2

oltre la colonna B ne esisto altre che vanno traslate assieme alla B...

se qualcuno ha qualche idea... please help me! ;-)

GRAZIE MILLE IN ANTICIPO!!

a fatica sono riuscito a scrivere:

Sub provaArianna()
'
' provaAri Macro
'

Columns("A:A").Select
Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
Semicolon:=False, Comma:=False, Space:=False, Other:=False, FieldInfo _
:=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1), _
Array(7, 1), Array(8, 1), Array(9, 1), Array(10, 1))
Columns("A:A").Select
Selection.Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove

' lastrow: numero di colonne, lastvalue: valore dell'ultima cella, nocord: numero di righe che risulteranno vuote

Dim lastrow As Long
Dim lastvalue As Long
Dim nocord As Long

lastrow = Cells(Rows.Count, 2).End(xlUp).Row
lastvalue = Cells(Rows.Count, 2).End(xlUp).Value


Range("L1").Select
ActiveCell = lastrow
Range("L2").Select
ActiveCell = lastvalue
Range("L3").Select
ActiveCell.Formula = lastvalue - lastrow

nocord = Range("L3").Value

MsgBox "The number of traces are:" & lastrow
MsgBox "The value of last trace:" & lastvalue
MsgBox "Number of traces without coordinates" & nocord



Range("A1").Select
ActiveCell.FormulaR1C1 = "1"
Range("A1").Select
Selection.DataSeries Rowcol:=xlColumns, Type:=xlLinear, Date:=xlDay, _
Step:=1, Stop:=Range("L2").Value, Trend:=False

' Commentare questo codice per impedire alla macro di cancellare la colonna con le informazioni sul numero di tracce ecc
Columns("L").Select
Application.CutCopyMode = False
Selection.ClearContents


End Sub
sandrin81a
Utente Junior
 
Post: 22
Iscritto il: 14/07/13 00:53

Sponsor
 

Re: macro Confrontare - Ordinare dati

Postdi Flash30005 » 12/02/14 01:41

Perdona ma penso che per te sia tutto chiaro ciò che vorresti ottenere ma se fai "tabula rasa" di ciò che hai in mente e rileggi il tuo post dimmi se riesci a capire la meta da raggiungere avendo un file testo come quello inviato

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-

Re: macro Confrontare - Ordinare dati

Postdi Anthony47 » 12/02/14 01:44

Anche io sono rimasto perplesso guardando la descrizione del problema...

I tuoi dati sono questi:
Immagine
image hosting

Possiamo dire che bisogna inserire righe in modo che i dati esistenti si vengano a trovare nella riga corrispondente al valore contenuto in colonna B? Cioe'
Immagine
free image hosting

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: 13892
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: macro Confrontare - Ordinare dati

Postdi sandrin81a » 12/02/14 08:03

eh eh, scusate,
come vedete nel file txt la serie va da 1 a 13015, ma non è continua... cioè ci sono dei salti... (il totale dei dati è 1222, se non ricordo male). A servirebbe che sia continua, cioè aggiungere il 2 fra 1 e 3 (nella figura di Anthony47)
pensavo di farlo creando una colonna A con la serie continua da 1 a 13015 e poi assegnare le varie righe al rispettivo indice con dei taglia e incolla traslando verso il basso i dati... ma mi sono arenato...
Oggi sono fuori per lavoro, appena riesco posto uno snap per visualizzare.
sandrin81a
Utente Junior
 
Post: 22
Iscritto il: 14/07/13 00:53

Re: macro Confrontare - Ordinare dati

Postdi Anthony47 » 12/02/14 15:34

In attesa di eventuali chiarimenti ti propongo questa macro:
Codice: Seleziona tutto
Sub inserta()
Dim I As Long, CurB, J As Long, OutSh As String
Dim VArr, ARes(), MaxB As Long, LastC As Long, LastR As Long
'
OutSh = "RILAV"      '<<< Il foglio di output, vedi testo
'
myTim = Timer
Sheets(OutSh).Cells.ClearContents
Cells.Copy
Sheets(OutSh).Range("A1").PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
        SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
'
LastC = Cells(2, Columns.Count).End(xlToLeft).Column
LastR = Cells(Rows.Count, 2).End(xlUp).Row

MaxB = Application.WorksheetFunction.Max(Range("B:B"))
ReDim ARes(1 To MaxB, 1 To LastC)

For I = 1 To MaxB
    ARes(I, 2) = I
Next I
For I = 1 To LastR
    CurB = Cells(I, 2).Value
    If IsNumeric(CurB) Then
        For J = 1 To LastC
            ARes(CurB, J) = Cells(I, J)
        Next J
    End If
Next I
Sheets(OutSh).Range("A1").Resize(MaxB, LastC).Value = ARes
MsgBox ("Completato in: " & (Timer - myTim))
End Sub

Uso:
-da excel, Alt-F11 per aprire l' eitor delle macro
-Menu /Inserisci /Modulo
-copia il codice e incollalo nel frame vuoto di dx
-personalizza l' istruzione marcata <<< (vedi piu' avanti)

Torna su Excel, attiva il foglio che contiene i dati di partenza nel formato identificato dalla figura 1 del mio messaggio precedente, lancia la macro:
-Alt-F8
-seleziona "Inserta" dall' elenco che ti propone
-premi Esegui

La macro crea il nuovo elenco su un foglio definito nell' istruzione marcata <<<; questo foglio deve gia' esistere e sara' AZZERATO SENZA PREAVVISO a inizio macro.

In attesa di tue nuove...
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: 13892
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: macro Confrontare - Ordinare dati

Postdi sandrin81a » 12/02/14 19:04

Grazie mille,
perfetto!

a questo pinto la prima colonna vuota non mi servirebbe più.. che riferimenti devo modificare?

se hai voglio di una rapida spiegazione del codice te ne sarei molto grato...

grazie mille ancora!!!
sandrin81a
Utente Junior
 
Post: 22
Iscritto il: 14/07/13 00:53

Re: macro Confrontare - Ordinare dati

Postdi Anthony47 » 13/02/14 00:14

Se manca la colonna A bisogna modificare un paio di valori; riallego la macro, con le modifiche evidenziate con ++ e qualche commento sul codice.
Codice: Seleziona tutto
Sub inserta()
Dim I As Long, CurB, J As Long, OutSh As String
Dim VArr, ARes(), MaxB As Long, LastC As Long, LastR As Long
'
OutSh = "RILAV"      '<<< Il foglio di output, vedi testo
'
myTim = Timer
'Azzera il foglio di uscita
Sheets(OutSh).Cells.ClearContents
'lo formatto come il foglio di origine
Cells.Copy
Sheets(OutSh).Range("A1").PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
        SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
'
'calcolo ultima colonna e ultima riga usata
LastC = Cells(2, Columns.Count).End(xlToLeft).Column
LastR = Cells(Rows.Count, 2).End(xlUp).Row
'calcolo valore piu' alto in colonna A:
MaxB = Application.WorksheetFunction.Max(Range("A:A"))  '++
ReDim ARes(1 To MaxB, 1 To LastC)
'
'Inizializzo prima colonna in matrice dei risultati
For I = 1 To MaxB
    ARes(I, 1) = I              '++
Next I
'Scansione di tutte le righe del foglio di origine
For I = 1 To LastR
    CurB = Cells(I, 1).Value      '++ Il valore di colonna A
    If IsNumeric(CurB) Then         'se non numerico, ignoro tutta la riga
        For J = 1 To LastC          'se numerico, metto tutte le colonne nella matrice
            ARes(CurB, J) = Cells(I, J)
        Next J
    End If
Next I
'Scrivo la matrice nel foglio di uscita
Sheets(OutSh).Range("A1").Resize(MaxB, LastC).Value = ARes
'Messaggio di "Completato"
MsgBox ("Completato in: " & (Timer - myTim))
End Sub

Il codice serve ad attuare l' idea di risolvere il problema posizionando in modo transitorio i dati del foglio di origine in una matrice, usando il valore di colonna A come "indice di riga", e poi copiare in blocco la matrice sul foglio di destinazione.

Chiaro :D e semplice :D , no :?:

Alla prossima...
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: 13892
Iscritto il: 21/03/06 16:03
Località: Ivrea


Torna a Applicazioni Office Windows


Topic correlati a "macro Confrontare - Ordinare dati":


Chi c’è in linea

Visitano il forum: Nessuno e 12 ospiti

cron