Signaler

VBA, Propriété ou méthode non gérée par l'objet [Résolu]

Posez votre question zanzib 27Messages postés mardi 18 août 2015Date d'inscription 16 septembre 2016 Dernière intervention - Dernière réponse le 21 sept. 2015 à 14:59
Bonjour, je cherche à faire une macro me calculant l'angle entre 3 points selon des plages de coordonnées fournie par l'utilisateur.
Mais mon intputbox n'a pas l'air de fonctionner (le débogueur me renvoie: Erreur d'exécution '438': Propriété ou méthode non gérée par cet objet). Auriez vous une idée/solution?
Merci d'avance
Ci joint le code:
Sub angle()
Dim plageX1 As Range
Dim plageY1 As Range
Dim plageZ1 As Range
Dim plageX2 As Range
Dim plageY2 As Range
Dim plageZ2 As Range
Dim plageX3 As Range
Dim plageY3 As Range
Dim plageZ3 As Range
Dim CS As Workbook
Dim OS As Worksheet
Dim CD As Workbook
Dim OD As Worksheet

Dim Uabx As Range
Dim Uaby As Range
Dim Uabz As Range
Dim Ubcx As Range
Dim Ubcy As Range
Dim Ubcz As Range
Dim prodsca As Range
Dim Nuab As Range
Dim Nubc As Range
Dim Nabc As Range
Dim Cosabc As Range
Dim angle As Range

Set CS = ThisWorkbook
Set OS = CS.Sheets("Feuille2")
Workbooks.Add
Set CD = ActiveWorkbook
Sheets(Sheets.Count).Name = "CalculAngle"

OS.Activate
Set plageX1 = Application.intputbox(prompt:="X1", Type:=8)
Set plageY1 = Application.intputbox(prompt:="Y1", Type:=8)
Set plageZ1 = Application.intputbox(prompt:="Z1", Type:=8)
Set plageX2 = Application.intputbox(prompt:="X2", Type:=8)
Set plageY2 = Application.intputbox(prompt:="Y2", Type:=8)
Set plageZ2 = Application.intputbox(prompt:="Z2", Type:=8)
Set plageX3 = Application.intputbox(prompt:="X3", Type:=8)
Set plageY3 = Application.intputbox(prompt:="Y3", Type:=8)
Set plageZ3 = Application.intputbox(prompt:="Z3", Type:=8)

'calcul vecteur
Set Uabx = plageX2 - plageX1
Set Uaby = plageY2 - plageY1
Set Uabz = plageZ2 - plageZ1

Set Ubcx = plageX3 - plageX2
Set Ubcy = plageY3 - plageY2
Set Ubcz = plageZ3 - plageZ2

'produit scalaire
Set prodsca = plageX1 * plageX2 * plageX3 + plageY1 * plageY2 * plageY3 + plageZ1 * plageZ2 * plageZ3

'norme
Set Nuab = ((Uabx) ^ 2 + (Uaby) ^ 2 + (Uabz) ^ 2) ^ 1 / 2
Set Nubc = ((Ubcx) ^ 2 + (Ubcy) ^ 2 + (Ubcz) ^ 2) ^ 1 / 2
Set Nabc = ((Uabx + Uabc) ^ 2 + (Uaby + Ubcy) ^ 2 + (Uabz + Ubcz) ^ 2) ^ 1 / 2

'cos
Set Cosabc = prodsca / (Nuab * Nubc)

'youhou un angle
'Set angle = Arccos(Cosabc)

' graph
CD.Activate
Charts.Add
ActiveChart.ChartType = xlLine
ActiveChart.SetSourceData Source:=angle
ActiveChart.Location Where:=xlLocationAsObject, Name:="CalculAngle"
With ActiveChart
.HasTitle = False
.Axes(xlCategory, xlPrimary).HasTitle = False
.Axes(xlValue, xlPrimary).HasTitle = False
End With

End Sub
Afficher la suite 
Utile
+1
moins plus
Bonjout

Tite demo
Sub essai()
Dim plageX1 As Range
Set plageX1 = Application.InputBox(prompt:="X1", Default:="A1", Type:=8)
plageX1.Select
end sub


zanzib 27Messages postés mardi 18 août 2015Date d'inscription 16 septembre 2016 Dernière intervention - 15 sept. 2015 à 14:42
Merci, mais je ne comprend pas en quoi cela m'aide, votre démo marche sans le Default:="A1", et ma macro ne fonctionne pas plus avec ce paramètre supplémentaire.
Sinon ma déclaration et mon utilisation de plageX1 m'ont l'air en tous points identique.
Est ce qu'il y aurait une subtilité que je n'aurais pas compris dans votre demo?
Cordialement merci
Répondre
PlacageGranby 393Messages postés mercredi 26 mars 2014Date d'inscription 7 juin 2016 Dernière intervention - 15 sept. 2015 à 21:48
Bonjour,

Prendre la ligne de Michel_M
Prendre votre ligne de code,
Les copier-coller cote à cote :

Set plageX1 = Application.InputBox(prompt:="X1", Default:="A1", Type:=8)
Set plageX1 = Application.intputbox(prompt:="X1", Type:=8)

inputbox vs intputbox
Répondre
zanzib 27Messages postés mardi 18 août 2015Date d'inscription 16 septembre 2016 Dernière intervention - 16 sept. 2015 à 09:58
Je me sens terriblement bête, merci pour tous
Répondre
michel_m 13957Messages postés lundi 12 septembre 2005Date d'inscription ContributeurStatut 27 septembre 2016 Dernière intervention - 16 sept. 2015 à 10:24
Merci Placagegranby, je finissais par douter! ;o)

