formatare tabele

Apostolu
Mesaje: 285
Membru din: Joi Aug 20, 2009 4:05 pm

formatare tabele

Mesaj de Apostolu » Vin Ian 07, 2011 4:50 pm

Am o problema,

Am o suita de tabele (muuulte) si trebuie sa modific manual (trag de linii) latimea coloanelor, ca sa paginez cum trebuie.
Se poate face cu un script, in care sa declar coloana 1 = 10%, 2 - 33%, 3 - 5%, etc, la toate tabelele din document ?
Cu posibilitatea sa scad sau sa adaug (modificand scriptul), numarul de coloane si latimea lor ?

Am si o alta problema (iar) :roll:
In aceiasi ordine de idei, (alt script, ca se modifica mai usor) sa aliniez scrisul (din celule) pe coloane, in toate tabelele documentului: st, dr, mijloc declarand coloana 1=dr, 2=st, 3= mijloc, etc ?

Multumesc mult.

Dr.Windows
Moderator
Moderator
Mesaje: 4570
Membru din: Vin Iul 31, 2009 7:32 am

Re: formatare tabele

Mesaj de Dr.Windows » Mar Ian 18, 2011 9:06 pm

Pentru asta se da urmatorul cod:

Cod: Selectaţi tot

Sub ResizeAllTables()
    Dim tbl  As Table
    Dim i As Integer
    
    'Defineste matricea pentru dimensiunile coloanelor
    ' (in acest exemplu - 3 linii pentru ca vom modifica numai 3 coloane din tabelele "desenate")
    'Coloana 1 este pentru numarul coloanei ce va fi modificata
    'Coloana 2 este pentru a stabili dimensiunea coloanei (in procente)
    Dim arrCols(1 To 3, 1 To 2) As Long
    arrCols(1, 1) = 2
    arrCols(1, 2) = 10
    arrCols(2, 1) = 3
    arrCols(2, 2) = 30
    arrCols(3, 1) = 4
    arrCols(3, 2) = 20
    
    For Each tbl In ActiveDocument.tables
        'verifica numarul de coloane al tabelului sa fie cel putin cat al matricei de coloane
        If tbl.Columns.Count >= UBound(arrCols, 1) Then
            For i = 1 To UBound(arrCols, 1)
                tbl.Columns(arrCols(i, 1)).PreferredWidthType = wdPreferredWidthPercent 'Seteaza tipul modificari - procent
                tbl.Columns(arrCols(i, 1)).PreferredWidth = arrCols(i, 2)               'Modifica cu dimensiunea ceruta
                
                'Daca se doreste si alinierea poti pune in coloana 2 din arrCols valorile 0/1/2 dupa cum urmeaza:
                '   wdAlignRowLeft=0
                '   wdAlignRowCenter=1
                '   wdAlignRowRight=2
                'tbl.Columns(arrCols(i, 1)).Select
                'Selection.Rows.Alignment =arrCols(i, 2)
            Next i
        Else
            Debug.Print "Tabelul nu are dimensiunea corecta" & tbl.Columns.Count    ' Asta se vede numai in Immediate window
        End If
    Next tbl
End Sub

care din cate e observa si din comentarii iti permite sa modifici anumite coloane din tabele tale atata timp cat definesti matricea arrCols cu numarul de linii corespunzator pentru fiecare coloana pe care o doresti modificata dupa modelul:

arrCols(NumarColoana, ValoareLatime)

nu uita ca ValoareLatime este in procente... (wdPreferredWidthPercent) daca vrei sa fie exacta... in "puncte" modifca cu wdPreferredWidthPoints.

Tot in cod ai "comentat" si in situatia in care vrei sa modifici alinierea... creaza o alta functie in care pentru fiecare "pereche" coloana/valoare de aceasta data sa ai:

arrCols(NumarColoana, Aliniament)

iar codul care va face modificare va fi:

Cod: Selectaţi tot

                tbl.Columns(arrCols(i, 1)).Select
                Selection.Rows.Alignment =arrCols(i, 2)
dar nu uita a comentezi codul care face modificare latimii... sau poate vrei sa definesti arrCols cu 3 coloane in asa fel incat pe a 3-a coloana sa ai modalitatea de aliniere... si astfel vei face o singura parcurgere a documentului... ;)

Ai si exemplul atasat:
Nu aveţi permisiunea de a vizualiza fişierele ataşate acestui mesaj.

Apostolu
Mesaje: 285
Membru din: Joi Aug 20, 2009 4:05 pm

Re: formatare tabele

Mesaj de Apostolu » Mar Ian 18, 2011 10:40 pm

