Recherche date dans une ligne

Bonjour amis du forum et bonne fêtes pères pour les français,

Bref qui pourrais m'écrire cette formule: (recherche la date la plus proche par rapport à "A1" dans la ligne 3; si la colonne est en f3 appliquer script D1, G3 appliquer D2 et ainsi de suite jusqu'à Q3 script D12)

Merci pour votre aide image ci dessous dans l'exemple la date est le 19/6/2022 et la plus proche est donc le 8/7/2022, le script D8 devrait ce lancer

image

Merci d'avance pour votre aide.

mbell

Bonsoir mbell, et merci, c'était ma fête aujourd'hui

Il manque quelques informations pour pouvoir répondre précisément à ta demande. Voici toutefois un bout de code qui permet de récupérer une variable (colonne_) qui contient le numéro de colonne sur laquelle tu vas pouvoir appliquer ton script

J'espère que cela t'aidera

sub recherche_date dans_ligne()
Dim colonne_ As Integer
Dim prochainedate
Dim écartdateA
Dim écartdateB

écartdateB = 1000   'attention de définir une valeur de comparaison > zéro
                    ' sinon la comparaison ne renvoie jamais rien

For colonne_ = 6 To 500
    ' je compare la date du jour à la date contenue dans la cellule
    écartdateA = Cells(3, colonne_).Value - range("A1").value
        ' si elle est supérieure ou égale à la date en A1 et inf ou égale à ma valeur de comparaison
        If écartdateA >= 0 And écartdateA <= écartdateB Then
            ' ma valeur B (plus petit écart de date) devient ma valeur A (sinon elle reste identique)
            écartdateB = écartdateA
            ' et donc la valeur colonne_ devient le numéro de colonne avec laquelle je veux travailler
            colonne_ = Cells(3, colonne_).column
         End If
Next ligne_

End Sub

Bonjour ZeCris et bonne fêtes,

le code ne fonctionne pas sous google sheets, dommage.

Merci pour ton aide.

mbell

Désolé, j'ai cru que c'était sur Excel. Je connais pas google sheets.

Je passe mon tour !

J'espère que tu trouveras

Une fonction ou un script ?

function rechercheDate() {
  const sh = SpreadsheetApp.getActiveSheet();
  const d = sh.getRange('A1').getValue().valueOf()
  let col = 0
  sh.getRange('F3:P3').getValues().flat().forEach((x, i) => {
    if (x.valueOf() <= d) col = i
  })
  return (col + 5 + 1)
}

Bonjour Steelson,

Quel est la différence entre un script et une fonction?

la recherche de la date en "A1"

image

doit permettre de masquer les colonne avant la colonne "M" puisque les date des colonne "J, k, L" sont dépassée.

Autre solution

mbell

C'est vrai c'est subtil, et tu as presque raison.

  • On appelle plutôt fonction, une fonction, que l'on met dans la feuille, comme =somme(___), voire une fonction customisée comme =sommeCouleur(_____) dans la mesure où elle est définie dans l'éditeur de script.
  • Le script est lui défini bien sûr dans l'éditeur de script mais se lance soit via l'éditeur, soit via la feuille mai lancé en automatique comme onOpen, onEdit, ou via un menu/bouton...

Quel est ton besoin ? De ce que je comprends via l'autre topic, tu souhaites que le masquage se fasse à l'ouverture ?

Un script alors pour mettre dans l'éditeur après le onOpen puisque quand on ouvre le fichier celui-ci se placera directement à l'endroit rechercher d'après la date en "A1"

function onOpen() {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var date = Utilities.formatDate(new Date(), "GMT", "dd/MM/yyyy"); // recherche la date
  spreadsheet.getRange("A1").setValue(date); // affiche en "A1" la date du jour 

  const ui = SpreadsheetApp.getUi(); // crée le menu admin uniquement
  ui.createMenu('⇩ AFGOLF ⇩')

    .addSubMenu(ui.createMenu('Admin')
      .addItem('⚠️ Création d une nouvelle saison ⚠️', 'Ns')
      .addItem('⚠️ Effacer les présences de cette saison ⚠️', 'Es')
      .addItem('⚠️ Protection de la feuille ⚠️', 'Ps'))
    .addItem('Afficher tous les événements', 'Rn')
    .addSubMenu(ui.createMenu('Choix d un événements')
      .addItem('🏌 1 Événement 🏌', 'D1')
      .addItem('🏌 2 Événement 🏌', 'D2')
      .addItem('🏌 3 Événement 🏌', 'D3')
      .addItem('🏌 4 Événement 🏌', 'D4')
      .addItem('🏌 5 Événement 🏌', 'D5')
      .addItem('🏌 6 Événement 🏌', 'D6')
      .addItem('🏌 7 Événement 🏌', 'D7')
      .addItem('🏌 8 Événement 🏌', 'D8')
      .addItem('🏌 9 Événement 🏌', 'D9')
      .addItem('🏌 10 Événement 🏌', 'D10')
      .addItem('🏌 11 Événement 🏌', 'D11')
      .addItem('🏌 12 Événement 🏌', 'D12'))
    // .addSeparator()
    .addSubMenu(ui.createMenu('Différents tri')
      .addItem('👉 Groupe 👈', 'Gp')
      .addItem('👉 Handicap 👈', 'HCP')
      .addItem('👉 Présences total 👈', 'Pt'))
    //  .addSeparator()

    .addToUi();

    var fonction = 'D' + (+rechercheDate() - 5)
    this[fonction]()

}

function onEdit(e) {
   Browser.msgBox(rechercheDate())
  if (e.range.getColumn() == rechercheDate() && e.range.getRow() >= 5 && e.range.getRow() <= 85) {
    var fonction = 'D' + (+e.range.getColumn() - 5)
    this[fonction]()
  }
}