mais il est vrai que cette syntaxe est bizarre et en paume + d'un (j'ai trouvé dans un bouquin)
Répondre
zanzib 27Messages postés mardi 18 août 2015Date d'inscription 16 septembre 2016 Dernière intervention - 16 sept. 2015 à 10:46
J'ai une nouvelle question, Sur Set Uabx = plageX2 - plageX1, j'ai une erreur d'incompatibilité de type, est-ce du encore a une faute bete de ma part, ou l'opération est tous simplement impossible entre deux ranges (sachant que je peut avoir des valeurs négatives dans mes deux colonnes. Ou doit-je passer par un tableau ou autre? Merci
Répondre
Ajouter un commentaire
Utile
+1
moins plus
Re,

Uabx est défini comme range (il faut alors lui donner une adresse: XL ne connait pas les cellules SDF)

si tu cherche une valeur, définiS plutôt Uabx en tant que double ou integer ou long (méfie toi des types "single" dans les calculs) suivant
^m remarque pour les Nu... Ub... cos... etc
PlacageGranby 393Messages postés mercredi 26 mars 2014Date d'inscription 7 juin 2016 Dernière intervention - 17 sept. 2015 à 15:51
Re-Re-bonjour,

Dans le lien que j'ai donné, voir la section sur les tableau dynamique.



J'imagine qu'il faut que toutes les sélections ait le même nombre d'élément.
Il serait peut-être approprié de faire un test

Si quelqu'un se trompe dans la sélection.
Dim nbplage as integer  '// variable pour alléger le code
Dim Ubax() as long        '// Les parenthèse déclare l'objet comme étant un tableau

Set plageX1 = Application.inputbox(prompt:="X1", Type:=8)
nbplage = PlageX1.count  '// On assigne notre variable au nombre d'élément de PlageX1  
Set plageX2 = Application.inputbox(prompt:="X2", Type:=8)
If plagex2.count <> nbplage then  '// on valide qu'on a le même nombre d'élément
    msgbox "Erreur dans la selection de X2"   '// avertissement
    exit sub                                                        '// et on se fait sortir
end if

'// a faire pour les autres sélection

ReDim Uabx(nbplage)         '// redimensionne uabx selon notre nombre d'élément
For i = 1 to nbplage
    Ubax(i) = PlageX2(i) - Plagex1(i)
next


En passant, tu vas avoir peut-être beaucoup de plaisir avec produit scalaire et norme vu que tu auras besoin de boucles pour chaque calcul.

C'est une très très bonne initiation au tableau dans laquelle tu t'es lancé !!!
Répondre
zanzib 27Messages postés mardi 18 août 2015Date d'inscription 16 septembre 2016 Dernière intervention - 17 sept. 2015 à 16:21
Merci beaucoup je pense que j'ai tous ce qui me faut, je reviendrai posté la macro fini si sa peut aidé quelqu'un.
Encor merci pour votre temps
Bonne journée
Répondre
PlacageGranby 393Messages postés mercredi 26 mars 2014Date d'inscription 7 juin 2016 Dernière intervention - 17 sept. 2015 à 16:55
Mon exemple de validation pour le nombre d'élément n'était pas très raffinée.
Si on se trompe rendu à la dernière sélection, il faut tout recommencer.

Set PlageX1 = Application.InputBox(prompt:="X1", Type:=8)
nbplage = PlageX1.Count

Plageok = False
While Plageok = False
    Set PlageX2 = Application.InputBox(prompt:="X2", Type:=8)
    If PlageX2.Count = nbplage Then
        Plageok = True
    Else
        If MsgBox("Erreur dans la selection de X2", vbOKCancel) = vbCancel Then
            Exit Sub
        End If
    End If
Wend

Plageok = False   '// on réinitialise Plageok a false avant le prochain inputbox
While While Plageok = False
    Set PlageY1 ...........................  


Si PlageX2 n'a pas le même nombre d'élément que plageX1 on indique l'erreur.
Si on fait OK, alors on recommence la sélection, si on fait Cancel (on se rend compte que c'était PLagex1 qui était erroné), alors exit sub et on recommence tout.
Répondre
zanzib 27Messages postés mardi 18 août 2015Date d'inscription 16 septembre 2016 Dernière intervention - 21 sept. 2015 à 14:33
Merci la sélection de plage est nettement plus propre qu'en faisant un grand if.
Je cherche maintenant a copié mon tableau Cosabc dans une nouvelle feuille, mais je n'ai pas trouvé d'exemple permettant de le faire avec un tableau de taille variante (sans utilisé une plage de taille prédéfinie, aurait tu une idée? Merci pour tout.
Répondre
PlacageGranby 393Messages postés mercredi 26 mars 2014Date d'inscription 7 juin 2016 Dernière intervention - 21 sept. 2015 à 14:59
Re-Bonjour,

Voici la source de l'info
http://www.commentcamarche.net/faq/32220-vba-toutes-versions-detection-de-cellule-vide-ligne-colonne

Il est possible de déterminer dynamiquement la dernière ligne d'un tableau.
Et on réutilise notre variable dernligne pour copier le tableau

Dim DernLigne As Long
DernLigne = Range("A65536").End(xlUp).Row

Worksheets("Feuil2").Rows("1:" & DernLigne).Value = Worksheets("Feuil1").Rows("1:" & DernLigne).Value
Répondre
Ajouter un commentaire

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !