Erreur d'import avec Importrange

Bonjour,

Aïe qui n'a rien à voir mais peut-être cet incident sera expliqué : j'avais commencé un post, je suis allé chercher un texte pour le coller mais pas pu retrouver mon message, alors je recommence

Voici la situation :

J'ai un classeur A avec une feuille que je nommerai F1 (Educateur rose dans la macro)

J'ai un autre classeur B avec une feuille que j'appelle ici F2

Je travaille sur le classeur A qui est étendu à 2000 lignes actuellement

Je mets à jour le classeur B lorsque je le désire (actuellement à 2000 lignes mais auparavant moins - peut-être 950 ?)

Pour cela j'ai créé la macro ci-dessous

function MAJ_ParAuteur() {
  var spreadsheet = SpreadsheetApp.getActive();
  spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Educateur Rose'), true);
  spreadsheet.getRange('3:2000').activate();
  TriNomEtDate();
  spreadsheet.getRange('A3:G2000').activate();
  spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Par auteur'), true);
  spreadsheet.getRange('A3').activate();
  spreadsheet.getRange('\'Educateur Rose\'!A3:G2000').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
  spreadsheet.getRange('A3').activate();
  spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Educateur Rose'), true);
  TriNomEtDate();
  spreadsheet.getRange('C1').activate();
};

Lorsque la F1 contenait moins de 900 lignes (peut-être jusqu'à 950 ?) la macro fonctionnait parfaitement et j'avais bien le même nombre de lignes sur la F2 que sur la F1

Mais depuis qu'il y a plus de 950 lignes sur la F1, la F2 est toujours arrêtée à 950 !

Je n'arrive pas à débloquer ce 950.

Provient-il d'une ancienne limite ?

Si c'est cela comment débloquer ?

J'ai cherché dans format de la page mais rien sur le nombre de lignes

Merci pour toute aide

Cordialement

INFM

PS : Noter que je précise la limite de la zone par ce 2000 car je n'ai pas trouvé comment définir une zone avec une variable correspondant au nombre de lignes (en utilisant NBVAL - pas réussi à l'introduire dans la définition de zone)

Re-bjr,

"Re" parce que nous avons déja résolu la sélection variable dans un autre post (offset).

Ici le souci est plus subtil.

Il faudrait savoir le contenu de ce qui est copié de F1 à F2.

Est-ce qu'il y a des appels à des fonctions écrites en gScript ?

Psk gSheets se bloque après 1000 appels d'une fonction, par une une sorte de protection contre un usage abusif.

Pour contourner, il faut tout faire en formules, ou écrire des fonctions matricielles qui traitent d'un coup toute une range, ou faire les copier/coller par tranches, ou...

Aussi, comme je le disais dans notre autre fil, il faudrait faire ces manips sur des variables, sans activate :

function MAJ_ParAuteur() {
var spreadsheet = SpreadsheetApp.getActive();
//sourcesheet 
ss = spreadsheet.getSheetByName('Educateur Rose');
// targetsheet
ts = spreadsheet.getSheetByName('Par auteur');
// Plage variable avec la magie de offset + copy/paste
ss.getRange("A3").offset(0,0, NbLignes ,7).copyTo(ts.getRange("A3"), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
// Tri (un seul suffit)
TriNomEtDate();
ts.getRange('A3').activate();
}

ça peut peut-être éviter la limitation.

Bon tests. Je suis l'affaire si besoin.

EMX

Bonjour Exacel

Je viens de lire ta proposition de macro

Pas encore essayé mais je veux ici apporter une information que je viens de découvrir.

J'essaie d'être aussi clair que possible :

je travaille sur deux classeurs différents

je veux importer les données de la plage A3 : G2000 du premier classeur

vers le second classeur au même endroit A3:G2000

j'avais construit la macro il y a quelque temps et cela fonctionnait parfaitement

Je n'ai pas modifié cette macro

Cela a fonctionné tant que j'avais moins de 900 lignes

puis incomplètement

je vérifiais en modifiant une cellule de la ligne 3

elle était bien modifiée lorsque je lançais la macro

mais les dernières lignes après la 950 n'étaient pas transmises

et ce jour je viens de m'apercevoir que sur mon premier classeur était créée une feuille avec ce même nom "Par auteur"

je ne l'ai pas créée et je ne pense pas qu'elle ait été créée par un collaborateur car je suis le seul qui travaille sur les macros

et quand je lance la macro c'est cette feuille qui est mise à jour

Je viens de la renommer pour voir

et effectivement sans cette feuille la macro provoque une erreur

notons à l'occasion que les erreurs signalées dans les macros ne sont pas explicites ! le clic sur détails n'apporte rien !

En étudiant les macros je ne vois pas comment on indique cette modification de classeur

et pourtant au début cela marchait !

alors je ne pige pas !

comment donc préciser que je colle sur un autre classeur que celui où je prends les données ?

je vais maintenant essayer avec la macro que tu proposes

mais je devrais avoir le même souci

J'essaie maintenant.

Merci et à plus tard

Re- Bonjour

J'ai essayé avec nouvelle macro (tiens la langue ici doit être l'anglais car tout est souligné ! Pas grave !)

