Rechercher : dans
Par :

Tableau VBA deux dimensions

Dernière réponse le 7 nov 2009 à 21:58:40 goomis95, le 5 nov 2009 à 11:55:08 
 Signaler ce message aux modérateurs

Bonjour,

J'essaie de créer ce petit script mais j' arrive pas et pourtant je cherche ! S'il y a des ames charitables capables de m'aider je vous en remercie.

Principe du script :

'on se place dans le feuillet "requête"
'on donne a la valeur K la valeur de l'id situé en "D9"
'ensuite on entre dans le feuillet "logiciel"
'pour K équivalent à la valeur de la colonne A
'alors les données sont entrées dans le tableau[i,j]
'ou i = ligne et j = colonne
'on entre dans le feuillet "requête"
'on recherche la premiere ligne vide
'et on entre les données dans cette ligne vide au fur et à mesure de la boucle


Pour l'instant cela me donne ca mais je dois dire que je commence a secher n'etant pas un pro de ce langage et le decouvrant presque. En espérant que la présentation du script est plutot clair et détaillé.


Sub ExempleTableau()

'Définition des variables
Dim i As Integer, j As Integer
Dim K As Integer

'*Choix du feuillet
Sheets("requête").Select

'*Attribution de l'id a la valeur K
K = Range("D9").Value

'*Définit le tableau à 2 dimensions ainsi que leur taille.
Dim VarTab(1 To 50, 1 To 50) As String

'*On ouvre la feuillet logiciel
Sheets("logiciel").Select

'*Pour i = 1 jusqu'à
For i = 1 To UBound(VarTab, 1) '*boucle sur la 1ere dimension

'* Si k = valeur de i
If Value = K Then
For j = 1 To UBound(VarTab, 2) '*boucle sur la 2eme dimension

'*Alimente les éléments du tableaux
VarTab(i, j) = i & j

'*on entre dans requête
Sheets("requête").Select

'*recherche ligne vide
nli = ActiveSheet.Range("A65356").End(xlUp).Row + 1

'*écrit le résultat du tableau[i,j] dans la ligne vide
ActiveSheet.Cells(nli, i, j) = VarTab(i, j)

Next j

End If

Next i


End Sub

Configuration: Windows XP
Firefox 3.0.10

Meilleures réponses pour « Tableau VBA deux dimensions » dans :
Trier un tableau sans utiliser la fonction sort VoirTrier un tableau sans utiliser la fonction sort D'abord on initialise une variable $max avec la 1ère valeur de tableau. Ensuite on va faire une boucle tant que le tableau contient encore des éléments. C'est avec la fonction splice qui a le rôle...

1

Bidouilleu_R, le 5 nov 2009 à 12:57:07

Sans exemple de ton fichier c'est pas facile mais....
je note en gras les ... corrections
Je comprends que tu veux mettre les données dans un tableau et pas les numéros de ligne : )
En espérant que cela t'aidera.
A+



Sub ExempleTableau()

'Définition des variables
Dim i As Integer, j As Integer
Dim K As Integer

'*Choix du feuillet
Sheets("requête").Select

'*Attribution de l'id a la valeur K
K = Range("D9").Value

'*Définit le tableau à 2 dimensions ainsi que leur taille.
Dim VarTab(1 To 50, 1 To 50) As String ' Certes, ça marche mais c'est lourd VarTab (50,2) aurait suffit

'*On ouvre la feuillet logiciel
Sheets("logiciel").Select

'*Pour i = 1 jusqu'à
For i = 1 To UBound(VarTab, 1) '*boucle sur la 1ere dimension
' là tu vois que tu n'utilise que 2 dimensions pas 50

'* Si k = valeur de i
If Value = K Then ' value n'est pas défini à la limite tu as peut-être voulu écrire i=k ???
For j = 1 To UBound(VarTab, 2) '*boucle sur la 2eme dimension

'*Alimente les éléments du tableaux
VarTab(i, j) = i & j ' seulement i & j varie de 1 à 50
'VarTab(i, j)=cells(i,j).value ' lavaleur d'une cellule ligne i colonne J est placée dans le tableau
'*on entre dans requête
Sheets("requête").Select

'*recherche ligne vide
nli = ActiveSheet.Range("A65356").End(xlUp).Row + 1

'*écrit le résultat du tableau[i,j] dans la ligne vide
ActiveSheet.Cells(nli, i, j) = VarTab(i, j) ' ça c'est faux il faut écrire ActiveSheet.Cells(nli, j) = VarTab(i, j)

Next j

End If

Next i


End Sub

Répondre à Bidouilleu_R

2

goomis95, le 5 nov 2009 à 13:03:05

Merci Beaucoup Bidouilleu_R. Je vais essayer de voir avec ce que tu m'a donner pour corriger le script et le tester. Désolé pour le i = k j'avais pas vu a la relecture ma faute ou plutôt mon oubli :)

