Activer des onglets en fonction de leur valeur numérique

Bonsoir tt le monde,

J'aimerais savoir s'il était possible de faire un code pour activer 2 onglets parmi une trentaine en fonction de leur valeur numérique ?

Exemple : en données d'entrée j'ai 0.6667 0.83333 et mes onglets ont les noms suivants : -1 1 ; 0.35 0.66 ; 1 1. Je voudrais activer en fait les deux onglets les plus proches qui encadrent mes données d'entrée pour ensuite faire des calculs dans ces onglets sélectionnés.

Donc là je voudrais activer l'onglet 0.35 0.66 et 1 1.

Est-ce que quelqu'un aurait une idée svp ? Peut-on activer un onglet s'il n'est pas sous forme de texte ?

Par avance merci pour votre aide !

PS : je mets un exemple excel en PJ

25test.xlsx (10.92 Ko)

bonjour,

Le nom d'un onglet est toujours un texte même s'il contient exclusivement des caractères numériques.

C'est en général plutôt une mauvaise idée de baptiser des feuilles ainsi surtout avec des nombres entiers : En effet VBA va tenter une auto-conversion en integer pour cibler un Index. Naturellement ça va planter le système car la feuille nommée 1 à rarement l'index 1.

Ce n'est pas ton cas puisque tu as toujours au moins un espace qui parasiterait une tentative d'auto-conversion, mais on peut toujours se laisser piéger...

Cependant au prix d'acrobaties multiples on peux arriver à bâtir une fonction personnalisée qui va déterminer quelle feuille tu dois activer. Je ne m'y amuserai pas (mais c'est très faisable...)!

Attention toutefois au moment de l'activation, c'est bien des String que tu envoies

Worksheets(1 1).Activate ' produit une erreur il faut écrire :
Worksheets("1 1").Activate

On peut sélecter ou activer plusieurs feuilles (sous forme de groupe de travail).

Sheets(Array("0,35 0,66", "1 1")).Select

Mais je ne vois pas bien ton intention : Les 2 feuilles étant sélectées ou/et activées toute modification de l'une va entrainer une modification de l'autre... Tu aura donc la nécessité de les désectionner en cliquant sur une autre feuille pour pouvoir ensuite travailler sur les feuilles ciblées.

Si j'ai bien compris ton intention il me semble que tu aurais plutôt intérêt à colorer tes onglets en rouge par exemple plutôt que les sélectionner :

Sheets("0,35 0,66").Tab.Color = 255
Sheets("1 1").Tab.Color = 255

et l'antidote :

Sheets("1 1").Tab.ColorIndex = xlNone
Sheets("0,35 0,66").Tab.ColorIndex = xlNone

A+

Bonjour,

pour 0.83333, pourquoi choisir plus "1 1" que "-1 1" qui répond tout autant aux impératifs ? Et même mieux puisqu'il entre dans la fourchette indiquée.

Toi tu le sais d'instinct, excel il lui faut une règle mathématique.

As-tu toujours uniquement ces 3 feuilles ou c'est juste un exemple ?

eric

Bonjour,

A mon avis le Macro n'est pas nécessaire, la résolution de ce problème est faisable par les formules. Mais il faut clarifier deux points.

1 - Comment ou par rapport à quel critère on va decider d'utiliser 1.1 ou -1.1

2 - Supposons que l'on a réalisé l'interpolation pour a (48) et b (12) dans l'onglet ( 0,35 0,66) et que l'on a trouvé le résultat comme 0,12864. Et d'autre interpolation est faite dans l'onglet 1.1 et on a touvé un resultat comme 0,16513.

Comment on devra réaliser l'interpolation finale en fonction de c/b , d/b , resultat No.1 (0,12864) et resultat No.2 (0,16513). Est-ce que vous pouvez le faire manuellement.. (Je crois qu'il manque un autre critère intermediaire)

cdlt..

une autre question supplementaire...

quelles sont les intervalles de a , b , c , d...

exemple : est-ce possible de mettre les chiffres comme suivants

a : 200

b : -11

c : 8,24

d : -500,15

cdlt..

Merci pour vos réponses.

@galopin01 : Je n'ai pas compris "En effet VBA va tenter une auto-conversion en integer pour cibler un Index", que signifie cibler un index ? (désolé je débute en VBA donc j'ai du mal)

En fait, je voudrais extraire des valeurs dans les 2 feuilles sélectionnées pour les renvoyer vers mon 1er onglet qui me servira de feuille principale où il y a mes données d'entrée et mes résultats finaux.

@eriiic : Non j'ai une trentaine de feuilles à la suite.

