Convertir coordonnées cylindriques en cartésienne

Bonjour à tous,

J'ai actuellement un acquisition de données pour un scanner 3D piloté par un Arduino.

But : Avoir une macro qui m'écrit des valeurs automatiquement les unes en-dessous des autres en fonction des données collectés.

Mes compétences de programmation en Arduino ne me permettent pas de coder le fait qu'il me renvois les valeurs de Z et teta (voir détails ci-dessous).

Voici mes paramètres :

Teta : Mon objet tourne à 360° avec un pas de 1.8° (360°/200 positions).

Z : Ma valeur de Z augmente de 0.05mm par rotation.

Chaque rotation est délimités par la valeur 9999.00; le reste des valeurs sont comprisent entre 0 et 20.

R : Les valeurs de 0 à 20 me donne le rayon R.

Données

Mon arduino me renvois uniquement les valeurs de R les unes en dessous des autres comme dans le fichier TXT ci-joint.

Z est déduit par le nombre de fois que la valeur 9999.00 apparaît.

Teta est déduit par chaque retour à la ligne.

Conditions initiales :

Teta = 0°

Z = 0 mm

R = Première valeur calculé.

Mon problème : Je veux écrire teta et Z automatiquement en fonction de la valeur dans la colonne A.

Je suis novice en VBA. J'ai essayé d'écrire mon code VBA en raisonnant de la manière suivante :

1. Je défini la variable "c" étant une Range dont les limites sont Range ("A:A").

2. Je lui dit que tant que c > 0 et <> 9999.00 alors il écrit successivement dans la colonne B les valeurs "1.8"; "3.6"; "5.4";...

3. Tant que la cellule dans la colonne A n'as pas la valeur 9999.00 alors il continu d'incrémenter et si la valeur = 9999.00 alors il recommence.

4. Il compte le nombre de fois que nombre 9999.00 apparaît dans "c" (Range ("A:A")) et déduit Z en écrivent 0 dans la colonne F jusqu'à la première fois qu'apparaît la valeur 9999.00 puis 0.05 quand apparaît la première fois qu'apparaît la valeur 9999.00, ect

5. Convertir en cartésien l'ensemble en écrivant le résultat dans la colonne D pour x et Y dans E. Avec x=r*cos(teta) et y=r*sin(teta).

Mes points blocants :

1. Je sais écrire des chiffres tant que la colonne spécifié (ici A) a des valeurs.

2. et 3. Je ne sais pas tester la valeur de la colonne A et incrémenter la valeur de B en fonction de la valeur de la colonne A.

4. Il existe une multitude de fonction "Count" et je ne sais pas laquelle sera la plus adaptée à mon problème.

5. N'est pas obligé d'être écrit dans la macro car je peut écrire en dur ces formules dans les colonnes D et E. Néanmoins écrit les formules s'il y a des valeurs dans la colonne A.

Bonus : Je créerais un autre fichier que je convertirais en .csv puis .TXT pour donner à manger à SolidWorks (logiciel conception 3D) car techniquement toutes ces valeurs me donnerons un nuage de point que SW reliera.

Pouvez-vous m'aider, ne serrais-ce avoir des bouts de programmes que j'ai à adapter à mon cas ?

Merci beaucoup !

27farmer.zip (6.68 Ko)

Bonjour,

voici un exemple,

Sub test()
Dim i As Long, x As Long
x = 1
For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row
  If Cells(i, 1) > 0 And Cells(i, 1) <> 9999# Then
    Cells(i, 2) = 1.8 * x
    x = x + 1
  Else
    Cells(i, 2) = 0
    x = 1
  End If
Next i
End Sub

la macro est sur le Module1

Merci beaucoup c'est exactement mon besoin !

J'étais entrain de vouloir résoudre mon problème avec qu'une seule variable.. C'est pour cela que je n'y arrivait pas...

Je vais me mettre au compteur pour écrire les Z, et je pense que ce bout de code me permettra de les écrire les uns en dessous des autres.

Merci beaucoup pour ton aide sabV !

Bonjour,

j'ai déclaré x As Long mais j'aurais du le déclaré x As Integer

si vous avez de la difficulté avec les Z, dite-moi.

Bonjour,

Je me suis grandement inspiré de votre code, mais je pense que je suis passé à côté d'un point :

