Consenso all'uso dei cookies

SITO1 -- SITO2 -- Forum2 -- CercaGlobale -- Informativa su Cookie e Privacy

Questo Forum1 è in sola lettura -- Usa il Forum2


Valutazione discussione:
  • 0 voto(i) - 0 media
  • 1
  • 2
  • 3
  • 4
  • 5
[RISOLTO] Un trasponi un po' complicato (almeno per me)
#1
Ho un lungo elenco disposto su una sola colonna come in allegato e vorrei disporlo su più colonne, se ci fossero soltanto le prime 3 voci userei copia, incolla speciale trasponi, ma in questo caso non va bene. Ho provato a registrare una macro ma funziona bene solo la prima volta, poi mi sovrappone i dati copiati.


Allegati Anteprime
   

.zip   TRASPONI.zip (Dimensione: 6,62 KB / Download: 5)
Un titolo ben azzeccato attira l'attenzione degli esperti in quel campo, fa risparmiare tempo a voi, aumenta la probabilità di successo.
Cita messaggio
#2
Questo risultato potresti ottenerlo con delle formule, un quesito che riguarda l'ordinamento dei dati lo trovi qui http://user.services.openoffice.org/it/f...f=9&t=1189
purtroppo i file di esempio allegati sono assenti per superamento della soglia del numero di allegati.
http://user.services.openoffice.org/it/f...f=9&t=1664
Cita messaggio
#3
Solo se NON ci sono dati personali:
- salva il foglio originale in formato Excel (max fino a versione 2007)
- zippalo e postalo, provo a farti una macro in Visual Basic For Applications

[Edit] ehm.. mi sa che nome, cognome e indirizzo sono un po' troppo riservati come dati Big Grin
provo a inventarmi un foglio e te lo mando in formato Excel
Il mio blog: http://zerozerocent.blogspot.it/
Legge di Murphy: SE QUALCOSA PUO' ANDAR MALE, LO FARA'
Cita messaggio
#4
BAT, Non ci sono dati privati nel file, la schermata fa vedere il contenuto del file ods.

.zip   TRASPONI.zip (Dimensione: 1,66 KB / Download: 4)
La macro excel per essere compatibile con libreoffice:
non deve essere complessa, devi inserirla su nuovo modulo, deve iniziare con sub e finire con end sub....delle altre non vuol proprio saperne, restituisce errori su macro inserite su modulo thisworkbook.
Tenta.
Cita messaggio
#5
Grazie del file ma ne ho fatto uno uguale, vedere allegato;
puoi usare il mio file in Excel come esempio, la macro è semplicissima;
nella prima colonna ci devi mettere i dati in questo ordine
nome
cognome
indirizzo


Esempio:
se hai 50 nomi, ci devono essere 50 cognomi e 50 indirizzi, tutti l'uno sotto l'altro a gruppi di 3 ma NON devono essere separati da righe vuote. Apri il mio file e vedi un esempio con 7 nomi, 7 cognomi e 7 indirizzi;
premi il bottone "Trasponi" e vedrai la trasposizione che ti interessa

NOTA BENE:
i dati devono partire dalla seconda riga e NON ci possono essere righe vuote tra i gruppi di dati.

La conversione in formato LibreOffice la lascio a te ma dovrebbe essere facile: ho scritto una Function che penso tu strasformerai in Sub (quindi End Function = End Sub) e poi ho creato un bottone che esegue la funzione. La Function è in Modulo1, il bottone è in Foglio-1

La macro la puoi elggere nel .txt che allego.

NOTE:
- le righe che cominciano con un apostrofo sono dei commenti, non hanno influenza sul codice; se in LibreOffice i commenti si mettono in altro modo possono essere eliminati
- la variabile riga è il dato che si sta copiando
- la variabile rigaScritta è la nuova riga con i dati nome/cognome/indirizzo copiati
- Worksheets(1) è il primo datasheet
- Worksheets(1).Cells(R,C) = la cella in riga R e colonna C di Worksheets(1)


Allegati
.zip   nocoind.zip (Dimensione: 11,81 KB / Download: 6)
.txt   macro.txt (Dimensione: 607 byte / Download: 7)
Il mio blog: http://zerozerocent.blogspot.it/
Legge di Murphy: SE QUALCOSA PUO' ANDAR MALE, LO FARA'
Cita messaggio
#6
la macro funziona perfettamente pure su libreoffice, devi solo cambiare i nominativi.
Prima di ttto questo vai su:
strumenti
opzioni
libreoffice
sicurezza
sicurezza delle macro
Medio

carica salva
proprietà Vba
tutte le caselline devono avere il segno di spunta

ok

Apri il file xls
abilita macro
clicca sul pulsante trasponi.

GRANDE BAT!!!!
Cita messaggio
#7
Spero di non aver fatto cosa sgradita ma ho reso compatibile la macro per libreoffice/openoffice.

.zip   Trasponi.zip (Dimensione: 10,61 KB / Download: 3)
La cartella contiene:
- un file trasponi.bas se vuoi importare la macro su libreoffice e associargli un pulsante nella barra degli strumenti;
- il file ods se vuoi lavorare con il file che ha già la macro e il pulsante trasponi.

La macro compatibile per libreoffice è:

