Obtenir des Informations sur le Fuseau horaire en VBA (Excel)
Je tiens à déterminer un décalage horaire de GMT/UTC (y compris l'heure d'été) pour différents pays à une date spécifique dans VBA. Des idées?
MODIFIER (à partir de l'auto-réponse):
Merci 0xA3. J'ai rapidement lu sur la page liée. Je suppose que vous ne pouvez obtenir le décalage GMT pour le local où windows est en cours d'exécution:
ConvertLocalToGMT
DaylightTime
GetLocalTimeFromGMT
LocalOffsetFromGMT
SystemTimeToVBTime
LocalOffsetFromGMT
En Java, vous pouvez effectuer les opérations suivantes:
TimeZone bucharestTimeZone = TimeZone.getTimeZone("Europe/Bucharest");
bucharestTimeZone.getOffset(new Date().getTime());
Calendar nowInBucharest = Calendar.getInstance(TimeZone.getTimeZone("Europe/Bucharest"));
nowInBucharest.setTime(new Date());
System.out.println("Bucharest: " + nowInBucharest.get(Calendar.HOUR) + ":" + nowInBucharest.get(Calendar.MINUTE));
Cela signifie que je peux obtenir le décalage de différents pays (fuseaux horaires) et j'ai donc pouvez également obtenir le temps réel permet de dire à bucarest. Puis-je le faire en VBA?
Vous devez vous connecter pour publier un commentaire.
VBA n'offre pas de fonctions pour le faire, mais l'API Windows ne. Heureusement, vous pouvez utiliser toutes ces fonctionnalités à partir de VBA ainsi. Cette page explique comment faire: Les fuseaux Horaires & Heure d'été
Edit: Ajout D'Un Code
Pour la postérité souci, j'ai ajouté le code complet de Gourou de la Puce de la page, comme utilisable en 32 bits d'Office VBA. (64-bit de modification ici)
Voici le code qui est référencé dans la réponse 0xA3. J'ai dû changer de déclarer des instructions pour lui permettre de fonctionner correctement dans le Bureau de 64 bits, mais je n'ai pas pu tester à nouveau dans le Bureau de 32 bits. Pour mon utilisation j'ai essayé de créer la norme ISO 8601 dates avec les informations de fuseau horaire. J'ai donc utilisé cette fonction pour cela.
Le code ci-dessous est venue de http://www.cpearson.com/excel/TimeZoneAndDaylightTime.aspx
S'il vous plaît être conscient de petit piège dans la solution.
La GetTimeZoneInformation() qui retourne l'heure d'été d'infos sur le heure actuelle, mais les convertis date peut-être de la période avec les différents paramètre d'heure d'été - ainsi, la conversion de date de janvier au mois d'août devrait appliquer le courant de Polarisation, ce qui donne la date GMT 1 heure de moins que la bonne (fonction systemtimetotzspecificlocaltime semble être un meilleur ajustement - non testé encore)
La même chose s'applique lorsque la date est à partir d'un an - quand règles d'heure d'été auraient été différentes. GetTimeZoneInformationForYear doit gérer les changements dans les différentes années. Je vais mettre un exemple de code ici une fois terminé.
Il semble aussi Windows ne fournit pas un moyen fiable pour obtenir 3 lettre de l'abréviation du fuseau horaire (Excel 2013 prend en charge zzz dans le Format() - non testé).
Modifier 16.04.2015: IntArrayToString() supprimée car elle est déjà présente dans modWorksheetFunctions.bas référencé ci-dessous mentionnés cpearson.com articles.
Ajout de code pour convertir en utilisant le fuseau horaire active au moment de la conversion de la date (ce problème n'est pas réglé sur cpearson.com). Gestion des erreurs n'est pas inclus pour des raisons de concision.
Il y a 2 façons de parvenir à décalage:
soustraction et la date locales converti gmt date:
offset = (lpDateLocal - lpDateGmt)*24*60
obtenir TZI pour l'année donnée et calculer:
dst = GetTimeZoneInformationForYear(Year(lpDateLocal), lpDTZI, lpTZI)
offset = lpTZI.Bias + IIf(lpDateLocal >= SystemTimeToSerialTime(lpTZI.DaylightDate) And lpDateLocal < SystemTimeToSerialTime(lpTZI.StandardDate), lpTZI.DaylightBias, lpTZI.StandardBias)
Mise en garde: Pour une raison quelconque, les valeurs renseignées dans lpTZI ici ne contiennent pas les informations de l'année, de sorte que vous devez régler l'année en lpTZI.DaylightDate et lpTZI.StandardDate.
Je vous recommande de créer un objet Outlook et utiliser la méthode ConvertTime: https://msdn.microsoft.com/VBA/Outlook-VBA/articles/timezones-converttime-method-outlook
Super facile, super enregistrer et seulement quelques lignes de code
PS: si vous avez souvent à utiliser la méthode, je vous recommande de déclarer les Perspectives d'objet à l'extérieur de votre sub/function. Créer une fois et de le maintenir en vie.
TimeZone
de l'objet pour la 2d et la 3d paramètres, pas une chaîne de caractères.Set OutlookApp = GetObject(,"Outlook.Application")
éviter le chargement d'une autre instance de microsoft OutlookBasé sur Julian Hess excellente recommandation pour utiliser Outlook capacités, j'ai construire ce module, qui travaille avec Access et Excel.
GetOutLook
fonction pourrait simplement utiliserSet oOutl = CreateObject("Outlook.Application")
- une seule instance d'Outlook peuvent être ouvertes en même temps, donc dans ce casCreateObject
récupère l'objet si il est déjà ouvert.... juste eu à trouver de la documentation à l'arrière de ma demande jusqu'à maintenant.