Affichage des articles dont le libellé est excel. Afficher tous les articles
Affichage des articles dont le libellé est excel. Afficher tous les articles

lundi 28 juillet 2014

Excel : les heures décimales

Il vous est probablement déjà arrivé d'effectuer un calcul qui vous renvoie un nombre d'heures sous forme décimale.

Par exemple vous souhaitez vider une piscine qui contient 1000 litres d'eau, votre évacuation permet d'évacuer 500 litres/heure. Vous allez réaliser le petit calcul 1000 / 500 = 0,5 heures soit 0h30 minutes.

Le problème est que vous ne savez pas quoi faire avec ce 0.5... tout le monde sait que ça représente 1/2 heure, mais dans Excel ça coince...

Une heure décimale n'est pas un numéro de série

Si vous avez un peu fouillé dans les fonctions Excel vous êtes probablement tombés sur les fonctions Heure() et Minute(), et vous aurez constaté qu'elles prennent en paramètre un numéro de série.

Ce que Microsoft appelle un numéro de série est tout simplement une représentation décimale d'une journée : 24h00 = 1.

La formule pour transformer une heure décimale en numéro de série est donc : heure / 24

Ainsi la fonction Minute() va s'utiliser ainsi :

Cool... sauf que ce n'est pas ce que nous recherchons... refaite l'essai avec 1.75 (soit 1h45)...

Les fonctions Heure() et Minute()

Contrairement à ce que beaucoup d'utilisateurs pensent les fonctions Heure() et Minute() ne vont pas afficher une heure sous la forme hh:mm. Ces fonctions sont prévues pour renvoyer soit l'heure, soit les minutes, d'une heure exprimée sous la forme hh:mm.

Ainsi pour une valeur de 1.75 la fonction Heure() va nous renvoyer 1 :

Et Minute() nous donnera 45.

Bon OK, avec un Concatener() il serait possible d'obtenir un affichage sous la forme 01h45, mais avouez que ça serait un peu lourd :

Le format de cellule "Heure"

Et oui... vous étiez tellement plongé dans vos formules que vous en avez oublié la simplicité.

Pour transformer votre 1.75 en 01:45 il vous suffit de le diviser par 24 pour ramener cette valeur en jours, et de vous rendre dans le menu "Format de cellule". Sélectionnez "Heure" dans la liste... et c'est tout !



Calculs d'angles avec Excel

Beaucoup d'utilisateurs sont décontenancés par le fait qu'Excel ne gère pas les angles en degrés, mais en radians.


Convertir les degrés en radians avec Excel

Toutes les fonctions relatives aux angles dans Excel prennent en paramètre des angles exprimés en radians :
Cos, Sin, Tan,...

Pour convertir vos angles en degrés vers des radians la formule est : Angle * Pi() / 180

Rassurez-vous Microsoft a pensé à tout et à inclus dans Excel une fonction toute prête : RADIANS()

Ce qui donne dans Excel (pour un angle de 45°) :

Convertir les radians en degrés avec Excel

En toute logique les résultats fournis par Excel sont eux aussi exprimés en radians.

Pour convertir vos angles en radians vers des degrés la formule est : Angle * 180 / Pi()

Là encore Excel vous propose une fonction toute prête : DEGRES()

Son utilisation est la suivante :





jeudi 9 décembre 2010

Importer des champs Word dans Excel

Vous avez réalisé un formulaire sous Word ? Parfait... mais en toute logique vous n'avez pas envie de ressaisir tous les résultats dans Excel pour en tirer des statistiques.

Le petit boût de code VBA ci-dessous pourra vous aider. Ajoutez le dans une macro Excel et il vous permettra de copier le contenu de tous les champs de votre formulaire Word vers Excel. Sur la première ligne vous retrouverez le nom de vos champs Word.

Sub ImportWord()

Dim Wd As Word.Application
Dim filename As String
Dim i As Byte
    
    
    'On affiche la boite de dialogue pour sélectionner le fichier
    filename = Application.GetOpenFilename("Fichier Word (*.doc*),*.doc*", 1, "Sélectionnez un document Word", "Ouvrir", False)
    
    'On vérifie qu'un fichier a été sélectionné
    If filename <> "" Then
        filename = LCase(filename)
        'et qu'il s'agit d'un document word
        If Right(filename, 3) = "doc" Or Right(filename, 4) = "docx" Then
    
            'Créer une instance de word
            Set Wd = New Word.Application
            
            With Wd
                'Empêche Word de s'afficher à l'ouverture
                .Visible = False
                
                'Ouverture du document
                .documents.Open (filename)
                
                'Parcours de la collection de champs
                Dim f As Field
                For Each f In .ActiveDocument.Fields
                    'Nom du champs
                    Cells(1, f.Index).Value = .ActiveDocument.FormFields(f.Index).Name
                    
                    'Valeur du champs si case à cocher
                    If f.Type = 71 Then
                        Cells(2, f.Index).Value = .ActiveDocument.FormFields(f.Index).CheckBox.Value
                    Else 'autres champs
                        Cells(2, f.Index).Value = f.Result.Text
                    End If
                Next
                
                'Ferme le document Word
                .Quit False
            End With
            
            'Destruction de l'objet word
            Set Wd = Nothing
        End If
    End If

End Sub

lundi 29 mars 2010

Comment utiliser Automation avec Excel et VB.NET ?

Préparatifs

