come posso prendere dati in colonna e metterli in riga di excel, SE una condizione è vera?

Anonimo
2011-04-06T10:22:01+00:00

salve a tutti, ho un problema con un foglio excel, che potrei anche dare come esempio.

ho dei dati in una colonna, che devo mettere in riga.

Il problema però è che i dati sono a blocchi, per cui

SE si verifica una condizione

allora deve prendere PARTE dei dati che sono in una colonna (quelli relativi ai dati che mi interessano) e mettermeli in una riga, poi riprendere a verificare

Se si verifica una condizione.. ecc ecc.

per rendere chiaro cosa voglio dire posto l'origine dei dati excel:

Codice Anno Protocollo Quadro Riga Colonna Voce Euro origine Codice
aul1 2005 T061026161923247901 RW RW007 001 Codice Paese 275 1 aul1
aul1 2005 T061026161923247901 RW RW007 002 Codice operazioni 0721 1
aul1 2005 T061026161923247901 RW RW007 003 Importo 2.001.000 1
aul1 2005 T061026161923247901 RW RW007 004 Casella NO 1
aul1 2005 T061026161923247901 RW RW008 001 Codice Paese 275 1 aul1
aul1 2005 T061026161923247901 RW RW008 002 Codice operazioni 0723 1
aul1 2005 T061026161923247901 RW RW008 003 Importo 2.559.000 1
aul1 2005 T061026161923247901 RW RW008 004 Casella NO 1
aul1 2005 T061026161923247901 RW RW009 001 Codice Paese 61 1 aul1
aul1 2005 T061026161923247901 RW RW009 002 Codice operazioni 0726 1
aul1 2005 T061026161923247901 RW RW009 003 Importo 137.000 1
aul1 2005 T061026161923247901 RW RW009 004 Casella NO 1
aul1 2005 T061026161923247901 RW RW010 001 Codice Paese 105 1 aul1
aul1 2005 T061026161923247901 RW RW010 002 Codice operazioni 0726 1
aul1 2005 T061026161923247901 RW RW010 003 Importo 82.200 1
aul1 2005 T061026161923247901 RW RW010 004 Casella NO 1
aul1 2006 T070920103641045251 RW RW007 001 Codice Paese 275 1 aul1
aul1 2006 T070920103641045251 RW RW007 002 Codice operazioni 0723 1
aul1 2006 T070920103641045251 RW RW007 003 Importo 204.000 1
aul1 2006 T070920103641045251 RW RW007 004 Casella NO 1

se si copiano i dati in un foglio excel, vengono copiati fino alla colonna k inclusa.

solo la colonna k ha questa formula inserita dacella da k2 in giù)

=SE(O(A2<>A1;B2<>B1;E2<>E1);A2;"")

cioè, il blocco di dati che mi interessa inizia se cambia (anche solo) uno dei valori nelle colonne

A, o B, o C.

se inizia un blocco, allora tutti i dati che sono nella colonna H, a partire da h2,

devono essere portati in riga.

spero di essere stato chiaro.

Qualcuno può aiutarmi a costruire il codice vba?

grazie mille a tutti

Microsoft 365 e Office | Excel | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento
Risposta accettata dall'autore della domanda
Anonimo
2011-04-07T09:13:48+00:00

Ciao Mauro,

ti ringrazio, hai perfettamente ragione!!

Ho dovuto comunque stravolgere tutta la macro a seguito dei dati "reali" forniti.

