Domanda Riferimenti relativi per spostamento in oggetto tabella

agugiacomo

Nuovo utente
14 Agosto 2019
2
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
3.731
63
office pro 2010
43
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]
 
  • Like
Reactions: Cesco80 and ggratis

Sostieni ForumExcel

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