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,

Merci à tous les 2 pour vos propositions.

Je vais tester cela.

Bonne fin de journée.

Cordialement

Jérôme.

Rechercher des sujets similaires à "fichel macro mettre drive google"