"pour 0.83333, pourquoi choisir plus "1 1" que "-1 1" " ? : en fait je veux que l'encadrement soit le plus restrictif possible.

exemple : 0.35 < 0.667 < 1 et 0.66 < 0.833 < 1 donc -1 < 0.667 < 1 est bon encadrement mais pas le plus restrictif. En quelque sorte je veux que la valeur absolue de la différence soit la plus petite possible entre le nb encadré et les encadrants.

@sakman 26 : En effet, je me suis aussi demandé s'il ne valait pas mieux lister les onglets sous forme de tableau à 2 colonnes pour ensuite faire les opérations mathématiques.

Concernant les valeurs des a b c d, ce sont des angles :

  • a varie de -90° à 90
  • b de 5 à 50
  • c de 0 à 45
  • d de -90 à 90.

Pour la dernière interpolation linéaire, il faut la représenter selon x,y,z. Les deux interpolations trouvées précédemment sont selon z. c/b suivant x et d/b suivant y.

en 1), je calcule la pente de la droite p = (interpolation 2 - interpolation 1) / ((racine(x2²+y2²)-(racine(x1²+y1²)) (pour mieux voir le truc il faut projeter la droite dans le plan x y)

en 2) je calcule le z correspondant à x =0.6667 et y = 0.8333

Encore deux petites questions sur des macros :

- j'ai fait une macro qui ajoute en dernier un onglet en copiant le précédent puis qui me demande d'entrée une date. Cette date est ensuite "envoyée" sur la case par exemple A1. Cependant après, j'aimerais que la macro puisse renommer le dernier onglet ajouté avec la date de la case A1 et je n'y arrive pas ... Quelqu'un sait-il comment faire ?

Sheets("02/06/2016 (2)").Select

Sheets("02/06/2016 (2)").Name = "Range("A1")" 'c'est ici que ça bloque ... comment lui dire d'aller prendre le texte de la case A1 ?

End Sub

- est-ce possible de faire une macro pour importer automatiquement des données à partir de fichiers qui sont rangés dans un dossier dans mon ordinateur (avec tjrs un nom du type : name_00/00/0000) ? comme ça dès que j'ajoute le fichier dans mon dossier, j'ai juste à ouvrir mon fichier excel résultat et appuyer sur un bouton pour qu'il me copie des matrices du fichier source vers mon fichier résultat. Les onglets (source et résultats) ont tt le temps la même organisation.

Merci par avance !

Bon dimanche

rien, erreur...

bonjour,

suite à vos explications j'ai encore qq. questions.

1 - les resultats d'interpolation peuvent etre NEGATIF. Parce que si les valeurs de a plus de 60 le reultat sera NEGATIF. Pour le b la meme chose. Suivant 1.1 ou -1.1 à partir d'une certain valeur le resultat sera NEGATIF.

2 - Autrement dit, Pour la détermination de 1.1 ou -1.1 est-ce qu'on peut dire b est toujours POSITIF , c est toujours POSITIF est donc c/d est toujours POSIOTIF ( donc +1).. Par contre, quand le d est POSITIF d/b sera POSITIF (donc +1 est tableau 1.1) . quand le d est NEGATIF d/b sera NEGATIF (donc -1 et le tableau -1.1)

3 - J'ai bien compris le calcul de pente p. avec l'utilisation de formule ( sauf les significations . x1 , x2 , y1 et y2 correspondent à quelles valeurs) . Je n'ai pas compris que comment on pourra trouver le z.

4 - J'avais commencé à préparer un document calculé par les formules (sans utiliser le macro). Suite aux dernieres explications je pourrai completer ce document. Mais si vous desirez la solution avec le macro , je pense de ne pas le completer.

cdlt.

Bonjour,

Avec VBA il y a plusieurs manières de "cibler" une feuille.

Tu peux écrire

Worksheets("Feuil1"). Activate

ou

Worksheets(1).Activate

Dans le dernier cas 1 est l'index de la feuille. (Le N° d'ordre de la feuille dans l'ordre de leur création)

Si le nom de ta feuille ressemble à un nombre Entier, Excel (ou plutôt VBA) va comprendre qu'on lui communique un index donc tenter de sélectionner un index qui potentiellement n'existe pas...

De plus il existe un certain nombre de restriction dans le nommage de tes feuilles. Parmi ces restrictions, tu ne peux utiliser les caractères :

\ ? * [ ' : ] /

...donc si tu veux utiliser une date il faut la formater d'une manière ne comportant pas de /

A+

Re-bonjour,

@sakman26,

les valeurs de l'interpolation sont tjrs positives en effet, les valeurs rentrées dans le tableur sont tt le temps positives ou nulles (partie blanche dans mon tableur)

exemple : pour la sheet -1 1, on teste avec b=7.5° et a=52.5°.

On calcule l'interpolation pour b=7.5° et pour a= 55° soit I1 = 0.155/2

pareil pour b=7.5° et pour b = 50°, on obtient I2

maintenant on a donc deux valeurs i1 = intersection de b=7.5° et a=55°

i2 = intersection de b=7.5° et a=50°

On calcule mnt l'interpolation pour a=52.5° soit :

1) calcul de la pente : p= (i2-i1)/(55-50)

2) calcul de i3 = i1 + p*(52.5-50)

