Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2010 Extraire 3 colonnes d'un champ au-delà de 65536 lignes

cp4

XLDnaute Barbatruc
Bonjour,

En fouinant sur le site de Boisgontier, j'ai trouvé des codes permettant de récupérer des colonnes choisies d'une plage.
Dans mon cas colonnes: 2, 3 et 16.
Cependant, ces codes plantent si la plage contient plus de 65536 lignes.
Comment contourner cette limitation à 65536 lignes.
Avec mes remerciements anticipés.

nb: je répondrai ce soir car très occupé ces derniers jours.
 

Pièces jointes

  • Extraire Col_2_3_16.xlsm
    22.5 KB · Affichages: 54

patricktoulon

XLDnaute Barbatruc
re
d'abords c'est pas index mais evaluate qui est limité

et oui j'ai bien lu ton post 15
si tu vais essayé tu aurais vu que le résultat n'est pas dans les cellules et que tbl contient bien tes 3 colonnes
mais bon tu es comme @laurent950 tu comprends la moitié et eurêka tu pense avoir tout compris c'est exténuant
 

cp4

XLDnaute Barbatruc
Non, j'ai testé et il y a bien une copie qui s'effectue et ensuite on récupère dans le tableau. Ce n'est pas ce que je souhaite.

Où vois-tu Evaluate dans cette ligne de code la fonction Evaluate:
b = Application.Index(Rng, tmp, Array(2, 3, 16))

Si tu prétends qu'Evaluate est limitée. Vu la ligne de code ci-dessus, je peux conclure qu'Index est, elle aussi limitée à 65536 lignes.

Je sui peur-être comme @laurent950, tant pis pour moi et tant mieux pour toi qui comprend tout au quart de tour.

Merci bien.

Bonne soirée.
 

patricktoulon

XLDnaute Barbatruc
re
b = Application.Index(Rng, tmp, Array(2, 3, 16))

déjà ici en gras ça doit être un tableau pas un range donc rng.value

Non, j'ai testé et il y a bien une copie qui s'effectue et ensuite on récupère dans le tableau. Ce n'est pas ce que je souhaite.
et bien si tu a ou trouve une autre solution autre que les deux que je t'ai présenté sans boucle allant plus loin que 65536 lignes
fait nous le savoir
 

cp4

XLDnaute Barbatruc
Qui a parlé de sans boucle
Pour Rng, as-tu consulté les codes de Boisgontier dans le fichier joint.
Y a des jours où tu n'es pas bienveillant. En effet, tu adoptes des fois la même attitude des gens de DVP. Là où tu as fais tes "premières armes" en codage. Voir ICI

Finalement, j'opte pour une boucle pour ne pas me prendre la tête surtout que je suis crevé.
VB:
Sub test1()
   Dim i As Long, Tb1(), Tb2()

   With Feuil1
      Tb1 = .Range("A2:P" & .Range("A" & Rows.Count).End(xlUp).Row).Value
      ReDim Tb2(1 To UBound(Tb1), 1 To 3)
      For i = 1 To UBound(Tb1)
         Tb2(i, 1) = Tb1(i, 2)
         Tb2(i, 2) = Tb1(i, 3)
         Tb2(i, 3) = Tb1(i, 16)
      Next i
   End With
End Sub
Bonne soirée.
Discussion close!
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
oui je connais bien les code de jacques boisgontier ils sont très inspirants

rien ne t’empêche de respecter une syntaxe qui sera intelligible pour tout le monde

et si par mon expérience je peut t’empêcher de passer des étapes inutiles comme j'ai pu le faire dans le passé ben pour moi c'est ça transmettre avec bienveillance

tu me diras "y a que quand on a le c.. dans l'eau que l'on apprend a nager"
 

ChTi160

XLDnaute Barbatruc
Bonjour cp4
Bonjour le Fil(Patrick) ,le Forum
Ce que pourrait faire Patrick par exemple c'est te demander pourquoi "dl"dans cette partie du code.
Juste pour faire avancer le schimilimblick lol
VB:
dl = .Range("A" & Rows.Count).End(xlUp).Row
      Tb1 = .Range("A2:P" & .Range("A" & Rows.Count).End(xlUp).Row).Value
Bonne journée
Jean marie
 

cp4

XLDnaute Barbatruc
Bonjour Chti1600,

Merci. Pas encore bien éveillé, juste oublié d'effacer la ligne dl.

Bonne journée.

edit: c'est fait j'ai corrigé. encore merci. Encore une journée de travaux dès 9h
 

patricktoulon

