Pb pr remplir mon petit tableau, tout simple... (il est tard!)

eucliwood

XLDnaute Nouveau
(mon 1er message, ossu! alors bonjour tout le monde :) )

Enfin bonsoir plutôt,

Bon, c'est tout simple mais mes premiers pas avec ce langage se font dans la douleur et je crois que je fatigue un petit peu à cette heure-ci : qu'est-ce qui cloche? (il n'affiche rien)

J'essaie juste de remplir un petit tableau avec des lettres et des chiffres (si je le fais avec array, cf code, ça marche!)

Code:
Dim ClRj As Variant, i%, j%

For i = 7 To 23 Step 4
    For j = Asc("E") To Asc("Y") Step 4
        ClRj(i, j) = Chr(j) & i
        MsgBox (ClRj(i,j) & " : " & Range(ClRj(i,j)))
    Next j
Next i


'en array, ok : 
'ClRj = Array( _
'    Array("E7", "I7", "M7", "Q7", "U7", "Y7", "AC7"), _
'    Array("E11", "I11", "M11", "Q11", "U11", "Y11", "AC11"), _
'    Array("E15", "I15", "M15", "Q15", "U15", "Y15", "AC15"), _
'    Array("E19", "I19", "M19", "Q19", "U19", "Y19", "AC19"), _
'    Array("E23", "I23", "M23", "Q23", "U23", "Y23", "AC23"))

Petite question subsidiaire tant que j'y suis : comme je boucle sur des caractères en jouant avec Asc() et Chr(), arrivé à Z ça coince (y'a pas de code pour "AC" , hein^). Auriez-vous une astuce ou bien faut-il simplement s'amuser à concaténer avec une autre boucle...

Merci

Sur ce, bonne soirée :)
 

ROGER2327

XLDnaute Barbatruc
Re : Pb pr remplir mon petit tableau, tout simple... (il est tard!)

Bonsoir à tous

Pas très clair, en effet !

Écrit ainsi :
Code:
Sub toto()
Dim ClRj(7 To 23, 69 To 89) As Variant, i%, j%
For i = 7 To 23 Step 4
    For j = Asc("E") To Asc("Y") Step 4
        ClRj(i, j) = Chr(j) & i
        MsgBox (ClRj(i, j) & " : " & Range(ClRj(i, j)))
    Next j
Next i
End Sub
ça ne plante pas.



ROGER2327
#6387


Jeudi 19 Décervelage 140 (Saint et Sainte Cartouche, vétérinaires - fête Suprême Quarte)
27 Nivôse An CCXXI, 9,4995h - plomb
2013-W03-3T22:47:56Z
 

ROGER2327

XLDnaute Barbatruc
Re : Pb pr remplir mon petit tableau, tout simple... (il est tard!)

Suite...


À propos du deuxième problème, quelques essais de fonctions personnalisées :​
VB:
Option Explicit
Const k& = 64 'Ajuster la constante : A ~ k+1

Function ColNum2&(s$)
    ColNum2 = Columns(s).Column + k
End Function

Function NumCol2$(c&)
    NumCol2 = Split(Columns(c - k).Address(0, 0), ":")(0)
End Function

Function ColNum&(s$)
Dim i&, u&
    For i = 1 To Len(s)
        u = u * 26 + Asc(Mid$(s, i, 1)) - 64
    Next
    ColNum = u + k
End Function

Function NumCol$(c&)
Dim u$, r&
    c = c - k
    Do
        r = (c - 1) Mod 26
        c = (c - r) \ 26
        u = Chr(r + 65) & u
    Loop While c > 0
    NumCol = u
End Function
Un exemple d'utilisation dans le classeur joint.​


ROGER2327
#6388


Vendredi 20 Décervelage 140 (Saint Outlaw, aristocrate - fête Suprême Quarte)
28 Nivôse An CCXXI, 1,1731h - zinc
2013-W03-4T02:48:56Z
 

Pièces jointes

  • XLD_199375_Divers.xlsm
    16.7 KB · Affichages: 43

eucliwood

XLDnaute Nouveau
Re : Pb pr remplir mon petit tableau, tout simple... (il est tard!)

et bien, merci pour tout cela!

ROGER2327, je vais étudier la fonction, ça m'a l'air bien compliqué, merci pour ces efforts. ([edit]:par contre je ne peux pas lire les nouveaux formats en xlm d'office. )

Concernant le pb original, en effet il ne me mettait rien dans ma matrice ClRj, j'avais bien essayé différentes déclaration (avec, sans parenthèse, variant, string, etc...), j'ai bien compris votre solution mais je n'ai pas bien compris pourquoi cela marchait de cette façon et pas d'une autre. En déclarant 'dim ClRj As Variant', tout court, et en définissant la matrice avec array (comme indiqué dans le bout de code) cela marchait aussi.:confused:

Existerait-il une façon générique qui fonctionne à tous les coups pour déclarer et remplir un tableau, quelque soit le contenu? (les subtilités de VBA me laisse un peu pantois...)

merci
 
Dernière édition:

ROGER2327

XLDnaute Barbatruc
Re : Pb pr remplir mon petit tableau, tout simple... (il est tard!)

Re...


Vos deux méthodes n'ont à peu près rien à voir. Dans le classeur joint, rendez vous Feuil2, cliquez les boutons toto3, puis toto4. toto3 construit le tableau selon la première méthode (tableau à deux dimensions), toto4 construit le tableau selon la seconde méthode (Array).

Rendez vous ensuite Feuil3, vous y trouverez le tableau construit par la première méthode, affiché à partir de la cellule A1.

Puis rendez vous Feuil4, vous y trouverez le tableau construit par la seconde méthode, lui aussi affiché à partir de la cellule A1.

Vous constaterez que les résultats sont très-différents.


Ce qui manque dans votre demande, c'est l'énoncé de votre problème : que voulez-vous faire ?​



ROGER2327
#6389


Vendredi 20 Décervelage 140 (Saint Outlaw, aristocrate - fête Suprême Quarte)
28 Nivôse An CCXXI, 4,3251h - zinc
2013-W03-4T10:22:49Z
 

Pièces jointes

  • XLD_199375_Divers_2.xlsm
    35 KB · Affichages: 34
Dernière édition:

eucliwood

XLDnaute Nouveau
Re : Pb pr remplir mon petit tableau, tout simple... (il est tard!)

alors, juste mettre dans un tableau des références à des cellules pour ensuite faire des tests sur leur contenu; plus particulièrement, par la suite, tester si leurs valeurs appartiennent à certains domaines de valeurs [a1,b1] ou [a2, b2] ou [a3,b3], etc

sinon, je me permets de remettre mon edit: je ne peux lire les formats xlsm

merci
 

Si...

XLDnaute Barbatruc
Re : Pb pr remplir mon petit tableau, tout simple... (il est tard!)

salut

Si... je peux me permettre, un petit complément d'informations.

Quand on utilise ClRj = Array(…,…,...)
ClRj est un tableau dont la dimensions est automatiquement le nombre d'éléments entre parenthèses
mais, avec Option Explicit, il faut le déclarer
Dim ClRj ou Dim ClRj ()
Dans le premier cas, le type est sous entendu "As Variant" recouvrant tous les types (autre subtilité du VBA).
Exemple
Code:
Option Explicit
Sub TArray()
  Dim n As Byte, ClRj()  'ou ClRj tout court
  ClRj = Array(1, "a", 3)
  For n = 0 To 2
    MsgBox ClRj(n)
  Next
End Sub

Quand on utilise ClRj(i,j)=...
il faut commencer par dimensionner le tableau !
Dim ClRj (a,b) pour la déclaration avec des dimensions connues
Dim ClRj () pour la déclaration puis dans la macro, Redim ClRj(…) avec les problèmes inhérents (voir Aide) pour dimensionner le tableau.
Exemple
Code:
Option Explicit
Sub Tablo()
  Dim i As Byte, j As Byte, ClRj(23, 29)
  For i = 7 To 23 Step 4
    For j = 5 To 29 Step 4
      ClRj(i, j) = Cells(i, j).Address
    Next
  Next
  For i = 7 To 23
    For j = 5 To 29
     MsgBox ClRj(i, j) 'ou Replace(ClRj(i,j),"$","") pour des adresses relatives
    Next
  Next
End Sub

Tu remarqueras que le tableau est surdimensionné (éléments définis mais vides).

Comme le dit Roger2327, il faut savoir, dès le départ, ce que l'on veut !
 

ROGER2327

XLDnaute Barbatruc
Re : Pb pr remplir mon petit tableau, tout simple... (il est tard!)

Re...


(...)

sinon, je me permets de remettre mon edit: je ne peux lire les formats xlsm

(...)
Étourderie !

Voici le classeur au format .xls.​



ROGER2327
#6390


Vendredi 20 Décervelage 140 (Saint Outlaw, aristocrate - fête Suprême Quarte)
28 Nivôse An CCXXI, 4,8250h - zinc
2013-W03-4T11:34:48Z
 

Pièces jointes

  • XLD_199375_Divers_2.xls
    61 KB · Affichages: 42

MJ13

XLDnaute Barbatruc
Re : Pb pr remplir mon petit tableau, tout simple... (il est tard!)

Bonjour à tous

Bon sur ce problème, je suis incompétant :eek:.

mais je n'ai pas bien compris pourquoi cela marchait de cette façon et pas d'une autre. En déclarant 'dim ClRj As Variant', tout court, et en définissant la matrice avec array (comme indiqué dans le bout de code) cela marchait aussi

Mais comme l'a rappellé Si..., si tu ne déclares pas tes variables (en ômétant Option Explicit sur la feuille qui contient ton code ) elles sont obligatoirement déclarées en variant, c'est à dire (enfin ce que j'en ai compris), elles s'adapte au traitement qu'on lui fait.

Par contre, c'est sur qu'avec les tableaux, tu boostes Excel, comme la vitesse de la fusée Ariane par rapport à une 2CV :).
 

Statistiques des forums

Discussions
312 931
Messages
2 093 721
Membres
105 796
dernier inscrit
Max...26