A+

Répondre à goomis95

3

goomis95, le 5 nov 2009 à 13:40:27

Le script fonctionne ( merci ) mais ne donne pas ce que je souhaite parce que j'ai sans doute été pas assez clair donc cela est normal.

Je m'explique donc mieux :

J'ai une feuille user , une feuille logiciel , et une feuille requête.

J'ai des données dans user et logiciel, la feuille requête elle sert seulement pour extraire les informations de la feuille logiciel selon l'id de l'user.

Dans la feuille user j'ai :

nom | id
a | 1
b | 2

etc ...

et dans la feuille logiciel :

id user | id logiciel | nom | OS |version | etc ... ( exemple )
1 | 1 | Office | Windows | 2003
1 | 2 | Dia | Windows | 0.93

Je fais une recherche via une macro et la fonction recherchev de l'id d'un user en fonction du nom.

Puis a partir de l'id obtenu créer un bouton ( fait ) qui quand on clic dessus affiche les résultats selon l'id.
Exemple :

Taper ici le nom du salarié : gfh
id user obtenu : 1

Cliquez ici pour plus de renseignements :
*on clic*
et la recherche doit donner

dans les cases ( cases d'exemple )

1 A1 A2 A3 A4 A5
2 1 1 Office Windows 2003
3 1 2 Dia Windows 0.93


J'espere que comme cela je suis plus clair :).

Je re post en cas ou le script donc ou j'en suis ( et avec l'aide de Bodouilleu_R ) :

Sub ExempleTableau()

'Définition des variables
Dim i As Integer, j As Integer
Dim K As Integer

'*Choix du feuillet
Sheets("requête").Select

'*Attribution de l'id a la valeur K
K = Range("D9").Value

'*Définit le tableau à 2 dimensions ainsi que leur taille.
Dim VarTab(50, 2) As String ' Certes, ça marche mais c'est lourd VarTab (50,2) aurait suffit

'*On ouvre la feuillet logiciel
Sheets("logiciel").Select

'*Pour i = 1 jusqu'à
For i = 1 To UBound(VarTab, 1) '*boucle sur la 1ere dimension
' là tu vois que tu n'utilise que 2 dimensions pas 50
'* Si k = valeur de i
If i = K Then ' value n'est pas défini à la limite tu as peut-être voulu écrire i=k ???

For j = 1 To UBound(VarTab, 2) '*boucle sur la 2eme dimension

'*Alimente les éléments du tableaux
VarTab(i, j) = i & j ' seulement i & j varie de 1 à 50
'VarTab(i, j)=cells(i,j).value ' lavaleur d'une cellule ligne i colonne J est placée dans le tableau
'*on entre dans requête
Sheets("requête").Select

'*recherche ligne vide
nli = ActiveSheet.Range("A65356").End(xlUp).Row + 1

'*écrit le résultat du tableau[i,j] dans la ligne vide
ActiveSheet.Cells(nli, j) = VarTab(i, j)

Next j

End If

Next i


End Sub


Merci a ceux qui essaieront de m'aider.

A+

Répondre à goomis95

4

michel_m, le 5 nov 2009 à 17:16:28

Bonjour,

dans un array (variable-tableau) la limite inférieure est par défaut 0
donc:
vartab(49,1)
si tu veux conserver vartab(50,2) tu écris au dessus des macros en haut de page
option base1



j'ai interprété ta demande ainsi

