OBLog

Bienvenue dans OBLog,  Visiteur

Lire les blogs auxquels vous êtes abonné(e) :

Excel     titres     4 messages
HTML pour débutants     titres     14 messages
Linux     titres     2 messages
Mode d'emploi de OBLog     titres     4 messages
Programmation en ASP     titres     15 messages

  • Si vous êtes membre de la communauté EPFL, vous pouvez contribuer à ces blogs en vous authentifiant
  • Les membres de l'IBETON peuvent créer leurs propres blogs et y inviter des membres de l'EPFL.

Contenu du blog Excel


Formules pour calculer l'angle dans un triangle (Eléments finis)  (OB 23.06.09, 12:03) 
O
   Voici deux fonctions (à utiliser ensemble) qui donnent l'angle dans un triangle tel qu'il et défini pour la méthode des éléments finis : liste des noeuds, puis séparément liste de la connectivité de chaque élément. Lorsque des erreurs se produisent dans la génération des réseaux, c'est très souvent des éléments qui n'ont pas une forme correcte, et finissent par être trop élancés. Cette fonction permet de calculer cela assez facilement.


Option Explicit

Function elementAngle(node1 As Integer, node2 As Integer, node3 As Integer, nodes As Range)
Dim posX1 As Double, posY1 As Double, posX2 As Double, posY2 As Double, posX3 As Double, posY3 As Double
Dim tmp
Dim scalProd As Double, norme1 As Double, norme2 As Double, angle As Double

tmp = trouveNoeud(node1, nodes, posX1, posY1)
If tmp = -1 Then MsgBox "Noeud " + node1 + " pas trouvé"
tmp = trouveNoeud(node2, nodes, posX2, posY2)
If tmp = -1 Then MsgBox "Noeud " + node2 + " pas trouvé"
tmp = trouveNoeud(node3, nodes, posX3, posY3)
If tmp = -1 Then MsgBox "Noeud " + node3 + " pas trouvé"

scalProd = (posX2 - posX1) * (posX3 - posX1) + (posY2 - posY1) * (posY3 - posY1)
norme1 = Sqr((posX2 - posX1) ^ 2 + (posY2 - posY1) ^ 2)
norme2 = Sqr((posX3 - posX1) ^ 2 + (posY3 - posY1) ^ 2)
angle = Abs((scalProd / (norme1 * norme2))) * 180 / 3.141592654

elementAngle = angle

End Function


Function trouveNoeud(node As Integer, nodes As Range, posX As Double, posY As Double)
Dim i As Integer
For i = 0 To nodes.Rows.Count
   If nodes.Cells(i + 1, 1) = node Then
      posX = nodes.Cells(i + 1, 2)
      posY = nodes.Cells(i + 1, 3)
      trouveNoeud = i
      Exit Function
   End If
Next
trouveNoeud = -1
End Function


Une macro pour "piquer" les données liées à un graphique  (OB 26.09.06, 16:55) 
O
   Il arrive qu'on prenne une série de graphiques dans plusieurs classeurs.
Quand il s'agit ensuite de retravailler ces figures, c'est embêtant car les données ne sont pas locales, et il est nécessaire d'ouvrir tous les classeurs en question. La petite macro ci-dessous va prendre toutes les données du graphique x-y sélectionné et les place à l'endroit que vous indiquez dans la feuille de calcul courante. C'est plus facile ensuite de retravailler ces données. Seules les valeurs (x et y) sont copiées, pas les formats.

Option Explicit

Sub GetGraphData()
'
' GetGraphData Macro
' Va chercher dans le classeur correspondant les données de la courbe sélectionnée
'

Dim n As Integer, s As String, i As Integer, j As Integer
Dim vals, r As Range, x(), y()
Dim startCell As String
Dim getIt As Integer, nomSerie As String

With ActiveChart.ChartGroups(1)
   For i = 1 To .SeriesCollection.Count
      s = .SeriesCollection(i).Formula
      s = Mid(s, InStr(s, "(") + 1)
      s = Left(s, InStrRev(s, ")") - 1)
      vals = Split(s, ",")
      If InStr(vals(0), "$") <> 0 Then
         nomSerie = Range(vals(0))
      Else
         nomSerie = vals(0)
      End If
      getIt = MsgBox("Désirez-vous prendre ces valeurs ?", vbYesNoCancel, "Série " & nomSerie)
      If getIt = vbYes Then
         RangeToVector Range(vals(1)), x()
         RangeToVector Range(vals(2)), y()
         startCell = InputBox("Cellule de départ", UBound(x) + 1 & " valeurs collectées")
         If startCell <> "" Then
            Set r = ActiveSheet.Range(startCell)
            r.Offset(0, 1) = nomSerie
            For j = 0 To UBound(x)
               r.Offset(j + 1, 0) = x(j)
               r.Offset(j + 1, 1) = y(j)
            Next
         End If
      End If
      If getIt = vbCancel Then Exit For
   Next
End With

End Sub

Sub RangeToVector(r As Range, arr())
Dim i As Integer, j As Integer, m As Integer, n As Integer
Dim maxCount As Integer
m = r.Rows.Count
n = r.Columns.Count
If m >= n Then 'vertical
   maxCount = m
Else
   maxCount = n
End If
ReDim arr(maxCount - 1)

For i = 0 To maxCount - 1
   If m >= n Then
      arr(i) = r.Cells(i + 1, 1).Value
   Else
      arr(i) = r.Cells(0, i).Value
   End If
Next
End Sub


Comment déprotéger une feuille ou un classeur ?  (OB 01.04.05, 09:27) 
O
   Bon, d'abord pourquoi la protéger ? Ce n'est pas souvent utile. S'il s'agit simplement d'empêcher des saisies au mauvais endroit, comme dans le feuille d'heures, un mot de passe blanc suffit amplement !

Bon, maintenant vous en avez quand même besoin... et ça existe (preuve qu'il était inutie de mettre un mot de passe puisqu'il ne sert à rien !). L'utilitaire Excel password Remover m'a bien aidé dans un cas où j'en avais vraiment besoin (une feuille reçue de l'extérieur dans laquelle je devais insérer une signature sous forme d'image, ce qui est impossible quand la feuille est protégée). Simplement exécuter le fichier password.xla puis utiliser les menus Outils - Unprotect sheet ou Outils - Unprotect workbook.

Ca prend un certain temps, environ une minute, et tout fonctionne !

La macro est aussi disponible sur Timo :
\\timo\is-beton\Burdet\Download\ExcelPasswordRemover

Deuxième système d'axes  (JLZ 10.02.05, 14:52) 
O
   Dans Excel on peut utiliser 2 systèmes d'axes (principal et secondaire) si l'on a plusieurs séries. Pour ce faire il faut sélectionner la série -> bouton droit
-> format de la série de données
-> sélection de l'axe

Lorsque l'on choisit 2 systèmes d'axes par défaut seul l'axe y est actif. Pour activer l'axe x ou les 2 il faut depuis le graphique: -> bouton droit
-> option du graphique
-> axe