IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

(Tableaux) Comment définir une colonne ?


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué
    Homme Profil pro
    Assistant technique
    Inscrit en
    Février 2007
    Messages
    336
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Assistant technique
    Secteur : Services à domicile

    Informations forums :
    Inscription : Février 2007
    Messages : 336
    Points : 197
    Points
    197
    Par défaut (Tableaux) Comment définir une colonne ?
    Bonjour,

    J'ai une petite question à propos des tableaux

    Comment faire ce que j'ai mis en rouge svp :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    tb1 = wb1.sheets(1).range("a2:b50").value
    tb2 = wb2.sheets(1).range("a2:c200").value 'contient les données
    
    For i = 1 To UBound(tb1, 1)
    tb1(i, 2) = Application.SumIfs(tb2(3ème colonne), tb2(1ère colonne), tb1(i, 1), tb2(2ème colonne), "1")
    Next

    Merci par avance

  2. #2
    Membre émérite

    Homme Profil pro
    Technicien Métrologie R&D
    Inscrit en
    Janvier 2007
    Messages
    1 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien Métrologie R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 610
    Points : 2 523
    Points
    2 523
    Billets dans le blog
    1
    Par défaut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For i = 1 To UBound(tb1, 1)
    tb1(i,2)=tb2(i,2)+tb2(i,3)+tb2(i,1)+tb1(i,1)+1
    next
    c'est ça que tu veux ?

    possible que ce soit également ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For i = 1 To UBound(tb1, 1)
    tb1(i,2)=tb2(i,2)&tb2(i,3)&tb2(i,1)&tb1(i,1)&"1"
    next
    d'un autre coté tu as un tableau avec 500 éléments
    de l'autre un avec 200 , tu va avoir des vide qui vont te retourner un message d'erreur ( l'indice n'appartient pas à la sélection)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    For i = 1 To UBound(tb2, 1)
    tb1(i,2)=tb2(i,2)+tb2(i,3)+tb2(i,1)+tb1(i,1)+1
    next
    For i =UBound(tb2, 1)+1 to UBound(tb1, 1)
    tb1(i,2)=tb2(i,2)+tb2(i,3)+tb2(i,1)+tb1(i,1)+1
    next
    [/code]
    si tu décrivais un peu plus le résultat souhaité ce serait plus clair
    .. et les explications le seraient également

  3. #3
    Membre habitué
    Homme Profil pro
    Assistant technique
    Inscrit en
    Février 2007
    Messages
    336
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Assistant technique
    Secteur : Services à domicile

    Informations forums :
    Inscription : Février 2007
    Messages : 336
    Points : 197
    Points
    197
    Par défaut
    Re,

    j'ai fait une capture de la formule SOMME.SI.ENS :



    Sur la capture, dans "Plage_somme" j'ai mis "colonne C du classeur 2"

    Donc en VBA ça serait un truc comme tb2(3ème colonnes)

    Et c'est ça que je ne sais pas faire, lui indiquer une colonne spécifique d'un tableau


    Encore merci

  4. #4
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Bonjour

    SumIfs prend en paramètre des Ranges et non des tableaux
    Aide
    WorksheetFunction.SumIfs, méthode
    Ajoute les cellules d'une plage répondant à plusieurs critères. Syntaxe
    expression.SumIfs(Arg1, Arg2, Arg3, Arg4, Arg5, Arg6, Arg7, Arg8, Arg9, Arg10, Arg11, Arg12, Arg13, Arg14, Arg15, Arg16, Arg17, Arg18, Arg19, Arg20, Arg21, Arg22, Arg23, Arg24, Arg25, Arg26, Arg27, Arg28, Arg29, Arg30)
    expression Variable représentant un objet WorksheetFunction.
    Paramètres
    Nom Obligatoire/Facultatif Type de données Description Arg1 Obligatoire Range Sum_range - plage à totaliser. Arg2 Obligatoire Range Criteria_range1, criteria_range2, … - une ou plusieurs plages dans lesquelles évaluer les critères associés.
    Sinon, une alternative avec SommeProd

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    Sub Import()
    Dim Wbk As Workbook
    Dim Sh As Worksheet
    Dim LastLig1 As Long, LastLig2 As Long
    Dim Chemin As String, Fichier As String
    Dim RgA As String, RgB As String, RgC As String
     
    Application.ScreenUpdating = False
    'Chemin du classeur Classeur2
    Chemin = "C:\Documents and Settings\Administrateur\Bureau\"
    'Nom du classeur 2
    Fichier = "Classeur2.xls"
    'ouverture de classeur2 (contenu dans la variable Wbk)
    Set Wbk = Workbooks.Open(Chemin & Fichier)
    'Instancer la Feuil1 de Classeur2 dans la variable Sh
    Set Sh = Wbk.Worksheets("Feuil1")
    With Sh
        'N° de ligne de la dernière cellule remplie de la colonne A de Feuil1 de Classeur2
        LastLig2 = .Cells(.Rows.Count, 1).End(xlUp).Row
        'Adresse complète de la plage utile de la colonne  A de Feuil1 de Classeur2 type [Classeur2.xls]Feuil1!A2:A120 (LastLig2=120 par exemple)
        RgA = "[" & Wbk.Name & "]" & .Name & "!A2:A" & LastLig2
        'Adresse complète de la plage utile de la colonne  B de Feuil1 de Classeur2 type [Classeur2.xls]Feuil1!B2:B120 (LastLig2=120 par exemple)
        RgB = "[" & Wbk.Name & "]" & .Name & "!B2:B" & LastLig2
        'Adresse complète de la plage utile de la colonne  C de Feuil1 de Classeur2 type [Classeur2.xls]Feuil1!C2:C120 (LastLig2=120 par exemple)
        RgC = "[" & Wbk.Name & "]" & .Name & "!C2:C" & LastLig2
    End With
    'Libération de la variable Sh
    Set Sh = Nothing
    With ThisWorkbook.Worksheets("Feuil1")
        'N° de ligne de la dernière cellule remplie de la colonne A de Feuil1 de Classeur1
        LastLig1 = .Cells(.Rows.Count, 1).End(xlUp).Row
        'On écrit la formule sommeprod dans la plage et on fige les valeurs résultats
        With .Range("B2:B" & LastLig1)
            .Formula = "=SUMPRODUCT((" & RgA & "=A2)*(" & RgB & "=1)*" & RgC & ")"
            .Value = .Value
        End With
    End With
    'On ferme Classeur1
    Wbk.Close False
    'Libération de la variable Wbk
    Set Wbk = Nothing
    End Sub
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  5. #5
    Membre émérite

    Homme Profil pro
    Technicien Métrologie R&D
    Inscrit en
    Janvier 2007
    Messages
    1 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien Métrologie R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 610
    Points : 2 523
    Points
    2 523
    Billets dans le blog
    1
    Par défaut
    les tableau pris par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tablo1=range("a1:a500")
    vont avoir une forme
    tablo(1)
    -->tablo(1,1)
    tablo(2)
    -->tablo(2,1)
    tablo(3)
    -->tablo(3,1)
    ......
    tablo(500)
    -->tablo(500,1)
    lorsque tu prends un tableau de trois colonnes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tablo1=range("a1:a200")
    ton tableau VBA prends ce look
    tablo(1)
    -->tablo(1,1)
    -->tablo(1,2)
    -->tablo(1,3)
    tablo(2)
    -->tablo(2,1)
    -->tablo(2,2)
    -->tablo(2,3)
    tablo(3)
    -->tablo(3,1)
    -->tablo(3,2)
    -->tablo(3,3)
    ....
    tablo(200)
    -->tablo(200,1)
    -->tablo(200,2)
    -->tablo(200,3)
    ta troisième colonne est l'étiquette 3 de chacun des éléments

  6. #6
    Membre habitué
    Homme Profil pro
    Assistant technique
    Inscrit en
    Février 2007
    Messages
    336
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Assistant technique
    Secteur : Services à domicile

    Informations forums :
    Inscription : Février 2007
    Messages : 336
    Points : 197
    Points
    197
    Par défaut
    Et c'est possible d'avoir quelque chose comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tb(1ère ligne à la dernière, 3)
    J'ai essayé :

    Mais ça ne fonctionne pas

  7. #7
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    Par défaut
    Bonjour,

    Ce tuto pourra sans doute t'aider à comprendre la manipulation des tableaux

    http://silkyroad.developpez.com/vba/tableaux/
    LES FAQ OFFICE - LES COURS OFFICE - LES COURS EXCEL - LES LIVRES OFFICE - SOURCES VBA - ATELIER BRICOLAGE VBA

    Lorsque votre problème est solutionné, pensez à le signaler en cliquant sur le bouton au bas de la discussion.

  8. #8
    Expert éminent sénior
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Points : 11 274
    Points
    11 274
    Par défaut
    Salut,et un autre également à consulter http://didier-gonard.developpez.com/...s-tableau-vba/

  9. #9
    Membre habitué
    Homme Profil pro
    Assistant technique
    Inscrit en
    Février 2007
    Messages
    336
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Assistant technique
    Secteur : Services à domicile

    Informations forums :
    Inscription : Février 2007
    Messages : 336
    Points : 197
    Points
    197
    Par défaut
    Oui j'ai déjà lu ces tutos mais je n'ai pas trouvé ce que je recherchais

  10. #10
    Membre émérite

    Homme Profil pro
    Technicien Métrologie R&D
    Inscrit en
    Janvier 2007
    Messages
    1 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien Métrologie R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 610
    Points : 2 523
    Points
    2 523
    Billets dans le blog
    1
    Par défaut
    essayes ceci , je ne l'ai pas tester ( écrit à l'arrache dans notepad++)

    si celà fait ce que tu veux on passeras aux explications plus détaillées

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    sub global()
    ' tableau client TC
    ' tableau facturation TF
    ' tableau totaux TT
    Dim TC,TF,t as long, v as long, u as long
    Dim TT() as variant
    With Sheets(1)
    	TC=.range("a1:a" & range("a50000").end(xlup).row)
    	End With
    With Sheets(2)
    	TC=.range("a1:c" & range("a50000").end(xlup).row)
    	End With
    u=1
    for t= 1 to ubound(TC,1)
    	for v= 1 to ubound(TF,1)
    		for mois= 1 to 12 
    			redim preserve TT(1 to 3,1 to u)
    				if TC(t,1)=TF(t,1) and TF(t,2)=mois then
    				TT(1,u)= TC(t,1)
    				TT(2,u)= mois
    				TT(3,u)=TT(3,u)+TF(t,3)
    				u=u+1
    				end if
    			next
    		next
    	next
    with sheets(2)
     .range("f1:h" & u).value= worsheetfunction.transpose (TT)end with
     end with
    end sub

  11. #11
    Membre habitué
    Homme Profil pro
    Assistant technique
    Inscrit en
    Février 2007
    Messages
    336
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Assistant technique
    Secteur : Services à domicile

    Informations forums :
    Inscription : Février 2007
    Messages : 336
    Points : 197
    Points
    197
    Par défaut
    il s'arrête à la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For v = 1 To UBound(TF, 1)
    En affichant le message d'erreur : "Incompatibilité de type"


    PS : j'ai un peu remis en forme ton code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    Sub aGlobal()
    ' tableau client TC
    ' tableau facturation TF
    ' tableau totaux TT
    Dim TC, TF, t As Long, v As Long, u As Long
    Dim TT() As Variant
    With Sheets(1)
        TC = .Range("a1:a" & Range("a50000").End(xlUp).Row)
    End With
    With Sheets(2)
        TC = .Range("a1:c" & Range("a50000").End(xlUp).Row)
    End With
    u = 1
    For t = 1 To UBound(TC, 1)
        For v = 1 To UBound(TF, 1)
            For mois = 1 To 12
            ReDim Preserve TT(1 To 3, 1 To u)
                If TC(t, 1) = TF(t, 1) And TF(t, 2) = mois Then
                    TT(1, u) = TC(t, 1)
                    TT(2, u) = mois
                    TT(3, u) = TT(3, u) + TF(t, 3)
                    u = u + 1
                End If
            Next
        Next
    Next
    With Sheets(2)
        .Range("f1:h" & u).Value = worsheetfunction.Transpose(TT)
    End With
    End Sub

  12. #12
    Membre émérite

    Homme Profil pro
    Technicien Métrologie R&D
    Inscrit en
    Janvier 2007
    Messages
    1 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien Métrologie R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 610
    Points : 2 523
    Points
    2 523
    Billets dans le blog
    1
    Par défaut
    regardes tes tableaux
    Dim TC, TF, t As Long, v As Long, u As Long
    Dim TT() As Variant
    With Sheets(1)
    TC = .Range("a1:a" & Range("a50000").End(xlUp).Row)
    End With
    With Sheets(2)
    TC = .Range("a1:c" & Range("a50000").End(xlUp).Row)
    End With
    tu n'as pas l'impression d'avoir copier deux fois la même chose?
    tu ecrases le tableau TC pris sur la première feuille par lui même pris sur la feuille 2
    en remplaçant TC par TF le message d'erreur devrait disparaitre
    L'incompatibilité de type vient de ce que le tableau TF n'est pas renseigné

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 19/07/2006, 14h28
  2. Réponses: 8
    Dernier message: 20/12/2004, 15h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo