Classement hôtelier Carte interactive de France

Pierre,

j'ai relu tes explications relatives à l'échelle et latitude et longitude et toutes mes tentatives sont vaines car je n'arrive pas à trouver le rapport de proportionnalité des latitude et longitude par rapport à l'échelle.

existe t'il une table ?

sinon, l'échelle qui me convient en termes de lisibilité pour la carte de l'Ille de France est 12.

selon toi, que dois je mettre en latitude et longitude ?

merci beaucoup

Rebecca

Hola, c'est la panique!?

Avec ces valeurs, sur mon écran ça me parait correct :

latitude0 = 49.35
longitude0 = -1.2
Echelle = 12

Pas de table, mais avec GoogleMap c'est simple d'obtenir un repère GPS

Pierre

hello Pierre,

tu me sauves la vie ! j'étais déjà sur le rebord de la fenêtre...

à force de tâtonner j'ai fini par trouver une position et un format acceptables, mais je vais saisir tes coordonnées qui sont sans coup férir plus scientifiques que les miens.

Last but not least...

- je ne parviens pas à réduire la taille des caractères ni changer la police des noms de villes et du binôme (nb d’hôtels, nb de chambres). Je suis allée en Mode Création, cliqué droit sur les champs, mais quand je redessine la carte, la police initiale réapparaît.

et enfin, comment puis je faire pour que la table Data reste inaccessible, mais vraiment inaccessible aux utilisateurs à qui je vais envoyer ces 2 cartes ?

merci beaucoup

Rebecca

Ok Rebecca, le bord de fenêtre c'est bien aussi, il fait beau, soleil, air de la mer, ...

Et rassure toi, pour coder tout ça, j'ai dû férir plusieurs coups avant

Bon, reprenons par une rectification : le mode développeur c'est uniquement pour modifier la police des 2 listbox/pseudo checkbox

Pour la police des noms des villes sur la carte :

* Alt+F11

* Module Graphe

* Procédure Dessin_ville, vers la fin ajouter la ligne suivante : .Font.Name = "Comic Sans MS", soit dans le contexte :

     .Text = T(idx, 2) & vbCrLf & " (H:" & T(idx, 4) & ", Ch:" & T(idx, 5) & ")"
     .Font.Size = 12
     .Font.Name = "Comic Sans MS"
end with

dans laquelle tu remplaces le "Comic" par le nom de la police que tu veux.

Au passage tu peux régler la taille 12 avec ce que tu veux

Pour cacher l'onglet Data :

* Alt+F11

* tu copies/colles le code suivant dans un des modules existants :

Sub Rebecca_Only()
    Sheets("Data").Visible = xlVeryHidden
End Sub

* tu reviens sur la carte

* Alt+F8

* Executer "Rebecca_Only"

* Alt+F11, le retour

* tu effaces les 3 lignes de codes

Pour faire l'opération inverse, il suffira d'écrire et d'exécuter de la même manière :

Sub Rebecca_Only()
    Sheets("Data").Visible = true
End Sub

C'est pas sécure à 100%, mais ça limite quand même bien pour ceux-qui-savent-pas-le-truc

Pierre

bonsoir Pierre,

je suis parvenue à tout faire : changer la police, la taille de caractères, sur la carte, dans les list box ! Franchement tu peux être fier de ton élève !! Elle est humble, tu vois ! (rire) mais a encore besoin d'un conseil.

- quand les hotels sont placés dans des villes qui sont limitrophes, les point rouges s'entrechoquent tout comme les textes. Ca fait de gros "patés". Tu aurais une idée pour mieux agencer les textes ?

par ailleurs, il semble que tu aies mis une limite au nombre de lignes pouvant figurer dans la fenetre de chaque ville. Je me trompe ? où puis je enlever cette limite ?

enfin où puis je trouver le code d'affichage du texte dans les fenêtres ? j'aimerais aussi changer la police et la taille de police.

merci encore

Rebecca

Salut Rebecca,

T'es trop douée, total respect.

Pour le soucis des villes limitrophes, tu peux essayer de voir si le message "Ville, nb hôtels, nb chbres" mis sur une seule ligne ne serait pas mieux, pour ça il suffit d'effacer le saut de ligne vbcrlf :

* Module Graphe

* Procédure Dessin_ville :

With .TextFrame2.TextRange.Characters
    .Text = T(idx, 2) & " (H:" & T(idx, 4) & ", Ch:" & T(idx, 5) & ")"

On peut aussi peut être adapter le diamètre des points rouges, les 2 valeurs 12 ici peuvent être à 8 ou 6 peut être (même procédure, plus haut):

Set sh = Sheets("Carte").Shapes.AddShape(msoShapeOval, longitude, latitude, 12, 12)

Pour les dimensions de la zone de texte contenant cette info, il suffit d'ajuster à sa convenance, par exemple :

* Module Graphe

* Procédure Dessin_ville :

Set sh = Sheets("Carte").Shapes.AddTextbox(msoTextOrientationHorizontal, _
          longitude - 0, latitude - 15, 300, 40)

Ici 300 correspond à la largeur de la zone de texte et 40 à sa hauteur

En augmentant la hauteur, on augmente le nb de lignes possibles

Enfin pour la fenêtre d'info s'affichant au clic sur une ville, c'est un "messagebox" (Module "Commun", procédure "USF", le code est succinct : MsgBox S, , code

Pour personnaliser le message, soit on passe par les API de windows, soit on se construit un userform à taille proportionnelle au contenu du message, avec les couleurs, les polices, la déco, ... qu'on peut choisir à sa guise.

La bonne question à se poser : est-ce que ça vaut la peine de remplacer une ligne de code simple (MsgBox S, , code) par tout un tas de fatras de code qui risque d'apporter son lot de bugs?

Tu aura compris tout de suite mon point de vue, en matière de déco dans excel je suis plutôt proche du style minimaliste que du style rococo

Maintenant chacun fait ce qu'il lui plait ...

Bonne journée

Pierre

hello Pierre,

tu as mille fois raison : je vais conserver la MsgBox "as is".

j'ai commencé à montrer l'outil et je n'ai eu que des satisfecits.

une seule requête cependant : comment faire pour que sur la carte on puisse distinguer certaines marques des autres ?

Pourrait-on par exemple avoir un ShapeOval de deux couleurs ? ou alors non pas un oval mais un rectangle ?

merci

myriam

Au niveau du code on pourrait dessiner la forme que l'on veux, genre enseigne1=rond rouge, enseigne2=ovale vert, enseigne3=carré bleu, ...

En revanche si dans une même ville on a la présence de plusieurs enseignes, comment fait-on?

Et pour rappel, dans le code actuel : un rond rouge=une ville (et non =une enseigne)

Pierre

Pierre,

gardons notre principe de 1 rond = 1 ville

mais si dans cette ville, il y a les marques A, B ou C, faisons ce rond bleu

c'est possible ?

merci

Rebecca

Ben oui, c'est possible.

Sur la carte quelque part, on crée une liste de "Favoris". Par exemple on saisit en A5:Accord, en A6:Ibis et en A7:Formule1 (en fait les valeurs que tu veux), avec évidement une belle entête colorée + un cadre + fanfreluches façon Louis XVI ou genre Philippe Stark si tu veux faire plus joli.

Maintenant, allons dans le code du module Sql.

Tout au début, après "Option explicit" on crée une constante :

Public Const Favoris = "A5:A7"    ' ou autre référence si tu écris les 'favoris' ailleurs

Plus loin la fonction Get_list devient :

Function Get_List(Clss As String, Ensg As String) As Variant()
Dim T_Favoris As Variant, H As String, i As Byte

    Req = "SELECT MAX(code), Zone_géo, Geo_Point, COUNT(Ville_Hôtel), SUM(Chbres) "

    T_Favoris = Sheets("Carte").Range(Favoris).Value    
    H = ",(0"
    For i = 1 To UBound(T_Favoris, 1)
        H = H & "+CInt(Enseigne='" & T_Favoris(i, 1) & "')"
    Next i
    H = H & ")"

    Req = Req & H & " FROM [Data$] WHERE NOT ISNULL(Classement)"

    If Not Clss = "" Then Req = Req & " AND (" & Clss & ")"
    If Not Ensg = "" Then Req = Req & " AND (" & Ensg & ")"

    Req = Req & " GROUP BY Zone_géo, Geo_Point" & H

    If Sql.Query(Req, 1) > 0 Then Get_List = Application.Transpose(Rcd) _
    Else Get_List = Array("")

End Function

Tu l'aura compris, on requête simplement en plus une valeur 0 ou -1 si un des favoris est dans l'enregistrement lu

Ensuite dans le module Graphe/procédure dessin_ville, juste après longitude=..., on remplace par :