function rechercheDate() {
  const sh = SpreadsheetApp.getActiveSheet();
  const d = sh.getRange('A1').getValue().valueOf()
  let col = 0
  sh.getRange('F3:P3').getValues().flat().forEach((x, i) => {
    if (x.valueOf() <= d) col = i
  })
  return (col + 5 + 1)
}

Re:

Je deviens lourd

J'ai bien copié le code à la bonne place mais chaque fois que je rentre une donnée surprise:

image

Au début je croyais que c'était la faute aux case non remplie, mais même toutes remplies j'ai le même box

image

je suis sur une formule sur la quelle je reviendrais sur le forum car le code ne fonctionne pas mais une chose à la fois, le code au cas ou l'erreur viendrais de là:

function Ns() 

   {

    const ui = SpreadsheetApp.getUi();
    const response = ui.alert('⚠️ Création d une nouvelle saison? ⚠️', ui.ButtonSet.YES_NO);

     if (response == ui.Button.NO) {
      return;
    }

 var spreadsheet = SpreadsheetApp.getActive();
 // spreadsheet.getRange('F5').activate();
   Rn();
  spreadsheet.duplicateActiveSheet(); // duplique une feuille la dernière de prédérence
   spreadsheet.getActiveSheet().setName('.');
  spreadsheet.getRange('F2:Q3').activate();
  spreadsheet.getActiveRangeList().clear({contentsOnly: true, skipFilteredRows: true}); // vide les deux premières ligne

  spreadsheet.getRange('F5:Q65').activate();
  spreadsheet.setCurrentCell(spreadsheet.getRange('Q5'));
  spreadsheet.getActiveRangeList().clear({contentsOnly: true, skipFilteredRows: true}); // Efface les "Absence et Présence" des joueurs

  spreadsheet.getRange('F71:Q85').activate();
  spreadsheet.getActiveRangeList().clear({contentsOnly: true, skipFilteredRows: true}); // Efface les "Absence et Présence" des coach

 { // donne le nom à la feuille

  const ui = SpreadsheetApp.getUi();
  const resultat = ui.prompt('Année de la nouvelle feuille', ' ' , ui.ButtonSet.OK_CANCEL);
  const texte = resultat.getResponseText();

   // if (texte != '' && resultat.getSelectedButton() == ui.Button.OK)

   SpreadsheetApp.getActive().getSheetByName('.').setName('test ', + texte);

  // renameSheet(' ', 'Entrainement paragolf', + texte);
   {
    SpreadsheetApp.getUi().alert('Feuille crée: Entrainement paragolf ','', + texte);
   spreadsheet.getActiveSheet().setName('Entrainement paragolf ', +texte);// insert son nom
   spreadsheet.getActiveSheet().setTabColor('#0000ff');
   spreadsheet.moveActiveSheet(1);
  }
}
  Ps()
  var protection = spreadsheet.getActiveSheet().protect();
  protection.setUnprotectedRanges([spreadsheet.getRange('F5:Q65'), spreadsheet.getRange('F71:Q85')]); // protége la feuille

   spreadsheet.getRange('F2').activate(); // se place en F2

      }

mon problème se situe entre 2467 et 2478 et voici l'erreur reportée.

image

Mais si ce n'est pas le code qui crée la première erreur n'en tien pas compte actuellement.

De plus la bonne colonne d'après la date en A1 ne se met place pas du tout.

Merci pour ta patiene Steelson

mbell

En effet, supprime cette ligne (c'était pour bien m'assurer que cela fonctionnait)

   Browser.msgBox(rechercheDate())

Voilà pour la colonne c'est super, par contre par rapport à la date en A1 rien ne ce fait même en allant dans l Extensions, Apps Script et exécuter "rechercheDate"

un erreur trouvée sur onEdit

image

Alors soit le script ne fonctionne que sur la macro "D6" mais pas avec les autres "D", donc en lançant la macro onEdit avec la colonne "M" elle fonctionne mais le fait avec la colonne "K"

un erreur trouvée sur onEdit

image

cette erreur n'existe pas

il ne faut pas lancer un script onEdit à partir de l'éditeur de script

ce script se lance automatiquement quand on modifie une valeur

voici mon fichier test https://docs.google.com/spreadsheets/d/1bvW60ECcffU-ug3Q9uGMFuStx879vFQNxL3mHL-07-0/copy

j'ai juste remplacé le début de onOpen par une fonction =today() dans la page

Totalement d'accord avec toi formule plus simple mais étant le 20 juin 2022 pourquoi trie t'il sur le 7 juin 2022 et non sur la date suivante qui est le 8 juillet 2022.

image

En fait le but de la date est de pouvoir masquer les journée déjà passé et n'afficher que les dates suivante pour pouvoir trier la date la plus proche de la date en A1, car si on veut trier une autre colonne il y a les macros du menu.

J'ai peut être été dur à exprimer mais besoin désolé Steelson

mbell

Je pense avoir trouvé

function rechercheDate() {
  const sh = SpreadsheetApp.getActiveSheet();
  const d = sh.getRange('A1').getValue().valueOf()
  let col = 0
  sh.getRange('F3:P3').getValues().flat().forEach((x, i) => {
    if (x.valueOf() <= d) col = i
  })
  return (col + 5 + 2)
} 

Dans return (col + 5 + 1 ) j'y ai mis "2" et ca à l'aire de fonctionner

Merci Steelson

mbell

Autant pour moi, je n'avais pas compris

Bonne correction !

Rechercher des sujets similaires à "recherche date ligne"