Codice:
Rem Attribute VBA_ModuleType=VBAModule
Option VBASupport 1
'Traspone la prima colonna a gruppi di 3 celle
'nome-cognome-indirizzo
Function trasponiNCI()
    Dim riga As Integer
    riga = 2 'comincia dalla seconda riga
    Dim rigaScritta As Integer 'la riga trasposta
    rigaScritta = 2
    While (Worksheets(1).Cells(riga, 1) <> "")
        Worksheets(1).Cells(rigaScritta, 2) = Worksheets(1).Cells(riga, 1)
        Worksheets(1).Cells(rigaScritta, 3) = Worksheets(1).Cells(riga + 1, 1)
        Worksheets(1).Cells(rigaScritta, 4) = Worksheets(1).Cells(riga + 2, 1)
        riga = riga + 3
        rigaScritta = rigaScritta + 1
    Wend
End Function


Ho aggiunto solo :

Codice:
Rem Attribute VBA_ModuleType=VBAModule
Option VBASupport 1
Cita messaggio
#8
Grazie a tutti, siete stati gentilissimi, una macro del genere in VBA è decisamente più comprensibile del linguaggio utilizzato da Calc per registrare, quindi credo di poter affermare che se uno ha bisogno di macro non può abbandonare MsOffice.
Siete d'accordo ?

(04-02-2012, 21:33 )d4rkheart Ha scritto: Questo risultato potresti ottenerlo con delle formule.......
ma tu hai capito come ?

per chi fosse interessato aggiungo qualche commento alla macro suggeritami
Codice:
Rem Attribute VBA_ModuleType=VBAModule
Option VBASupport 1
'Traspone la prima colonna a gruppi di 3 celle
'nome-cognome-indirizzo
Function trasponiNCI()
    Dim riga As Integer
    riga = 2 'comincia dalla seconda riga
    Dim rigaScritta As Integer 'la riga trasposta
    rigaScritta = 2
    While (Worksheets(1).Cells(riga, 1) <> "") ' il ciclo dura fino a che trova una cella vuota nella col A
        Worksheets(1).Cells(rigaScritta, 2) = Worksheets(1).Cells(riga, 1) 'copia la prima cella della col A nella col B
        Worksheets(1).Cells(rigaScritta, 3) = Worksheets(1).Cells(riga + 1, 1) 'copia la seconda cella della col A nella col B
        Worksheets(1).Cells(rigaScritta, 4) = Worksheets(1).Cells(riga + 2, 1) 'copia la terza cella della col A nella col B
        riga = riga + 3 ' incrementa di 3 la riga della colonna A
        rigaScritta = rigaScritta + 1 ' incrementa di 1 la riga della colonna B
    Wend
End Function
Un titolo ben azzeccato attira l'attenzione degli esperti in quel campo, fa risparmiare tempo a voi, aumenta la probabilità di successo.
Cita messaggio
#9
Non conosco il linguaggio di Libre/Openoffice ma per registrare penso che faccia come Excel, ossia usa un suo insieme di comandi; il bello è che questi comandi poi li puoi usare insieme a VBA per fare cose anche molto sofisticate.
Il brutto è che se hai i sorgenti in Excel non è detto che i "comandi" interni ad Excel abbiano un corrispettivo in Openoffice, nel senso che potrebbero esistere ma avere nome/parametri diversi, oppure potrebbero non esistere affatto.
E naturalmente non ho mai sentito dire che stiano sviluppando uno standard aperto per le operazioni delle macro su fogli elettronici.

Le macro semplici però penso si possano convertire senza difficoltà.
Il mio blog: http://zerozerocent.blogspot.it/
Legge di Murphy: SE QUALCOSA PUO' ANDAR MALE, LO FARA'
Cita messaggio
#10
(05-02-2012, 10:21 )BAT Ha scritto: Non conosco il linguaggio di Libre/Openoffice ma per registrare penso che faccia come Excel, ossia usa un suo insieme di comandi
che sono però molto complessi per non dire incomprensibili, a capire il vba non mi ci è voluto molto impegno.

per darti un'idea la tua macro registrata e quindi senza definire variabili diventa
Codice:
sub Trasp
rem define variables
dim document   as object
dim dispatcher as object
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"
args1(0).Value = "$A$2"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())
dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())
dim args3(0) as new com.sun.star.beans.PropertyValue
args3(0).Name = "ToPoint"
args3(0).Value = "$B$2"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args3())
dispatcher.executeDispatch(document, ".uno:Paste", "", 0, Array())
dim args5(0) as new com.sun.star.beans.PropertyValue
args5(0).Name = "ToPoint"
args5(0).Value = "$A$3"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args5())
dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())
dim args7(0) as new com.sun.star.beans.PropertyValue
args7(0).Name = "ToPoint"
args7(0).Value = "$C$2"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args7())
dispatcher.executeDispatch(document, ".uno:Paste", "", 0, Array())
dim args9(0) as new com.sun.star.beans.PropertyValue
args9(0).Name = "ToPoint"
args9(0).Value = "$A$4"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args9())
dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())
dim args11(0) as new com.sun.star.beans.PropertyValue
args11(0).Name = "ToPoint"
args11(0).Value = "$D$2"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args11())
dispatcher.executeDispatch(document, ".uno:Paste", "", 0, Array())
dim args13(0) as new com.sun.star.beans.PropertyValue
args13(0).Name = "ToPoint"
args13(0).Value = "$A$5"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args13())
end sub
Un titolo ben azzeccato attira l'attenzione degli esperti in quel campo, fa risparmiare tempo a voi, aumenta la probabilità di successo.
Cita messaggio


Vai al forum:


Utenti che stanno guardando questa discussione: 1 Ospite(i)