Di seguito la nuova macro, preceduta da una precisazione doverosa:

  • la macro funziona a patto che i nomi di colonna da "R" a "AB" siano identici ai nomi corrispondenti riportati in colonna G. Un esempio per spiegarmi meglio: la cella S1 riporta "Codice operazioni con estero" mentre poi nelle righe della colonna G a volte trovo la stessa stringa, altre volte "Codice operazioni con l'estero" (quindi con l' in più). Occorre rendere corrispondenti i nomi di colonna con i corrispettivi nomi riportati in colonna G altrimenti la macro non intercetterà quella riga.
  • Non ho capito per quale motivo alla riga 38 l'importo viene inserito sia in colonna X che in colonna AA (mentre per le precedenti righe no) e perchè in colonna Z venga riportato "1" anzichè "0729".

Sub CopiaDati()

    Dim sh1 As Worksheet

    Dim rng1 As Range                       'range di celle relativo alla colonna F

    Dim lRiga1 As Long                      'Ultima riga della base dati

    Dim c As Range                          'di appoggio per ciclare nel range rng1

    Dim i As Integer

    Set sh1 = ThisWorkbook.Worksheets("ModelloUNI")

    lRiga1 = sh1.Range("A" & sh1.Rows.Count).End(xlUp).Row

    With sh1

        Set rng1 = .Range("F2:F" & lRiga1)

        For Each c In rng1

            If c.Value= "001" Then

                i = 0

                c.Offset(0, 5) = c.Offset(0, -5) 'Colonna K: Codice

                c.Offset(0, 6) = c.Offset(0, -4) 'Colonna L: Anno

                c.Offset(0, 7) = c.Offset(0, -3) 'Colonna M: Protocollo

                c.Offset(0, 8) = c.Offset(0, -2) 'Colonna N: Quadro

                c.Offset(0, 9) = c.Offset(0, -1) 'Colonna O: Riga

                c.Offset(0, 10) = c.Offset(0, 0) 'Colonna P: Colonna

                c.Offset(0, 11) = c.Offset(0, 2) 'Colonna Q: Codice

            Else

                'Righe successive alla prima

                i = i - 1

                'Debug.Print c.Offset(0, 0).Value & " - " & c.Offset(0, 1).Value

                Select Case c.Offset(0, 1).Value     'Valuta il testo della colonna + 1 della riga corrente

                    Case Is = "Tipo trasferimento"                  'Colonna R

                        c.Offset(0 + i, 12) = c.Offset(0, 2)

                    Case Is = "Codice operazioni con l'estero"      'Colonna S + Z

                        c.Offset(0 + i, 13) = c.Offset(0, 2)

                        c.Offset(0 + i, 20) = c.Offset(0, 2)

                    Case Is = "Codice ABI/CAB"                      'Colonna T

                        c.Offset(0 + i, 14) = c.Offset(0, 2)

                    Case Is = "Cod. id. Internazionale BIC/SWIFT"   'Colonna U

                        c.Offset(0 + i, 15) = c.Offset(0, 2)

                    Case Is = "Numero del conto corrente"           'Colonna V

                        c.Offset(0 + i, 16) = c.Offset(0, 2)

                    Case Is = "Data"                                'Colonna W

                        c.Offset(0 + i, 17) = c.Offset(0, 2)

                    Case Is = "Importo"                             'Colonna X + AA

                        c.Offset(0 + i, 18) = c.Offset(0, 2)

                        c.Offset(0 + i, 21) = c.Offset(0, 2)

                    Case Else

                        'Do nothing

                End Select

            End If

        Next c

    End With

    Set sh1 = Nothing

    Set rng1 = Nothing

    Set c = Nothing

End Sub


David

La risposta è stata utile?

0 commenti Nessun commento

13 risposte aggiuntive

Ordina per: Più utili
  1. Eliminata

    Questa risposta è stata eliminata a causa di una violazione del codice di comportamento. La risposta è stata segnalata manualmente o identificata tramite il rilevamento automatizzato prima dell'esecuzione dell'azione. Per ulteriori informazioni, fai riferimento al codice di comportamento.


    I commenti sono stati disattivati. Ulteriori informazioni

  2. Anonimo
    2011-04-06T13:03:59+00:00

    salve ragazzi, grazie delle cortesi risposte.

    Ho bisogno del vostro aiuto ovviamente, ma molto meglio sarebbe se potessi postare un esempio del file che mi serve "maneggiare".

    il discorso è che

    1 i dati sono incolonnati.

    2 non sempre ci sono 4 campi in colonna da spostare in riga.

    3 il blocco inizia dove, analizzando 3 differenti colonne, ALMENO UNA HA UN VALORE DIVERSO DALLA PRECEDENTE.

    io ho proceduto così (MA SENZA VBA!!)

    affianco ad ogni riga ho messo una formula che mi verifica se inizia un blocco:

    =SE(O(A126<>A125;B126<>B125;E126<>E125);A126;"")

    se inizia un blocco di dati, la cella k è piena, altrimenti è "" (stringa vuota)

    quindi, se una delle colonne che mi interessa verificare cambia rispetto alla precedente, inizia un blocco di dati.

    SE inizia un blocco di dati, (la cella della colonna k è piena) allora

    nella cololla L la formula controlla:

    nella colonna G il testo è quello della intestazione della colonna L?

    se sì, prende il dato della H e lo copia, altrimenti mette stringa vuota.

    il problema è che così non posso controllare niente.

    non sempre il dato della 4 riga del blocco di dati identificato deve andare nella 4 colonna.

    per questo non posso fare "copia-incolla trasponi"

    accidenti ragazzi, spiegare lo scenario è davvero difficile.

    se posso postare il file excel, molto meglio.

    anche perchè potrei risolvere con le formule, ma potrebbero esserci errori dovuti al fatto che non sempre sono incolonnati nella stessa posizione i dati che devo trasporre in riga.

    se io ho

    Codice Anno riga Voce dato
    aul1 2005 RW007 Codice Paese estero dell'invest. 275
    aul1 2005 RW007 Codice operazioni con l'estero 0721
    aul1 2005 RW007 Importo 2.001.000
    aul1 2005 RW007 Casella NO
    aul1 2005 RW008 Codice Paese estero dell'invest. 275
    aul1 2005 RW008 Codice operazioni con l'estero 0723
    aul1 2005 RW008 Importo 2.559.000
    aul1 2005 RW008 Casella NO
    aul1 2005 RW009 Codice Paese estero dell'invest. 61
    aul1 2005 RW009 Codice operazioni con l'estero 0726
    aul1 2005 RW009 Importo 137.000
    aul1 2005 RW009 Casella NO
    aul1 2005 RW010 Codice Paese estero dell'invest. 105
    aul1 2005 RW010 Codice operazioni con l'estero 0726

    devo ottenere

    Codice Anno Riga Colonna Codice Paese estero dell'invest. Tipo trasferimento Codice operazioni con estero Importo
    aul1 2005 RW007 001 275 0721
    aul1 2005 RW008 001 275 0723
    aul1 2005 RW009 001 61 0726
    aul1 2005 RW010 001 105 0726
    aul1 2006 RW007 001 275 0723

    ma naturalmente dopo continuerebbe con aul2, anno 2006, 2007 ecc ecc.

    mi sono spiegato?

    ragazzi, spero di trovare la soluzione.

    Ciao e grazie ancora.

    genni

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2011-04-06T12:15:02+00:00

    Ciao,

    prova questa sub da copiare e incollare nel modulo di ThisWorkbook


    Sub CopiaDati()

        Dim sh1 As Worksheet

        Dim sh2 As Worksheet

        Dim lRiga1 As Long

        Dim lRiga2 As Long

        Dim rng1 As Range

        Dim c As Range

        Dim i As Integer

        With ThisWorkbook

            Set sh1 = .Worksheets("Foglio1")

            Set sh2 = .Worksheets("Foglio2")

        End With

        lRiga1 = sh1.Range("A" & sh1.Rows.Count).End(xlUp).Row

        sh2.Range("A1").CurrentRegion.Delete

        With sh2

            For i = 1 To 4

                sh2.Cells(1, i) = "H" & i

            Next i

        End With

        With sh1

            Set rng1 = .Range("J2:J" & lRiga1)

            For Each c In rng1

                If c.Text = "aul1" Then

                    lRiga2 = sh2.Range("A" & sh2.Rows.Count).End(xlUp).Row + 1

                    .Range("H" & c.Row & ":H" & c.Row + 3).Copy

                    sh2.Range("A" & lRiga2).Select

                    Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, _

                    SkipBlanks:=False, Transpose:=True

                End If

            Next c

        End With

        Set sh1 = Nothing

        Set sh2 = Nothing

        Set rng1 = Nothing

        Set c = Nothing

    End Sub


    In sintesi fa il test della colonna J e se trova "aul1" copia i dati della relativa riga della colonna H e delle tre righe successive nel foglio 2. Non avendo capito esattamente di cosa si tratta ho intestato le colonne del foglio 2 come H1, H2, H3, H4.

    David

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2011-04-06T11:15:52+00:00

    I gruppi sono sempre di 4 righe? La colonna "Colonna" è sempre numerata da 1 a 4?

    La risposta è stata utile?

    0 commenti Nessun commento