Sub Valeur_Z()

Dim i As Long, x As Long

x = 0

For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row

If Cells(i, 1) = 9999# Then

Cells(i, 3) = x + 0.05

x = x + 1

Else

Cells(i, 3) = x

End If

Next i

End Sub

Ma valeur reste à 0 donc je pense que ma condition If n'est jamais vrai et que par conséquent je n'ai que la valeur du Else...

Bonjour,

voici pour le Z,

à tester,

Sub test()
Dim i As Long, x As Long
Application.Calculation = xlManual
x = 1
For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row
  If Cells(i, 1) > 0 And Cells(i, 1) <> 9999# Then
    Cells(i, 2) = 1.8 * x
    x = x + 1
      If Application.CountIf(Range("$B$1:B" & i), 9999) > 0 Then
       Cells(i, 3) = Application.CountIf(Range("$B$1:B" & i), 9999) * 0.05
      Else
       Cells(i, 3) = 0
      End If
  Else
    Cells(i, 2) = 0
    x = 1
  End If
Next i
Application.Calculation = xlAutomatic
End Sub

Merci pour votre aide !

Mais le code tel quel ne fonctionne pas.

Si je le laisse tel quel :

Je perd la fonction précédente du programme.

La valeur 0.05 n’apparaît qu'a partir de la ligne 5555. Elle est répété mais pas incrméenté à la prochaine valeur 9999.00

Si j'enlève la dernière ligne "Application.Calculation = xlAutomatic" j'ai la valeur 0.05 qui apparaît pour la première fois à la ligne 5628 et pas de répétition du 0.05 et pas d'incrément du 0.05.

Je trouve le temps d'exécution de la maccro assez long (10 - 15 sec)

Si on converti les nombres de la façon suivante : 7.41 -> 7,41 avons nous un changement pour notre maccro ?

sur ce fichier la première valeur Z est sur la ligne 201

Merci pour votre aide !

En effet sur votre fichier cela fonctionne bien avec la fonction : =SI(NB.SI($A$1:A402;9999)>0;NB.SI($A$1:A402;9999)*0,05;

Comment puis-je l'écrire en VBA pour que de la ligne 201 à 401 il y ait écrit tout le temps 0.05, de la ligne 402 à 602 0.1,ect

Car avec une fonction compteur comme dans le précédent code on y arrivait mais pas au début des données...

J'ai fait pas mal de recherches ce soir sur le net et pour le moment je n'ait rien trouvé... Mais je ne désespère pas ^^

Bonjour,

est-mieux comme ça ?

Sub test()
Dim i As Long, x As Long
Application.Calculation = xlManual
x = 1
For i = 1 To Cells(Rows.Count, 1).End(xlUp).Row
  If Cells(i, 1) > 0 And Cells(i, 1) <> 9999# Then
    Cells(i, 2) = 1.8 * x
    x = x + 1
  Else
    Cells(i, 2) = 0
    x = 1
  End If

    If Application.CountIf(Range("$A$1:A" & i), 9999) > 0 Then
       Cells(i, 3) = Application.CountIf(Range("$A$1:A" & i), 9999) * 0.05
    Else
       Cells(i, 3) = 0
    End If
Next i
Application.Calculation = xlAutomatic
End Sub

Bonjour,

je te trouve confus et imprécis dans tes explications. Et pourquoi en vba alors que de simples formules suffisent ?

Je tente quand même quelque chose, c'est bien parce que sabV avait réussi à te traduire.

La prochaine fois met moins de texte et je veux ça ici avec ça et ça...

Je te laisse ajouter x=r*cos(teta) et y=r*sin(teta). Tu dis beaucoup de chose mais je n'ai pas trouvé qui est quoi ni où.

eric

edit : sabV a apporté une nouvelle réponse page précédente que je n'avais pas vue

26classeur3.xlsm (128.31 Ko)

Bonjour,

Excusez-moi pour le temps de réponse....

Mes explications étaient assez confuses je l'accorde... Ce n'est pas toujours évident d'expliquer un problème de façon concise et compréhensible...

Merci beaucoup pour votre aide à tous les deux ! La solution que tu me présente éric est parfaite !

Merci encore !

Rechercher des sujets similaires à "convertir coordonnees cylindriques cartesienne"