Set sh = Sheets("Carte").Shapes.AddShape(msoShapeOval, longitude, latitude, 6, 6) '  ligne existante
With sh '  ligne existante
    .Name = "_" & T(idx, 2) '  ligne existante
    .Fill.ForeColor.RGB = IIf(T(idx, 6) = 0, RGB(250, 0, 0), RGB(0, 0, 250))  ' <= MODIF

En fait on demande une coloration rouge ou bleu en fonction du 0 ou du -1 requêté précedemment

De cette façon, les villes contenant au moins un des favoris seront colorées en bleu, les autres en rouge.

Avec cette méthode, ça reste facile de modifier la liste des favoris sur l'onglet 'carte', et il suffira de modifier la référence "A5:A7" (ici dans l'exemple) si on veut plus ou moins de favoris

Est-ce que ça convient?

Pierre

bonjour Pierre,

j'ai corrigé tout le code et les points bleus sont bien apparus sur la carte. Magique !!

Mais...

- certains points restent rouges alors qu'il y a une des marques favorites dans cette ville.

j'ai remarqué que la couleur de la ville peut changer en fonction de la sélection des étoiles : si je n'en sélectionne aucun, alors la ville reste rouge. Et si je sélectionne un classement, le point change de couleur si dans cette ville il y a un hôtel ayant ce classement.

Mais ceci ne se vérifie pas pour toutes les villes. Certaines villes restent rouges quand aucun classement n'est sélectionné, alors qu'il contient des marques favorites.

Comment faire pour que le point reste bleu quel que soit le classement sélectionné ?

- dans certaines fenêtres, les hotels s'affichent en double. Tu m'as dit de veiller à la qualité des datas.

j'ai bien vérifié la feuille Data : il n'y pas de lignes en double.

Y a t'il d'autres choses à vérifier ?

merci Pierre

Rebecca

Bonjour Rebecca,

Avec mes quelques données fictives de test, je ne constate pas ces effets.

Pourrais-tu me transmettre ton fichier (je te donne mon email par MP) pour que je puisse comprendre l'anomalie et la corriger?

Te remerciant

Pierre

En effet, un oubli, il fallait écrire :

Function Get_List(Clss As String, Ensg As String) As Variant()
Dim T_Favoris As Variant, H As String, i As Byte

    Req = "SELECT max(code), Zone_géo, Geo_Point, COUNT(Ville_Hôtel), SUM(Chbres) "

    T_Favoris = Sheets("Carte").Range(Favoris).Value
    H = ",SUM(0"
    For i = 1 To UBound(T_Favoris, 1)
        H = H & "+CInt(Enseigne='" & T_Favoris(i, 1) & "')"
    Next i
    H = H & ")"

    Req = Req & H & " FROM [Data$] WHERE NOT ISNULL(Classement)"

    If Not Clss = "" Then Req = Req & " AND (" & Clss & ")"
    If Not Ensg = "" Then Req = Req & " AND (" & Ensg & ")"

    Req = Req & " GROUP BY Zone_géo, Geo_Point"

    If Sql.Query(Req, 1) > 0 Then Get_List = Application.Transpose(Rcd) _
    Else Get_List = Array("")

End Function

(et réponse plus complète par mail)

Pierre

Bonjour à tous,

Pour ceux que ça intéresse, voici une version plus développée de la carte des "Résidences de tourisme classées en Île-de-France"

A noter :

* Le cahier des charges est de Rebecca => voir le fil de discussion.

* les données "opendata" proviennent de data.iledefrance.fr (ce ne sont pas les données professionnelles de Rebecca)

* les points GPS proviennent de GoogleMap et de public.opendatasoft.com

En bref :

* Chaque point = une ville

* Chaque indication = Ville, nb d'hôtel(s), nb de chambres

* A gauche : listes pour sélection selon classement et/ou selon enseigne

* A gauche également : liste de 3 "Enseignes favorites" => point rouge si au moins 1 favoris est dans la ville et selon la sélection

* Clic sur point/ville ou indication => ouvre une fenêtre listant les établissements

* Dans la fenêtre d'information, filtre possible sur enseignes et classement

Pour adapter la carte à la France entière (ou autre pays), il suffit de changer le jeu de data (cf les sites opendata) et d'adapter l'échelle, la latitude0 et la longitude0 (module Graphe)

Pierre

Rechercher des sujets similaires à "classement hotelier carte interactive france"