Fichel Excel avec Macro à mettre sur le drive google
Bonjour,
On vient de me proposer un fichier excel avec des macros pour compter les points pour un tournoi qui est trés bien.
Mais j'aimerais le mettre sur mon drive pour le faire en ligne et hors connexion.
Pourriez-vous m'aider svp ?
Merci d'avance pour votre aide.
Cordialement
Jérôme
Bonjour,
C'est une question google sheets ou Excel ?
Bonjour,
C'est une question google sheets. La macro fonctionne déja sur Excel.
Merci pour votre aide
Cordialement,
Jérôme
Bonjour,
Proposition de traduction vers AppScript (via IA), dites-moi si cela vous convient/fonctionne comme prévu. Pour info la partie double-clic sur une cellule n'est pas traduisible dans GoogleSheets, un tel "évènement" n'existe pas.
Le lancement des macros se fait depuis un nouveau menu "Scores" dans le ruban (fermer et rouvrir le fichier dans google sheets après avoir ajouté ce code pour le voir apparaitre).
/**
* Ajoute un menu "Scores" dans la feuille pour lancer les scripts.
*/
function onOpen() {
SpreadsheetApp.getUi()
.createMenu('Scores')
.addItem('Réinitialiser les scores', 'reinitScore')
.addItem('Recalculer & trier le classement', 'classement')
.addItem('Effacer les équipes', 'effacerEquipes')
.addToUi();
}
/** ====== Utilitaires ====== **/
/**
* Retourne la feuille "Feuil1" ou lève une erreur s'il n'y en a pas.
*/
function getFeuille() {
const sh = SpreadsheetApp.getActive().getSheetByName('Feuil1');
if (!sh) throw new Error('La feuille "Feuil1" est introuvable.');
return sh;
}
/**
* Renvoie le dernier numéro de ligne non vide dans la colonne A (comme DerLig en VBA).
* Si aucune donnée sous l’entête, renvoie 4.
*/
function getDerniereLigneColA(sh) {
const lastRowSheet = sh.getLastRow();
if (lastRowSheet <= 4) return 4;
const values = sh.getRange(1, 1, lastRowSheet, 1).getValues(); // A1:A(lastRowSheet)
for (let r = lastRowSheet; r >= 5; r--) {
if (values[r - 1][0] !== '' && values[r - 1][0] !== null) return r;
}
return 4;
}
/**
* Certains paramètres régionaux (fr-FR) utilisent ';' au lieu de ',' comme séparateur d’arguments.
* On adapte automatiquement.
*/
function argSep() {
const loc = SpreadsheetApp.getActive().getSpreadsheetLocale() || '';
return loc.toLowerCase().startsWith('fr') ? ';' : ',';
}
/** ====== Traductions des macros ====== **/
/**
* VBA: Sub Reinit_Score()
* - Confirmation
* - Efface C5:E[DerLig]
* - Réécrit les formules en F et G (G utilisant la plage fixe F5:F24 comme en VBA)
*/
function reinitScore() {
const ui = SpreadsheetApp.getUi();
const res = ui.alert(
'Scores à 0',
'Êtes-vous sûr de vouloir réinitialiser les scores ?',
ui.ButtonSet.YES_NO
);
if (res !== ui.Button.YES) return;
const sh = getFeuille();
const DerLig = getDerniereLigneColA(sh);
const sep = argSep();
// Effacer C:E des lignes 5..DerLig
if (DerLig > 4) {
sh.getRange(5, 3, DerLig - 4, 3).clearContent(); // C5:E[DerLig]
}
// Réécriture des formules en F et G pour 5..DerLig (si au moins une ligne de données)
if (DerLig > 4) {
// Colonne F (Total) : =IF(RC[-4]="","",SUM(RC[-3]:RC[-1]))
const fFormula = `=IF(RC[-4]=""${sep}""${sep}SUM(RC[-3]:RC[-1]))`;
sh.getRange(5, 6, DerLig - 4, 1).setFormulaR1C1(fFormula);
// Colonne G (Classement) : =IF(RC[-5]="","",RANK(RC[-1],R5C6:R24C6))
// NOTE : plage fixe F5:F24 pour coller au VBA
const gFormula = `=IF(RC[-5]=""${sep}""${sep}RANK(RC[-1]${sep}R5C6:R24C6))`;
sh.getRange(5, 7, DerLig - 4, 1).setFormulaR1C1(gFormula);
}
sh.setActiveSelection('B4');
}
/**
* VBA: Sub Classement()
* - Réécrit les formules en F et G
* - Trie B5:G[DerLig] par G (ascendant)
* - Sélectionne B4
*/
function classement() {
const sh = getFeuille();
const DerLig = getDerniereLigneColA(sh);
const sep = argSep();
if (DerLig <= 4) {
sh.setActiveSelection('B4');
return;
}
// Réécriture F/G sur 5..DerLig (identique à Reinit_Score)
const fFormula = `=IF(RC[-4]=""${sep}""${sep}SUM(RC[-3]:RC[-1]))`;
sh.getRange(5, 6, DerLig - 4, 1).setFormulaR1C1(fFormula);
// NOTE : plage fixe F5:F24 pour coller exactement au VBA
const gFormula = `=IF(RC[-5]=""${sep}""${sep}RANK(RC[-1]${sep}R5C6:R24C6))`;
sh.getRange(5, 7, DerLig - 4, 1).setFormulaR1C1(gFormula);
// Tri B5:G[DerLig] par colonne G (colonne 7 dans la feuille), ascendant.
// On exclut l’entête (ligne 4), d’où le début à la ligne 5 (équivalent "Header = xlYes").
const sortRange = sh.getRange(5, 2, DerLig - 4, 6); // B5:G[DerLig]
sortRange.sort([{ column: 7, ascending: true }]); // tri par G
sh.setActiveSelection('B4');
}
/**
* VBA: Sub Effacer_Equipes()
* - Confirmation
* - Efface B5:E[DerLig]
*/
function effacerEquipes() {
const ui = SpreadsheetApp.getUi();
const res = ui.alert(
'Effacer les équipes',
'Êtes-vous sûr de vouloir effacer les équipes ?',
ui.ButtonSet.YES_NO
);
if (res !== ui.Button.YES) return;
const sh = getFeuille();
const DerLig = getDerniereLigneColA(sh);
if (DerLig > 4) {
sh.getRange(5, 2, DerLig - 4, 4).clearContent(); // B5:E[DerLig]
}
sh.setActiveSelection('B4');
}Bonjour Jérome
A tester
https://docs.google.com/spreadsheets/d/1epUaQX6pfN7oAcJ6H9GKUPU9z-p2plPVzkxnXlXDkL8/edit?usp=sharing
Crdlt
Bonjour,
Merci à tous les 2 pour vos propositions.
Je vais tester cela.
Bonne fin de journée.
Cordialement
Jérôme.