XLDnaute Barbatruc
bonjour ChTi160
je pige pas ton intervention là
le problème n'est pas de déterminer une limite de ligne
la demande est de récupérer 3 colonne sur 16
et par fonction vba ou evaluate sans boucle si on dépasse le rows.count de XL2003 on est mort
les seules solution alors sont
  1. 2 boucle imbriquée
  2. le copy (clipboard)
  3. la recup de l'union dans une plage temporaire
[edit]
ca y est je percute
oui bon ben il est parti a coder séquentiellement puis il a compacté c'est pas bien grave juste un petit calcul pour rien

je me demande si je pourrais faire quelque chose avec Ado

la je suis sur un exercice de chiffrement,j'essaierais dans la matinée
 
Dernière édition:

ChTi160

XLDnaute Barbatruc
Re
Patrick
je me suis permis de faire allusion a ce que tu disais et je voulais faire comprendre a cp4 que tu fais comme tu le dis :
et si par mon expérience je peut t’empêcher de passer des étapes inutiles comme j'ai pu le faire dans le passé ben pour moi c'est ça transmettre avec bienveillance
juste ca ! ca image à mon sens ce que tu dis Lol
ca aurait pu donner
VB:
dl = .Range("A" & Rows.Count).End(xlUp).Row
      Tb1 = .Range("A2:P" &  dl).Value
ou
VB:
      Tb1 = .Range("A2:P" & .Range("A" & Rows.Count).End(xlUp).Row).Value

Voilà c'est tout ! Lol
Bonne journée
jean marie
 

cp4

XLDnaute Barbatruc
Bonjour PatrickToulon ,

Je reformule ma question pourquoi les codes du fichier de Boisgontier Lien ici plantent si le nombres de lignes dépassent 65536. Tu as dit que la fonction Evaluate était limitée et non la fonction Index. De plus tu as aussi corrigé (Rng. value pas Rng seule, alors que c'est bien Rng seule dans le code de Boisgontier dans la procédure Sub ExtraitCol136Champ).
Codes du fichier ci-dessous
VB:
Sub ExtraitCol136Champ()
 Set Rng = [A2:F65537]
 Dim tmp(): ReDim tmp(1 To Rng.Rows.Count, 1 To 1): For i = 1 To Rng.Rows.Count: tmp(i, 1) = i: Next
 b = Application.Index(Rng, tmp, Array(1, 3, 6))'plante ici'
 [M2].Resize(UBound(b), UBound(b, 2)) = b
End Sub
Sub ExtraitCol136Champ2()
 Set Rng = [A2:F65536]
 b = Application.Index(Rng, Evaluate("Row(1:" & Rng.Rows.Count & ")"), Array(1, 3, 6))'ne plante pas car L=65536'
 [M2].Resize(UBound(b), UBound(b, 2)) = b
End Sub
Sub ExtraitCol136Tableau()
 a = [A2:F65537].Value
 Dim tmp(): ReDim tmp(1 To UBound(a), 1 To 1): For i = 1 To UBound(a): tmp(i, 1) = i: Next
 b = Application.Index(a, tmp, Array(1, 3, 6)) 'plante ici'
 [M2].Resize(UBound(b), UBound(b, 2)) = b
End Sub
Sub ExtraitCol136Tableau2()
 a = [A2:F65536]
 b = Application.Index(a, Evaluate("Row(1:" & UBound(a) & ")"), Array(1, 3, 6))'ne plante pas car L=65536'
 [M2].Resize(UBound(b), UBound(b, 2)) = b
End Sub
Je voulais des explications du pourquoi ça planté au-delà de 65536 et s'il y avait éventuellement une solution sans passer par une feuille intermédiaire (c'est ce que j'ai fait au post 23.

Merci bonne journée. Je dois enfiler ma combinaison
 

patricktoulon

XLDnaute Barbatruc
oui bah il est en recherche de solution
c'est toujours le cafoutche quand on est en recherche

on avance on change en cours de route,on reviens ,etc
bon c'est vrai de temps en temps il faut nettoyer les vestiges des solutions avortées
la sur 2 lignes c'est pas grave

la ou je comprends pas cp4 c'est que je lui ai donné une solution rapide ,propre sans boucle (demo2)
et il la rejette sous prétexte d'utilisation de plage temporaire

c'est absurde; que font les tcd ou avanced filter ? ben la même chose
quand a Ado ou power query il utilise quoi? ben le clipboard comme je le fait dans ma demo1
 

patricktoulon

XLDnaute Barbatruc
@cp4 rng ca marche oui ok car quand on fait
machin=rng c'est comme si on faisait machin=rng.value
je te dis simplement que si jacques écourte ses codes ,toi en tant que débutant ne le fait pas
tu évitera les méprises dans l’apprentissage de la manipulation d'array

après travaillant sur des grosses bases perso j'ai abandonné toutes ses petites astuces pour Ado sur des fichiers fermés

qui sais peut être va tu nous trouver une solution
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…