Domanda Riferimenti relativi per spostamento in oggetto tabella

agugiacomo

Nuovo utente
14 Agosto 2019
3
1
2019-365
0
Cioa a tutti, vi illustro il mio problema sperando di essere chiaro.
Nell'ottica di far compilare a diversi colleghi dei dati (che ho bisogno sia assolutamente univoci) per una successiva rielaborazione, ho pensato di produrre un file di appoggio condivisi con ciascuna persona nel quale i dipendenti inseriranno valori.
L'idea poi è di prelevare i dati da questi fogli ed trasportarli in altre cartelle excel contenti TABELLE (come oggetti e non intervalli di dati) riservate, così poi da elaborare e accodare massivamente tutte le tabelle con power query o magari un modello dati di powerpivot.
Sto però facendo fatica nella registrazione macro perchè nello spostarmi all'interno della tabella (mi ripeto, oggetto tabella) di destinazione non capisco come intendere i riferimenti relativi: se li utilizzo come in intervallo di dati, l'incollo della macro mi manda a fine foglio, se non utilizzo rif relativi, mi sovrascrive dati.
Mi viene il dubbio che essendo una tabella, già nel suo motore di base ha riferimenti di posizione indicati, però non ho ancora trovato in rete descrizioni a riguardo.

Spero di essere stato sufficientemente chiaro, nel caso perdonatemi e chiedetemi dettagli.
Grazie in anticipo per l'attenzione e il supporto
Giacomo
 

dracoscrigno

CioccaPiatti & VBA Expert
Expert
1 Maggio 2016
4.023
63
office pro 2010
57
Sarebbe opportuno che spiegassi meglio il tuo concetto di relativo perche che sia un range in formato tabella o un range definito da te, pur sempre di un range si tratta... Anche il foglio intero, alla fin fine è un range e, per tutti questi, vige la stessa regola:

Worksheet.range("E4") ti da l intersezione tra la quinta colonna e la quarta riga riferita allo spigolo in alto a sinistra del foglio.

MioRange.range("E4") la stessa cosa ma riferita al range che hai definito.

Worksheets.range("Tabella1").range("E4")
La stessa cosa riferito al gruppo di celle in formato tabella denominato "Tabella1"
In questo caso, poi, puoi utilizzare i metodi relativi a listObject nell ambito dei range.

In tutti i casi, per riferirti ad una data riga o colonna devi specificarla:

MiaTabella.Rows(indiceRiga).Columns(indiceColonna)

O scambiando righe e colonne:
MiaTabella.Columns(indiceColonna).Rows(indiceRiga)

Puoi anche utilizzare cells(indiceCella) al posto di indicare con columns o rows la seconda coordinata

MiaTabella.Columns(indiceColonna).Cells(indiceCella)
MiaTabella.Rows(indiceRiga).Cells(indiceCella)

Tenendo conto che questo funziona sia per i vettori che per le matrici ma in modo opportunamente differente.
Sui vettori (righa unica di celle o colonna unica di celle) avrai l' ennesima cella della riga o della colonna.
Nelle matrici( più righe e più colonne) avrai l ennesima cella contandola dalla prima in alto a sinistra, proseguendo verso destra e tornando a capo nella riga successiva...

...

Purtroppo... Il classico modo, non sbagliato perche funziona ma nemmeno giusto perche non riesce a sfruttare le peculiarità degli oggetti in ballo, è quello di utilizzare le proprietà row e Column per muoversi in un range.
Tale proprietà è SEMPRE, riferita al foglio e quindi bisogna sempre tenerne conto a meno che non si faccia il salto di qualità e lo si cestini in favore di un approcio più efficace:

Codice:
Dim Tabella as range
Dim Record as range
Dim Cella as Range

For each Record in tabella.rows
For esch Cella in record.cells
Debug.print cella.value
Next
Nect
Oppure

Codice:
Dim Tabella as Range
Dim Riga as long
Dim Cella as long

For Riga = 1 to tabella.rows.count
For Cella = 1 to Tabella.rows(Riga).Cells.count
Debug.print tabella.rows(Riga).columns(cella).value
Next
Next
Oppure tutte le varianti che ti vengono in mente con Columns, Rows, Cells, Range e tutti le property che siano un range...

L mportante alla fine, è usare l indice delle collezioni di range e non le loro proprieta base.[/Code]
 

agugiacomo

Nuovo utente
14 Agosto 2019
3
1
2019-365
0
Ciao ggratis e dracoscrigno, grazie molte per il vostro supporto.