en conséquence toutes les valeurs des interpolations sont positives ou nulles, cependant on peut avoir i1>i2 ou inversement.

pour les signes des variables on a :

  • a de -90° à 90
  • b de 5 à 50
  • c de 0 à 45
  • d de -90 à 90

3-

on a : c/b suivant x et d/b suivant y

exemple : pour les onglets (0.35 0.66) et (1 1)

donc x1 correspond à la valeur 0.35 et y1 = 0.66 puis x2=1 et y2 =1.

Merci pour ton aide c'est sympa !

Je vais de finir ça demain, cependant le plus dur me semble être la vba ...

Désolé Galopin01 je viens de faire l'édition j'espère que c'est comme tu souhaitais.

Merci Galopin01 pour les infos concernant la syntaxe, j'ai bien compris mnt l'index.

Je reste bloqué sur ma macro ...

Sub add_sheetcopy()

    i = ActiveWorkbook.Sheets.Count
    Sheets(i).Select
    Sheets(i).Copy After:=Sheets(i+1) 
    End Sub 

Est-ce qu'on peut mettre i+1 de cette façon ?

J'obtiens normalement une copie de la sheet(i) et cette copie vient s'ajouter en position i+1

Sub ask_date()  'on demande de rentrer à l'utilisateur la date sur la feuille i+1
  Dim dat As String
  dat = InputBox("Taper la date", "Date de l'onglet", "Date")
  Range("A1") = Range("A1") & dat 
  Sheets(i+1).Name = Range("A1")
End Sub

la date s'affiche à la case A1 et on renomme la sheet(i+1) nouvellement créée par la date qu'on a rentré au format 00.00.0000

Sub extract_data() 'macro pour extraire une matrice d'un fichier excel présent dans un dossier C:

'là je voudrais ouvrir le fichier excel qui est nommé ***_00.00.0000 correspondant à la date rentrée dans la macro précédente

    Workbooks.Open Filename:="C:\Documents and Settings\***\Mes documents\dossier\ ***_  "& Sheets(i+1).Name" .xls"
    Range("A3:B4").Select
    Selection.Copy
    Windows("Test.xlsm").Activate 
    Range("A11").Select
    ActiveSheet.Paste
End Sub

je ne pense pas avoir tout compris pour l'histoire des guillemets pour le texte et les variables dans ton exemple.

ça colle la matrice extraite depuis le fichier vers ma sheet i+1 nommée 00.00.0000

Par avance merci !

Bonne soirée

PS : vous pensez qu'un livre c'est bien pour apprendre à maitriser la vba et les macros ? ou ce n'est pas nécessaire ?

Bonsoir,

Quand tu passes du code dans ta réponse tu es prié de l'encadrer avec la balise code. Merci d'éditer ta précédente réponse et d'encadrer chaque macro par ces balises.

Les livres c'est comme une partition de musique si tu joues faux la partition ne sert à rien...

Un string est un string :

Si tu passe un string comme ça :

"C:\Documents and Settings\***\Mes documents\dossier\name_sheets(i+1).Name.xls"

VBA cherche a faire quelque chose avec ton string... Il faut mettre entre guillemet ce qui est du texte (le chemin par exemple...) et ensuite ce qui est la partie variable et (s'il y a lieu) le complément de texte nécessaire et concaténer le tout....

Par exemple ça peut donner quelque chose dans ce genre....

"C:\Documents and Settings\***\Mes documents\dossier\" & name_sheets(i+1) & ".Name.xls"

Je ne peux pas te dire exactement car je ne distingue pas bien la partie texte de la partie variable dans ton string.

A+

Bonjour,

voir la pièce en jointe pour les calculs.

bon courage..

13yooop-01.xlsx (16.71 Ko)

Bonjour sakman26, merci bcp pour le fichier.

J'ai regardé rapidement les fonctions etc, je m'y repenche dessus ce week-end (il y a une ou 2 fonctions que je ne connaissais pas) et j'essaye d'avancer sur les hypothèses.

Merci,

Rechercher des sujets similaires à "activer onglets fonction leur valeur numerique"