function MAJ4_ParAuteur() {
var spreadsheet = SpreadsheetApp.getActive();
//sourcesheet 
ss = spreadsheet.getSheetByName('Educateur Rose');
// targetsheet
ts = spreadsheet.getSheetByName('Par auteur');
// Plage variable avec la magie de offset + copy/paste
//var nbLignes ='NBVAL(C:C)-2';
ss.getRange("A3").offset(0,0, 1500 ,7).copyTo(ts.getRange("A3"), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
// Tri (un seul suffit)
TriNomEtDate();
ts.getRange('A3').activate();
}

Un premier essai sans la ligne var=nbLignes erreur nbLignes non défini : Normal !

Alors j'ajoute cette ligne mais erreur encore

au fait quand je ne mettais pas les cotes pour NBVAL j'avais erreur sur cette ligne lors de l'enregistrement !

écriture mauvaise de cette ligne var nbLignes ?

J'ai donc mis en attente cette ligne

et remplacé la variable par 1500

et encore erreur lorsque je lance la macro :

TypeError: Cannot call method "getRange" of null.Détails Ignorer

Je n'avance pas beaucoup.

Toujours une erreur quelque part

et mon problème reste : comment j'indique que je ne copie pas sur le classeur lui même mais sur un autre ?

Serait-il nécessaire que le nom de la feuille destinataire n'existe pas dans le classeur d'origine ?

Ah, une précision : Le tri par auteur sur le classeur d'origine est toujours refait à la fin parce que j'ai la même macro avec variantes bien sûr pour d'autres MAJ (Par département, par numéro ...)

Mais je veux qu'à la fin le classeur d'origine soit toujours reclassé par auteur (demande d'une collaboratrice)

A suivre

merci !

INFM

RE-RE-bonjour

Eh bien j'ai réussi à refaire fonctionner mes macros !

Mais ce n'est pas en les modifiant !

simplement en modifiant la valeur inscrite sur la cellule A3 de la feuille destinataire

Je dis bien : pas de modif de la macro elle -même

Ce que j'ai fait (tout en sachant que ce n'est pas l'idéal, pas le plus pro !)

- Le problème je le rappelle était que la feuille destinataire (du second classeur) s'arrêtait à la ligne 950

- j'avais bien étendu la taille de la feuille à 2000 mais cela ne changeait rien

- je ne trouvais pas où pouvait être défini ce 950

- et puis presque par hasard j'ai trouvé ! Eurêka !

- ce 950 ce trouve sur une formule en cellule A3 de la feuille destinataire

- évidemment on ne la voit pas directement. Seulement en cliquant sur cette cellule

- on y voit la formule : =IMPORTRANGE (U1;"Par auteur!A3:G950")

- cette formule avait été créée lors de la création de la macro mais moi je ne l'avais pas vue !

- j'ai remplacé ce 950 par 2000 et aussitôt la feuille s'est mise à jour

- il faut toutefois que sur le classeur principal les feuilles correspondantes aient été présentes (on peut les cacher )

J'insiste :

- ça fonctionne correctement mais ...

- ce n'est pas parfait car je suis obligé d'indiquer la limite basse sur la feuille destinataire

- je ne vois pas comment indiquer la variable nbLignes dans cette formule

- peut-être déclarer cette variable dans la macro ?

- mais comment ?

- mes premiers essais ont été infructueux

- j'essaierai ànouveau plus tard

- il doit y avoir une écriture plus professionnelle !

Voici le texte de ma première macro (donc sans les modifications avec OFFSET )

function MAJ_ParAuteur() {
  var spreadsheet = SpreadsheetApp.getActive();
  spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Educateur Rose'), true);
  spreadsheet.getRange('3:2000').activate();
  TriNomEtDate();
  spreadsheet.getRange('A3:G2000').activate();
  spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Par auteur'), true);
  spreadsheet.getRange('A3').activate();
  spreadsheet.getRange('\'Educateur Rose\'!A3:G2000').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
  spreadsheet.getRange('A3').activate();
  spreadsheet.setActiveSheet(spreadsheet.getSheetByName('Educateur Rose'), true);
  TriNomEtDate();
  spreadsheet.getRange('C1').activate();
};

Le fameux 950 qui me limitait les lignes sur la feuille destinataire n'est donc pas là.

Sans doute ma feuille à l'origine était-elle à 950 lors de la création de la macro !

Maintenant que je le sais je pourrai étendre si besoin mais ce n'est pas une programmation sérieuse.

En attendant mieux !!!

Et merci pour toute aide bien entendu

Je ne clos pas cette question car il y aura j'espère des améliorations.

A suivre

Et mes excuses pour ce message si long mais pas possible d'expliquer totalement sans ces détails

INFM

Bon, très bien. Ravi que ça fonctionne.

Ce serait tellement plus efficace d'avoir le fichier exemple que d'essayer de tracker des bugs avec la moitié des infos.

D'autant qu'avec Sheets, c'est facile de partager, lecrture seule suffit.

Je ne sais plus où nous en sommes : Copie par macro, Appel par importrange ?

Il reste au moins à implémenter offset pour limiter la plage copiée ou importée.

L'essentiel a déja été dit sur ce point.

Sauf le "nbLignes", qui n'était pas la solution mais une indication.

Pour avoir une variable nbLignes exploitable dans une macro,

il faut :

ou la calculer dans une cellule dispo avec une NBVAL() ou autre, puis "getter sa value" depuis le script,

ou la déterminer directement en script, avec une fonction comme ça :

function CountRows(inRange){
var data = inRange[][0].getValues();
for (var ir = data.length-1 ; ir >=0 ; i--){
    if (data[i] != null && data[i] !=''){
       return i+1 ;
    }
  }
}

NB : c'est une idée vite faite, non testée, nécessitera adaptation ou debug

C'est comme la simplification du code, la suppression des activate(), il faut "rentrer dedans pour s'en sortir" !

A prochaine...

EMX

Merci Exacel, encore pour ces propositions.

Pour un ou deux jours j'arrête de chercher car j'ai une autre urgence

Je reviens dès que possible et indiquerai l'adresse pour la macro

A+

INFM

Rechercher des sujets similaires à "erreur import importrange"