dracoscrigno @dracoscrigno , per spostamento relativo intendo: popolando una tabella con dati che vengono parzialmente incollati, diventa necessario compilare i campi vuoti al fine di rendere la tabella senza spazi vuoti. per fare questo, devo posizionarmi sul primo spazio libero nella tabella parzialmente compilata, spazio/cella che purtroppo non è un riferimento statico ma varia in base alla dimensione e volume dei dati incollati. Esempio: se un dipendente ha lavorato su 10 commesse, la mia tabella composta dalle seguenti colonne NOME, DATA RIF, COMMESSA, ORE verrà popolata nella colonna commessa e ore di 10 righe (copiate e incollate). Poi dovrò riposizionarmi nel nome e data, nei primi spazi liberi, compilando con i dati necessari. terminata la procedura, quidi con tabella adesso completa e senza spazi vuoti, devo preparare nuova riga per ripetere operazione il mese seguente.

In ogni caso, con il link di ggratis e le tue info, provo a smanettare un po'.
Grazie ancora a entrambi per il supporto
Giacomo
 

dracoscrigno

CioccaPiatti & VBA Expert
Expert
1 Maggio 2016
4.023
63
office pro 2010
57
Credo d aver capito questo:
Tu hai una mole, una serie di record (nome, data, rif..., Etc) in cui mancano alcuni campi.
Esempio:

Hai dieci righe in cui solo nella prima c' è il nome perche, successivamente, è sottinteso.

In questi casi, a mio avviso, ti conviene inserire questi dati dopo aver completato i record oppure, SUBITO, dopo averli incollati.
Tutto dipende dal tuo approcio implementativo (da come scrivi il listato, il codice).

Ti conviene allegare un file con un piccolo esempio dove ci sia, il foglio dove incolli i dati ed un foglio dove riporti qualche esempio di dati da riscrivere in tabella.
... Cerca di riportare una diversità di esempi di modo da rendere possibile il comprendere tutte le possibili casistiche.
Il tutto, OVVIAMENTE, ricordando di non pubblicare dati sensibili.
 

ggratis

VBA Expert
Expert
27 Settembre 2015
1.341
63
Lecce - Pisa
Excel 2010
40
perché, successivamente, è sottinteso.
...colgo l'osservazione di Draco per dirti: ma quale vantaggio hai a sottintendere i dati, che per altro scriveresti con una macro!?! ...quanti KB risparmi? il peso di una scansione non compattata?! ... tu li inserisci in "chiaro" nel tuo database, poi i report li ricavi con le pivot e te li organizzi come credi.
Si buttano via milioni di Giga in c*****e...
Saluto_saluto
 

dracoscrigno

CioccaPiatti & VBA Expert
Expert
1 Maggio 2016
4.023
63
office pro 2010
57
perché, successivamente, è sottinteso.
...colgo l'osservazione di Draco per dirti: ma quale vantaggio hai a sottintendere i dati, che per altro scriveresti con una macro!?! ...quanti KB risparmi? il peso di una scansione non compattata?! ... tu li inserisci in "chiaro" nel tuo database, poi i report li ricavi con le pivot e te li organizzi come credi.
Si buttano via milioni di Giga in c*****e...
Saluto_saluto
tiro ad indovinare ggratis @ggratis .
il trovarsi con questo tipo di dati non è una scelta ma un imposizione data dal modello del recupero dei dati:

immagina di avere una serie di persone che ti rifilano una commessa in cui hai, in cima al documento, in una cella, il mio nome, a fianco, la data di emissione.
Poi, sotto, tutta una serie di record che indicano i vari record relativamente a quello che ha combinato Tizio in data TalGiorno.

Peppino - 12/12/2012

mangiato panino - 07:30
preso caffe _ 08:00
allestimento banchetto -08:30
bevuto amaro - 10:00
fumato sigaretta - 10:05
...

con un copia incolla preleverei tutte e due le colonne della descrizione e l' orario e le incollerei nel punto della tabella a cui sono destinati questi dati.
copierei il nome e lo incollerei nella prima cella opportuna. Poi, lo doppiocliccherei per farlo scrivere fino a fine tabella ma questo avverrebbe SOLO SE, ci fossero dati in una delle due colonne a finaco OPPURE SE la tabella fosse un formato tabella... in alternativa potrei trascinare manualmente la cella ed il gioco sarebbe fatto comunque.
Per la data sarebbe un pochino più complicato perchè un trascinamento o un doppio click non ripeterebbe la stessa data ma la incrementerebbe di uno ad ogni cella A MENO CHE non la scrivo in due celle e poi trascino queste due (se ben ricordo... con i numeri è sempre un casino trascinare)

Questo processo, se la fonte dei dati è sempre uguale, è, ovviamente automatizzabile ma, appunto, l automatismo dipende da come sono disposti i dati a disosizione e da come si è cominciato ad implementare la macro.
 

Sostieni ForumExcel

Aiutaci a sostenere le spese e a mantenere online la community attraverso una libera donazione!