Pour pouvoir piloter Excel, vous devez ajouter à votre projet une référence à Microsoft Excel Object Library (dans les composants COM) ou référencer directement les Primary Interop Assemblies (PIA) : Microsoft.Office.Interop.Excel.dll, Microsoft.VBE.Interop.dll, et Office.dll

Dans cet exemple j’utiliserai la seconde solution.

A propos des Primary Interop Assemblies

Bien que Microsoft recommande d’utiliser une version des PIA correspondant à la version d’Office installée conjointement avec votre application, j’ai constaté qu’il existe une bonne compatibilité ascendante entre ces assemblies. J’ai donc pris pour habitude d’utiliser une vieille version de ces PIA, celles de Office XP. Elles ont l’avantage de permettre à mes applicatifs de fonctionner sur toutes les versions d’Office de XP à 2007.

Vous pouvez télécharger ces assemblies sur le site de Microsoft :
http://www.microsoft.com/downloads/details.aspx?FamilyId=C41BD61E-3060-4F71-A6B4-01FEBA508E52&displaylang=en

Si vous préférez utiliser les PIA installées avec Office sur votre poste, souvenez vous simplement qu’elles ne fonctionneront pas si vos utilisateurs utilisent une version plus ancienne.

Les bases de l’automation Excel

Création et assignation de l’objet Excel

Dim XlApp As Microsoft.Office.Interop.Excel.Application = New Microsoft.Office.Interop.Excel.Application()



Création d’un classeur

Dim XLDestBook As Microsoft.Office.Interop.Excel.Workbook
XLDestBook = XlApp.Workbooks.Add


Ouverture d’un classeur existant

XLDestBook = XlApp.Workbooks.Open("c:\monfichier.xls")

Ajouter une feuille

Dim xlSheet As Microsoft.Office.Interop.Excel.Worksheet
xlSheet = XLDestBook.Worksheets.Add

Ajouter du texte dans une cellule

xlSheet.Cells(1, 2).value = "Test écriture dans cellule B1"

Ajouter une formule dans une cellule

xlSheet.Cells(1, 3).formula = "=1+5"

Les formules doivent être écrites dans la langue d’Excel. Si vos utilisateurs sont susceptibles d’utiliser des versions d’Excel dans différentes langues vous devrez donc traduire vos formules. Pour cela vous pouvez utiliser cette référence http://cherbe.free.fr/fonctions_XL.ZIP

Recommandations

Prenez l’habitude avant tout traitement d’automation de désactiver le rafraichissement d’écran d’Excel, et d’empêcher les saisies utilisateur. Les performances en seront largement améliorées, et cela évitera que vos utilisateurs ne viennent perturber le traitement.

Pour cela utilisez les lignes suivantes avant tout traitement :

XlApp.ScreenUpdating = False
XlApp.Interactive = False

Repassez ces paramètres à True lorsque vos traitements sont achevés, sinon Excel sera inutilisable.

Pour plus d’infos vous pouvez vous référer à la base de connaissance Microsoft : http://support.microsoft.com/kb/301982/fr


Attention à la langue

Si vous avez des utilisateurs utilisant une version anglaise de Windows, il y a de fortes chances pour que votre application plante avec un message : Error: 0x80028018 (-2147647512) - Description: Old Format or Invalid Type Library

Ce cas de figure se produit lorsque l’utilisateur a personnalisé les paramètres régionaux de Windows. C’est un cas que j’ai régulièrement rencontré avec les expatriés. Ils sélectionnent dans les paramètres régionaux leur pays de résidence, et modifient le séparateur décimal et l’unité monétaire pour les faire correspondre à ceux de leur pays d’origine.

La base de connaissance Microsoft vous donnera plus de détails sur ce problème : http://support.microsoft.com/?scid=kb%3Ben-us%3B320369&x=19&y=18

Pour le contourner, 2 solutions :
• Demander à vos utilisateurs de ne pas personnaliser les paramètres régionaux. Pas toujours possible.
• Avant toute opération d’automation Excel modifier la culture du système en « en-US », et surtout restaurer les paramètres utilisateurs lorsque vos traitements sont terminés.

La base de connaissance peut une nouvelle fois vous aider : http://support.microsoft.com/kb/914356/fr

Personnellement j’utilise le code suivant (dérivé des exemples MS) :

'Sauvegarde le réglage de culture
Dim oldCI As System.Globalization.CultureInfo = System.Threading.Thread.CurrentThread.CurrentCulture

''' 
''' Modifie la culture en "en-US".
''' 
''' 
Sub ChangeCulture()
Dim LangueExcel As Integer 'code correspondant à la langue Excel
Dim RegionalString As String 'Equivalence entre la langue Excel et la culture système

LangueExcel = XlApp.LanguageSettings.LanguageID(Microsoft.Office.Core.MsoAppLanguageID.msoLanguageIDInstall) 'Récupére le code correspondant à la langue d'Excel
Select Case LangueExcel
Case 1033 : RegionalString = "en-US" 'Anglais USA
Case 1036 : RegionalString = "fr-FR" 'Français FRANCE
Case Else : RegionalString = "en-US" 'Anglais USA
End Select
System.Threading.Thread.CurrentThread.CurrentCulture = New System.Globalization.CultureInfo(RegionalString)
End Sub


''' 
''' Rétablit la culture d'origine du système
''' 
''' 
Sub RestoreCulture()
System.Threading.Thread.CurrentThread.CurrentCulture = oldCI
End Sub