trouver les lignes dans feuille "logiciel" ayant en colonne B(c'est B?) l'identifiant (valeur D49 feuille requete) et copier les données (combien de colonnes maxi as tu ?) en feuille requete (àpartir de quelle ligne ?)

c'est cela ou pas ?
Dans l'attente :-x

Répondre à michel_m

5

goomis95, le 5 nov 2009 à 17:44:51

Bonjour michel,

Oui en gros c'est ça. je reformule a partir de ton interprétation pour que cela soit plus clair.


trouver la (ou les) ligne(s) dans la feuille "logiciel" ayant en colonne A l'identifiant (valeur D9 de la feuille requete)

et copier les données ( J'ai 9 colonnes ) en feuille requete ( à partir de quelle ligne ? la derniere ligne utilisé ( dans la feuille requete c'est la 14)

De mon coté j'ai pensé a plusieurs algo depuis et essayer de les mettre sous forme mais j'ai toujours des problèmes ici et la donc en attendant ta réponse je vais continuer à trifouiller mes pistes.

Dans l'attente.

Répondre à goomis95

6

michel_m, le 5 nov 2009 à 18:44:57

OK, je t'envoie une macro demain dans la matinée

bonne soirée. :-x

Répondre à michel_m

7

michel_m, le 6 nov 2009 à 10:18:14

Bonjour Goomis, Bidouilleu

j'ai nommé 2 cellules D9: "id_user"
et celle du point de départ de la restitution en feuille "requête" : "resultat

la macro proposée:

Option Explicit

Const col As Byte = 9 'nombre de colonnes à copier

Sub nettoyer()
'sous macro pour maintenance et essais
Sheets("requête").Range("resultat").Resize(100, col).Clear
End Sub


Sub extraire_svt_id()
Dim ident 'as ? à complèter
Dim nbre_id As Byte
Dim tablo
Dim lig As Byte, cptr_y As Byte, cptr_x As Byte

'prépraration
ident = Range("id_user")
If IsEmpty(ident) Then
    MsgBox "identification non demandée", vbCritical
    Exit Sub
End If
With Sheets("logiciel")
    nbre_id = Application.CountIf(.Columns(1), ident)
    ReDim tablo(nbre_id - 1, col - 1)
    
'collecte des données dans le tableau virtuel
    lig = 1
    For cptr_y = 0 To UBound(tablo)
        lig = .Columns(1).Find(ident, .Cells(lig, 1), xlValues).Row
        For cptr_x = 0 To col - 1
            tablo(cptr_y, cptr_x) = .Cells(lig, cptr_x + 1)
        Next
    Next
End With

'restitution dans feuille "requ^te"
nettoyer
Application.ScreenUpdating = False 'fige le défilement de l'écran
Sheets("requête").Activate
With Range("resultat").Resize(nbre_id, col)
    .Value = tablo
    .Borders.Weight = xlThin 'encadre le tableau
End With

End Sub


ci joint maquette de travail:
http://cjoint.com/?lgkpB2mOE6

:-x

Répondre à michel_m

8

goomis95, le 6 nov 2009 à 11:05:11

Bonjour Michel, Bidouilleu_R,

Je viens de tester ta macro et elle marche a merveille. Je te remercie beaucoup pour l'aide et l'attention que tu as porté pour m'aider.

Merci aussi à bidouilleu_r qui a tenter de m'aider.

A+ et bonne journée.

Répondre à goomis95

9

goomis95, le 6 nov 2009 à 13:07:37

RE bonjour,

J'ai un mini soucis qui doit être facile pour toi michel a régler je pense.

Si j'utilise ton fichier tout marche niquel sans problème ainsi qu'en modifiant les données dans logiciel etc ... et j'ai commencer à bien analyser ton code.

Seulement avec quelques modifications ( pas très compliqué ) ou même un copier coller de ta macro vers mon classeur j'ai un message d'erreur et cela sans faire aucune modification du code.

Quand je ne modifie pas le code et que j'essaie de l'utiliser sur mon classeur cela me met :

erreur d'execution '9' l'indice n'appartient pas à la selection.

a la suite de ca, j'ai repris ton classeur et ta macro , j'ai commencer a refaire mon classeur sur le tien, aucun probleme à dénoncé. Puis pour faire un test, j'ai créer un bouton avec une copie de ta macro renommer extraire_id2 et en changeant juste le fait qu'au lieu que cela les réponses de la macro s'affichent a partir de la case resultat, ils s'affichent dans la case resultat2 situé plus a droite.

Seulement voila j'ai un probleme bien avant puisqu'il me remet cette erreur a la meme ligne.

EDIT : Depuis sur le classeur j'ai effacer toutes mes autres macro, hormis celle que tu m'as donner, et renommant exactement ta macro comme elle etait. Et la ca remarche ... je ne vois pas d'où ça viens.

EDIT 2 : j'ai compris mon erreur ( mettre ta macro a la suite plutot qu'au debut de la liste de fonction due a l'option pour les colonnes enfin bref je voulais effacer le message mais je peux pas alors je l'edit :).

A+ et merci.

Répondre à goomis95

10

Bidouilleu_R, le 6 nov 2009 à 18:19:20

Salut, michel_M ( ça faisait un moment que l'on ne s'était pas croisés) et Goomis95

Désolé de ne pas avoir répondu j'étais absent toute la journée...

Pour l'erreur 9
le début du code de michel commence par
Option Explicit

il y a sans doute une variable non définie dans la suite du code.
De toute manière
Ouvre le Editeur VBA F8 (pas à pas)
la ligne où se trouve l'erreur sera surlignée en jaune.
Tu dis laquelle et on te dira quoi faire.

A+
Ps: Le code étant bien écrit tu pourras peut-être "décoincé" le problème tout seul mais tiens nous au courant!

Répondre à Bidouilleu_R

11

michel_m, le 7 nov 2009 à 09:29:38

Salut bidouilllleu

Goomis n'a t il pas résolu son pb avec "edit2" de son message ?
cordialement :-x

Répondre à michel_m

12

 Bidouilleu_R, le 7 nov 2009 à 21:58:40

Ah oui! je devais être enrhumé des yeux, une grippe à verres....
A+

Répondre à Bidouilleu_R