Microsoft 365 Utilisation de application. Index

ChTi160

XLDnaute Barbatruc
Bonjour
Afin de me perfectionner , je suis a la recherche d'aide de Tutos , de Démos d'exemples , me permettant de mieux appréhender cette Fonction "INDEX"
et donc de l'utiliser .
merci par avance
jean marie
 

patricktoulon

XLDnaute Barbatruc
re
application .index te permet de cibler 1 ou des elements d'un tableau
il faut savoir que application.index est TOUJOURS EN BASE 1 MÊME AVEC UN TABLEAU EN BASE 0
exemple d'utilisation
VB:
tablo=[A1:G10].value

1 °on cible un!!!!element!!!!
ceci
Code:
msgbox application.index(tablo,3,2)
est l'équivalent de msgbox tablo(3,2)'qui nous donne la valeur qui est en B3

2° on cible UNE!!!!! ligne entière( la 3 par exemple) (donc on va se retrouver avec un array (1 dim)
Attention "0" veut dire ici "toute les colonnes" et non colonne(0) qui n'existe pas)
Code:
ligne=application.index(tablo,3,0)'on obtient la ligne 3 complète dans un array 1 dim
'juste pour voir
msgbox join(ligne)

3° on cible UNE!!! colonne entière ( la 3 par exemple)
Attention "0" veut dire ici "toute les les lignes" et non ligne(0) qui n'existe pas)
Code:
macolonne= application.index( tablo,0,3)
msgbox macolonne(1,1)


4° on transforme cette colonne récupérée précédemment en array (1dim)
Code:
monarray=application.transpose(macolonne)
msgbox monarray(1)'ici plus de 2d dimension

entraîne toi avec ça et je t'en donne d'autre
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
la on entre dans le sujet qui t'intéresse
j'en profite pour te montrer certain raccourcis pour concevoir des array 1/2 dim avec evaluate (abrégé ou pas)
5° certaines lignes toutes les colonnes
quand on utilise des array pour certaines lignes on est obligé d'utiliser un array pour les colonnes meme si c'est toutes les colonnes
VB:
Sub test()
'récupération de certaines ligne du tableau toutes les colonnes
tablo = [A1:G10]
'--------------------------------------------------------------------------
'on determine les lignes que l'on veut
lignes = [{1;3;5;7;9}] 'exprimé en matricielle dans evaluate abrégé !![on obtient un tableau 2 dim(x lignes,1 colonne)]!!
'ou la meme chose
'lignes = Application.Transpose(Array(1, 3, 5, 7, 9))
'--------------------------------------------------------------------------

'--------------------------------------------------------------------------
'on determine les colonnes que l'on veut
colonnes = Evaluate("column(A1:G1)")'exprimé en matricielle dans evaluate abrégé !![on obtient un tableau 1 dim(x items)]!!
'ou la meme chose
colonnes = Array(1, 2, 3, 4, 5, 6, 7)
'--------------------------------------------------------------------------

newtablo = Application.Index(tablo, lignes, colonnes)

[I1].Resize(UBound(newtablo), UBound(newtablo, 2)) = newtablo

End Sub
a noter par exemple que l'on peut changer l'ordre des colonnes
Code:
colonnes = Array(3,5,1,7,2,4,6)
 

patricktoulon

XLDnaute Barbatruc
re
6° ici on recupere toutes les lignes et certaines colonnes
VB:
Sub test()
'récupération de toutes les  lignes du tableau certaines colonnes
tablo = [A1:G10]
'--------------------------------------------------------------------------
'on détermine les lignes que l'on veut
lignes = Evaluate("row(1:10)") 'exprimé en matricielle dans evaluate ![on obtient un tableau 2 dim(x lignes,1 colonne)]!!
'ou la meme chose
'lignes = Application.Transpose(Array(1,2,3,4,5,6,7,8,9,10))
'--------------------------------------------------------------------------

'--------------------------------------------------------------------------
'on détermine les colonnes que l'on veut
colonnes = Array(1, 4, 6, 7)
'--------------------------------------------------------------------------

newtablo = Application.Index(tablo, lignes, colonnes)

[I1].Resize(UBound(newtablo), UBound(newtablo, 2)) = newtablo

End Sub
pareil on peut mettre les colonnes dans l'ordre que l'on veut
VB:
colonnes = Array(7,4,1,6)
 

ChTi160

XLDnaute Barbatruc
Bonsoir
je suis de retour sur ce Fil
car toujours pour m'améliorer
j'ai tenté d'utiliser
la Fonction "CountA" et "Application.Index"
et je n'arrive pas a ce que je veux !
Explications , je remplie un Tableau avec les données d'une Plage de Cellules ou il y a des Lignes Vides .
a partit de ce Tableau , je voudrais mettre en évidence les Lignes Vides.
j'ai utilisé cette Procédure
VB:
Sub testIndex()
Dim Lgn As Integer
Dim Tbl As Variant
With Worksheets("Test")
Tbl = .UsedRange.Value
For Lgn = 1 To UBound(Tbl, 1)
 If Application.CountA(Application.Index(Tbl, Lgn, 0)) = 0 Then
     MsgBox Lgn
 End If
Next Lgn
 End With
End Sub
Mais rien ne s’affiche comme si toutes les Lignes n’étaient pas vides!
Si j'utilise une Boucle sur les Lignes de la plage , ça détecte les Lignes Vides !
Que me manque t'il pour que ça Fonctionne avec ma procédure ?
Merci par avance
Bonne fin de Soirée
Jean marie
 

patricktoulon

XLDnaute Barbatruc
Bonjour
countA et countblank ne sont pas compatibles avec des variables tableau

de plus
je ne vois pas l’intérêt ici de passer par une variable tableau pour compter les case pleine de chaque lignes
VB:
Sub testIndex()
    Dim Lgn As Integer, Tbl As Variant
    With Worksheets("Test")
        'Tbl = .UsedRange.Value
              For Lgn = 1 To .UsedRange.Rows.Count ' UBound(Tbl, 1)
            Debug.Print "ligne:" & Lgn & ": " & Application.CountA(.UsedRange.Rows(Lgn)) & " case(s) pleine(s)"
            If Application.CountA(.UsedRange.Rows(Lgn)) = 0 Then
                MsgBox Lgn
            End If
        Next Lgn
    End With
End Sub

il me semble te l'avoir deja dit
quand on travaille en lecture d'une plage( et non en ecriture) il n'est pas nécessaire de travailler avec une variable tableau
 
Dernière édition:

ChTi160

XLDnaute Barbatruc
Bonjour Patrick
Je savais faire ça ! #12
VB:
Si j'utilise une Boucle sur les Lignes de la plage , ça détecte les Lignes Vides !
C'était pour voir avec un tableau. Et les fonctions "CounA" et "Index"
J'avais cru lire pour la Fonction "CountA"
"Plage et Tableau".
Merci de ces précisions
Bonne journée
Jean marie
Ps : 9:47
C'est ce qui m'a induit en erreur !
Utilisez CountA pour compter le nombre de cellules qui contiennent des données dans une plage ou un tableau.
 
Dernière édition:

Efgé

XLDnaute Barbatruc
Bonjour à tous

Il me semble que application.index dans une boucle est une fausse bonne idée.
Dans Ce Fil, J'avais utiliser ce système :
VB:
For i = LBound(Tbl, 1) To UBound(Tbl, 1)
    Texte = Join(Application.Index(Tbl, i), ";")
    Print #FileNumber, Texte
Next i
Pour 900 000 lignes, @job75 n'avait même pas été au bout du test tellement le code était long....

Toujours pour 900 000 lignes avec
Code:
For i = LBound(Tbl, 1) To UBound(Tbl, 1)
    For j = LBound(Tbl, 2) To UBound(Tbl, 2)
        TblTemp(j) = Tbl(i, j)
    Next j
    Print #FileNumber, Join(TblTemp, ";")
Next i
Job75 avait chronométré 5,7 secondes.

Cordialement
 

Discussions similaires

Réponses
6
Affichages
567

Statistiques des forums

Discussions
312 211
Messages
2 086 299
Membres
103 172
dernier inscrit
Aurelyan