Sincer,
nu am inteles chestia cu ljniile si coloanele:
arrCols(1, 1) = 2
arrCols(1, 2) = 10
arrCols(2, 1) = 3
arrCols(2, 2) = 30
arrCols(3, 1) = 4
arrCols(3, 2) = 20

Te rog sa imi explici ce inseamna fiecare cifra:
(1, 1) = 2
(1, 2) = 10
etc
Sau inteleg dar ma sperii.
Ca sa modifici coloanele trebuie sa modifici NU coloanele, ci latimea fiecarei CELULE de pe fiecare RAND DIN TABEL ?

Multumesc.

Dr.Windows
Moderator
Moderator
Mesaje: 4570
Membru din: Vin Iul 31, 2009 7:32 am

Re: formatare tabele

Mesaj de Dr.Windows » Mie Ian 19, 2011 11:42 am

In arrCols am pus datele "de intrare"... adica tu vrei sa modifici anumite coloane cu anumite dimensiuni... si eu am ales varianta mai "complicata" punand datele de intrare intr-o matrice arrCols (asta pentru ca mie nu imi place sa caut prin cod sa vad pe unde mai am cate ceva de modificat - ci incerc sa-l fac cat mai generic si apoi sa ma folosesc de "parametrii").

Ce inseamna acea matrice?... (sau daca vrei un vector cu 2 dimensiuni):
Ceva de genul acestui tabel:

Cod: Selectaţi tot

COL1    COL2
2          10
3          30
4          20
Unde COL1 reprezinta coloana din tabel pe care vei dori sa o modifici iar COL2 reprezinta valoarea in procente cu care vrei sa setezi acea coloana, iar apelarea acelor valori se face ca si in excel pe baza liniei si a coloanei:

arrCols(linie,coloana) = valoare

arrCols(1,1)=2 - se "traduce" ca elementul din randul 1, coloana 1 va avea valoarea 2
arrCols(3,2)=20 - se "traduce" ca elementul din randul 3 coloana 2 are valaorea 20


De ce am ales varianta asta, de ce m0am "complicat"?... pentru flexibilitate - altfel codul ar fi aratat ceva de genul:

Cod: Selectaţi tot

Sub ResizeAllTables()
    Dim tbl  As Table
    
    For Each tbl In ActiveDocument.Tables
        'verifica numarul de coloane al tabelului sa fie cel putin cat al matricei de coloane
        If tbl.Columns.Count >= 3 Then
            tbl.Columns(2).PreferredWidthType = wdPreferredWidthPercent 'Seteaza tipul modificari - procent
            tbl.Columns(2).PreferredWidth = 10               'Modifica cu dimensiunea ceruta
                
            tbl.Columns(3).PreferredWidthType = wdPreferredWidthPercent 'Seteaza tipul modificari - procent
            tbl.Columns(3).PreferredWidth = 30               'Modifica cu dimensiunea ceruta
                
            tbl.Columns(4).PreferredWidthType = wdPreferredWidthPercent 'Seteaza tipul modificari - procent
            tbl.Columns(4).PreferredWidth = 20               'Modifica cu dimensiunea ceruta
                
        Else
            Debug.Print "Tabelul nu are dimensiunea corecta - 3"     ' Asta se vede numai in Immediate window
        End If
    Next tbl
End Sub
Si nu ar fi o problema... dar daca nu sunt de modificat numai 3 coloane ci 4 sau chiar 10... atunci trebuie sa fi foarte atent cu codul tau pentru ca ar trebui sa adaugi "perechi" de genul:

Cod: Selectaţi tot

            tbl.Columns(NumarColoana).PreferredWidthType = wdPreferredWidthPercent 
            tbl.Columns(NumarColoana).PreferredWidth = DimensiuneColoana
Si DACA nu mai sunt coloanele alea... iar iei la mana fiecare linie sa stai sa modifici... peste tot cu NumarColoana corect, etc...

Evident... astea sunt doar chestii de "preferinta"... asa ca daca tu preferi varianta 2 nu te opreste nimeni... ;) dar sper ca acum ti-a mai trecut din "sperietura"... :lol:

Apostolu
Mesaje: 285
Membru din: Joi Aug 20, 2009 4:05 pm

Re: formatare tabele

Mesaj de Apostolu » Mie Ian 19, 2011 4:20 pm

Da ....
Despre corp, grup, inel si matrice am invatat acum vreo .... 45 de ani. :roll:
Ma rog, acum ca stiu ce fel mancare este ... sper ca pot alege si felul de vin potrivit. :lol:
Descrierea variabilelor la inceputul modulului, programului, imi este familiara.
Cea ce ne intoarce nedumerirea mea, ca in acest moment nu mai stiu cum se scrie o matrice. :o
Adica elementul 1,2,3 dinntr-o matrice cu .... 2 "coloane" ?.

Deci pentru 14 coloane din tabelul meu trebuie sa scriu cam asa ? :

arrCols(1, 1) = 2 (coloana 1 sa fie 2%)
arrCols(1, 2) = 10 (coloana 2 sa fie 10%)
arrCols(2, 1) = 3 (coloana 3 = 3%)
arrCols(2, 2) = 30 (coloana 4 = 30%)
arrCols(3, 1) = 4 (coloana 5 = 4%)
arrCols(3, 2) = 20 (coloana 6 = 20%)
arrCols(4, 1) = 2 (coloana 7 = 2%)
arrCols(4, 2) = 20 (coloana 8 = 20%)
......
arrCols(7,1) = 10 (coloana 13 = 10%)
arrCols(7, 2) = 20 (coloana 14 = 20%)

Cat desptre sperietura ce sa zic ?
Doar dementii nu se sperie de nimic. :lol:

Dr.Windows
Moderator
Moderator
Mesaje: 4570
Membru din: Vin Iul 31, 2009 7:32 am

Re: formatare tabele

Mesaj de Dr.Windows » Mie Ian 19, 2011 6:24 pm

Nope!...

Pentru 14 coloane din tabelul tau trebuie sa scrii asa:
mai intai si mai intai e defineste matricea (numarul de coloane ramane intotdeauna 2... adica 1 to 2)

Dim arrCols(1 To 14, 1 To 2) As Long

dupa care incepi sa definesti "perechile" de valori IDCOLOANA (aia din tabelul tau), DIMENSIUNE COLOANA (in procent):

'Pentru prima coloana de modificat din tabelul tau (nu este neaparat NR1 ci in acest exemplu este 2)
arrCols(1, 1) = 2 <= Elementul (rand1, coloana1) este ID-ul coloanei - in cazul de fata este vorba de coloana 2 din tabelul pe care il va gasi
arrCols(1, 2) = 10 <= Elementul (rand1,coloana2) reprezinta DIMENSIUNEA COLOANEI (10%) din Elementul (rand1, coloana1)


'Pentru a 2-a coloana de modificat din tabelul tau (nu este neaparat NR2 ci in acest exemplu este 4 - ca poate nu vrei de ex. sa moodifici coloana 3)
arrCols(2, 1) = 4 <= Elementul (rand2, coloana1) este ID-ul coloanei - in cazul de fata este vorba de coloana 4 din tabelul pe care il va gasi
arrCols(2, 2) = 20 <= Elementul (rand2,coloana2) reprezinta DIMENSIUNEA COLOANEI (20%) din Elementul (rand2, coloana1)


si tot asa pana ajungi la coloana 14
'Pentru a 14-a coloana de modificat din tabelul tau (nu este neaparat NR14 ci in acest exemplu este 20 - ca poate tabelul tau are 25 de coloane ;) )
arrCols(14, 1) = 20 <= Elementul (rand14, coloana1) este ID-ul coloanei - in cazul de fata este vorba de coloana 20 din tabelul pe care il va gasi
arrCols(14, 2) = 10 <= Elementul (rand14,coloana2) reprezinta DIMENSIUNEA COLOANEI (10%) din Elementul (rand14, coloana1)


Acum este ceva mai clar?... :roll:

Apostolu
Mesaje: 285
Membru din: Joi Aug 20, 2009 4:05 pm

Re: formatare tabele

Mesaj de Apostolu » Mie Ian 19, 2011 8:20 pm

Trebuia sa imi explici "vizual" dragule. :lol:
Adica:
In "celula" 1 din randul 5 al matricei definesti numarul coloanei din tabelul word si in "celula" 2 din matrice definesti latimea coloanei din tabel !
(5,1) = x inseamana: al cincilea rand din matrice, prima "celula", unde declar ca lucrez pe coloana x din tabelul meu word
(5,2) = y inseamana: al cincilea rand din matrice, a doua "celula", unde declar latimea coloanei x din tabelul meu word, ca fiind y,

In functie de cum vreau paginat tabelul, pentru web, tiparire pe hartie, dimensiune fixa in puncte, procentaj, etc. pot modifica % cu "puncte", inlocuind wdPreferredWidthPercent cu wdPreferredWidthPoints.
Restul fiind "birocratie" de programare de tipul:
> if else
> go to 438
Acum am priceput ? :lol:

Apostolu
Mesaje: 285
Membru din: Joi Aug 20, 2009 4:05 pm

Re: formatare tabele

Mesaj de Apostolu » Joi Ian 27, 2011 3:51 pm

Buna,

Cu declararea tabrelului meu in matrice a mers. Adica m-am prins. :)
Dar imi da eroare referitor la latime CELULELOR !

Run-time eror '5992'

Cannot access individual colums in this colection because the table has mixed cell widts

la debug eroarea este aici:
tbl.Columns(arrCols(i, 1)).PreferredWidthType = wdPreferredWidthPercent 'Seteaza tipul modificari - procent

Si este cert ca celule au si ele declarat preferred width, nu numai coloanele.
Ceva ar trebui sa elimine preferred width din celule, inainte de modificarea coloanelor.

Scriptul modificat de mine arata asa:

Cod: Selectaţi tot

Sub ResizeAllTables()
    Dim tbl  As Table
    Dim i As Integer
   
    'Defineste matricea pentru dimensiunile coloanelor
    ' (in acest exemplu - 3 linii pentru ca vom modifica numai 3 coloane din tabelele "desenate")
    'Coloana 1 este pentru numarul coloanei ce va fi modificata
    'Coloana 2 este pentru a stabili dimensiunea coloanei (in procente)
    Dim arrCols(1 To 6, 1 To 2) As Long
    arrCols(1, 1) = 1
    arrCols(1, 2) = 63
    arrCols(2, 1) = 2
    arrCols(2, 2) = 5
    arrCols(3, 1) = 3
    arrCols(3, 2) = 8
    arrCols(4, 1) = 4
    arrCols(4, 2) = 8
    arrCols(5, 1) = 5
    arrCols(5, 2) = 8
    arrCols(6, 1) = 6
    arrCols(6, 2) = 8
   
    For Each tbl In ActiveDocument.Tables
        'verifica numarul de coloane al tabelului sa fie cel putin cat al matricei de coloane
        If tbl.Columns.Count >= UBound(arrCols, 1) Then
            For i = 1 To UBound(arrCols, 1)
            [b]    tbl.Columns(arrCols(i, 1)).PreferredWidthType = wdPreferredWidthPercent 'Seteaza tipul modificari - procent[/b]
                tbl.Columns(arrCols(i, 1)).PreferredWidth = arrCols(i, 2)               'Modifica cu dimensiunea ceruta
               
                'Daca se doreste si alinierea poti pune in coloana 2 din arrCols valorile 0/1/2 dupa cum urmeaza:
                '   wdAlignRowLeft=0
                '   wdAlignRowCenter=1
                '   wdAlignRowRight=2
                'tbl.Columns(arrCols(i, 1)).Select
                'Selection.Rows.Alignment =arrCols(i, 2)
            Next i
        Else
            Debug.Print "Tabelul nu are dimensiunea corecta" & tbl.Columns.Count    ' Asta se vede numai in Immediate window
        End If
    Next tbl
End Sub
Multumesc
Ultima oară modificat Joi Ian 27, 2011 3:55 pm de către Anonymous, modificat 1 dată în total.
Motiv: Adăugare tag-uri CODE

Dr.Windows
Moderator
Moderator
Mesaje: 4570
Membru din: Vin Iul 31, 2009 7:32 am

Re: formatare tabele

Mesaj de Dr.Windows » Vin Ian 28, 2011 2:31 pm

E posibil ca eroarea sa apara datorita faptului ca in interiorul tabelului ai zone in care ai modificat manual latimea anumitor celule... daca vrei, ceva asemanator "merge cells" in excel si atunci nu mai stie ce sa faca.

Codul propus functioneaza NUMAI pe tabele cu aceeasi latime a coloanelor de sus pana jos...

Daca nu asta este problema, poate poti atasa o "bucata" de document cu un tabel (nu trebuie sa contina date) si codul VBA pentru a vedea unde este eroarea.

Apostolu
Mesaje: 285
Membru din: Joi Aug 20, 2009 4:05 pm

Re: formatare tabele

Mesaj de Apostolu » Vin Ian 28, 2011 3:15 pm

Eu nu am modificat nimic.
Tabelele sunt scanate/ocerizate dintr-un fisier.
Si asa apar.
Pentru ca sunt multe si identice ca continut, dar urmare a scanarii/ocerizarii nu au coloanele de aceiasi dimensiune, am intrebat daca se poate face automat "paginarea".
Nu aveţi permisiunea de a vizualiza fişierele ataşate acestui mesaj.

Închis

Înapoi la “Visual Basic for Application (VBA) - Intrebari tehnice”