Zellen automatisch befüllen
#1
Guten Morgen,


ich habe folgendes Problem:

Ich möchte mit Excel ein CNC-Programm zum spiralförmigen Kreisfräsen erstellen.

Vorbereitet habe ich eine Userform in der ich alle wichtigen Daten wie Kreisdurchmesser, Startpunkt in X,Y,Z, Tiefe und die Zustellung in Z je Wendel eingeben kann.

Alle Berechnungen sind soweit richtig, nun soll das Programm aber soweit geschrieben werden bis die gewünschte Frästiefe erreicht ist.


Mein Code für den Button "Programm erstellen" auf der Userform ist folgender:

Private Sub CommandButton1_Click()
DM = TextBox1.Text 'Durchmesser
X = TextBox2.Text   'Mittelpunkt X
Y = TextBox3.Text   'Mittelpunkt Y
O = TextBox4.Text   'Startpunkt Z OBEN
U = TextBox5.Text   'Endpunkt Z Unten. Negativen Wert eingeben.
ZU = TextBox6.Text  'Zustellung Z je Wendel



Worksheets("Tabelle1").Range("c2").Value = DM
Worksheets("Tabelle1").Range("c4").Value = X
Worksheets("Tabelle1").Range("c6").Value = Y
Worksheets("Tabelle1").Range("c8").Value = O
Worksheets("Tabelle1").Range("c10").Value = U
Worksheets("Tabelle1").Range("c12").Value = ZU


Range("A18").Value = "G0"
Range("B18").Value = "X"
Range("C18").Value = X
Range("D18").Value = "Y"
Range("E18").Value = Y

Range("B19").Value = "Z"
Range("C19").Value = O

Range("A20").Value = "G42"
Range("B20").Value = "G1"
Range("C20").Value = "X"
Range("D20").Value = DM / 2 + X

Range("A21").Value = "G2"
Range("B21").Value = "I-"
Range("C21").Value = DM / 2
Range("D21").Value = "Z"
Range("E21").Value = O - ZU

Range("A22").Value ="G2"
Range("B22").Value = "I-"
Range("C22").Value = DM / 2
Range("D22").Value = "Z"
Range("E22").Value = Range("E21") - ZU


End Sub


Nun möchte ich das sich der letzte Block solange wiederholt bis der Wert U aus Textbox Nr. 5 erreicht ist.
Also in Zeile 23 soll dann folgendes stehen:

Das gleiche wie in Zeile 22 nur in Zelle E den Wert aus Zeile 22 abzüglich den Wert ZU aus der Textbox Nr. 6

Dies soll solange fortgesetzt werden bis der Wert in Zelle E gleich dem Wert U aus der Textbox Nr. 5 ist.

Direkt dananch in der darauf folgenden Zeile (die ja noch nicht bestimmt ist, deshalb die Fragezeichen in der Range) soll dann noch folgendes stehen:


Range("A??").Value ="G1"
Range("B??").Value = "G40"
Range("C??").Value = "X"
Range("D??").Value = X
Range("E??").Value = "Y"
Range("F??").Value = Y

Und ganz zum Schluß in der allerletzten Zeile des Programms noch dieses:

Range("A??").Value ="G0"
Range("B??").Value = "G91"
Range("C??").Value = "G28"
Range("D??").Value = "Z0.000"


Nun noch kurz zum Sinn des ganzen, zur Veranschaulichung was dabei herrauskommen soll:

So sieht ein CNC-Programm aus, das einen Kreis mit dem Durchmesser 100mm an den Koordinaten X0. Y0. mit der Tiefe von 12mm und der Zustellung von 1mm pro Wendel fräst. Sie können sich vorstellen das es unter Umständen, je nach Zustellwert mehrere hundert oder gar tausend Zeilen werden können in denen immer das gleiche steht ausser dem Z-Wert. Bisher schreibe ich das Programm einige Zeilen von Hand und copy and paste bis ich genügend Zeilen habe. Dann passe ich den Z-Wert an. Das ist aber sehr Aufwändig, vor allem bei sehr tiefen Bohrungen und kleinen Zustellwerten.

G0 X0.000 Y0.000    <---Startpunkt des Kreises in X und Y
Z2.000  <----- Startpunkt in Z
G42 G1 X50.000   <----Anfahren zum Kreishalbmesser
G2 I-50.000 Z1.000  <----Erste Kreisbewegung mit 1mm Zustellung
I-50.000 Z0.000   <------Zweite Kreisbewegung mit Zustellung
I-50.000 Z-1.000  <----- usw.
I-50.000 Z-2.000
I-50.000 Z-3.000
I-50.000 Z-4.000
I-50.000 Z-5.000
I-50.000 Z-6.000
I-50.000 Z-7.000
I-50.000 Z-8.000
I-50.000 Z-9.000
I-50.000 Z-10.000
I-50.000 Z-11.000
I-50.000 Z-12.000  <---- Erreichen des Endpunktes
G40 G1 X0.000 Y0.000  <---Zurückfahren des Fräsers zum Startpunkt X und Y
G0 G91 G28 Z0. <------Abheben des Fräsers und Zurück zum Maschinennullpunkt in Z (Werkzeugwechselpunkt)



Vielen Dank im Vorraus
Top
#2
Hallo,

ein Vorschlag: an den bestehenden Code (vor end sub) folgende Schleife:


Code:
for i = cells(22,"E") - ZU to U step -ZU
    cells(22 + j, "E") = i + ZU
     j = j + 1
next i


mfg

(die Konstante in Spalte C ist einfach einzufügen)
Top
#3
Hallo Fennek,

vielen Dank schonmal für Deinen Ansatz.

ich habe Deinen Code zum testen so wie Du ihn geschrieben hast eingefügt, aber leider tut sich überhaupt nichts.

Der neue Code siehe hier:


Code:
DM = TextBox1.Text 'Durchmesser
x = TextBox2.Text   'Mittelpunkt X
Y = TextBox3.Text   'Mittelpunkt Y
O = TextBox4.Text   'Startpunkt Z OBEN
U = TextBox5.Text   'Endpunkt Z Unten
ZU = TextBox6.Text  'Zustellung Z je Wendel

Worksheets("Tabelle1").Range("c2").Value = DM
Worksheets("Tabelle1").Range("c4").Value = x
Worksheets("Tabelle1").Range("c6").Value = Y
Worksheets("Tabelle1").Range("c8").Value = O
Worksheets("Tabelle1").Range("c10").Value = U
Worksheets("Tabelle1").Range("c12").Value = ZU



Range("A18").Value = "G0"
Range("B18").Value = "X"
Range("C18").Value = x
Range("D18").Value = "Y"
Range("E18").Value = Y

Range("B19").Value = "Z"
Range("C19").Value = O

Range("A20").Value = "G42"
Range("B20").Value = "G1"
Range("C20").Value = "X"
Range("D20").Value = DM / 2 + x

Range("A21").Value = "G2"
Range("B21").Value = "I-"
Range("C21").Value = DM / 2
Range("D21").Value = "Z"
Range("E21").Value = O - ZU

Range("B22").Value = "I-"
Range("C22").Value = DM / 2
Range("D22").Value = "Z"
Range("E22").Value = Range("E21") - ZU


For i = Cells(22, "E") - ZU To U Step -ZU
    Cells(22 + j, "E") = i + ZU
     j = j + 1
Next i


End Sub
Top
#4
Hallo,

dieser Code muss in ein allgemeines Modul:


Code:
Private Sub Fen()
DM = 10 'TextBox1.Text 'Durchmesser
X = 100 'TextBox2.Text   'Mittelpunkt X
Y = 100 'TextBox3.Text   'Mittelpunkt Y
O = 1 'TextBox4.Text   'Startpunkt Z OBEN
U = -3 'TextBox5.Text   'Endpunkt Z Unten. Negativen Wert eingeben.
ZU = 0.1 'TextBox6.Text  'Zustellung Z je Wendel



Worksheets("Tabelle1").Range("c2").Value = DM
Worksheets("Tabelle1").Range("c4").Value = X
Worksheets("Tabelle1").Range("c6").Value = Y
Worksheets("Tabelle1").Range("c8").Value = O
Worksheets("Tabelle1").Range("c10").Value = U
Worksheets("Tabelle1").Range("c12").Value = ZU


Range("A18").Value = "G0"
Range("B18").Value = "X"
Range("C18").Value = X
Range("D18").Value = "Y"
Range("E18").Value = Y

Range("B19").Value = "Z"
Range("C19").Value = O

Range("A20").Value = "G42"
Range("B20").Value = "G1"
Range("C20").Value = "X"
Range("D20").Value = DM / 2 + X

Range("A21").Value = "G2"
Range("B21").Value = "I-"
Range("C21").Value = DM / 2
Range("D21").Value = "Z"
Range("E21").Value = O - ZU

Range("A22").Value = "G2"
Range("B22").Value = "I-"
Range("C22").Value = DM / 2
Range("D22").Value = "Z"
Range("E22").Value = Range("E21") - ZU

'########### neu
For i = Cells(22, "E") - ZU To U Step -ZU
   Cells(22 + j, "E") = i + ZU
   j = j + 1
Next i

End Sub


mfg
Top
#5
Alles klar,

funktioniert jetzt, vielen Dank.

Vielleicht noch einen Tip wie ich es anstelle, das nach der For Next Schleife am Ende der Tabelle noch die beiden letzten Sätze eingefügt werden? Ich weiß ja vorher nicht die Range des Tabellenende.


I-50.000 Z-12.000  <---- Ende der Tabelle durch Erreichen des Endpunktes
G40 G1 X (Wert aus Variable X) Y (Wert aus Variable Y)  <---- Dieses sollte danach noch eingefügt werden
G0 G91 G28 Z0. <------und dieses ebenfalls, ganz zum Schluß, keine Variablen, dieses ist der Maschinennullpunkt der Z-Achse und immer gleich. 

Danke
Top
#6
Hallo,

ungeprüft:

der letzte Wert sollte in Zelle
Code:
Cells(22+i, "E")


stehen, oder anders:

Code:
lr = cells(rows.count, "E").end(xlup).row 'lr: last row

mfg
Top
#7
Hallo Fennek,

ich hab das Problem schon gelöst. Zwar nicht so elegant wie Sie, aber es funktioniert wie ich es brauche.
Ihre Lösung mit
Code:
Cells(22+i, "E")
werde ich aber gleich noch ausprobieren.

Habe alles nochmal etwas umgestellt, damit es besser aussieht und es wird nun auch gleich in die Zwischenablage kopiert zur weiteren Verwendung mit meinem CNC-Editor. Dort kann ich durch verschiedene Funktionen (Leerzeichen ausblenden, einblenden usw.) die Abstände zwischen den einzelnen Zeichen berichtigen und durch ein benutzerdefiniertes Zahlenformat in Excel in den relevanten Spalten habe ich auch die unötigen Nullen nach dem Punkt wegbekommen. Das spart viel Speicherplatz, für meine alte Fräse aus dem Jahr1989 ist das sehr wichtig. Den Punkt nach der Koordinate brauche ich allerdings für meine Maschine, sonst würde sie bei zb. 1  meinen es handelt sich um ein tausendstel mm statt um einen ganzen mm. Und ein Komma kann sie leider schon gleich gar nicht verarbeiten.

Mein Zahlenformat ist 0.??? falls es jemand brauchen kann. Dies ergibt eine ganze Zahl mit einem Punkt und nur falls gebraucht noch drei nach"komma"stellen.

Das vorhin erwähnte G0 G91 G28 Z0. habe ich weggelassen und durch G0 Z (Value=O) ersetzt, da es ja sein könnte man möchte mit dem gleichen Werkzeug an anderen Koordinaten eine weitere Bohrung fräsen. Dann wäre ein Rückzug zum Werkzeugwechselpunkt unötig. Vermutlich werde ich in Zukunft meine Userform noch anpassen mit Klickboxen für derartige Optionen. (Werkzeugwechel Ja/Nein usw, da gibts noch genügend Spielereien.)

Nun nochmal meinen ganzen Code für den Button auf der Userform: (Die Ranges für die Daten aus den Textboxen habe ich jetzt weggelassen, weil sie eigentlich unötig sind und sowieso von der offenen Userform verdeckt worden sind)

Code:
Private Sub CommandButton1_Click()

Columns("A:F").ClearContents 'Alten Inhalt löschen

DM = TextBox1.Text 'Durchmesser
X = TextBox2.Text   'Mittelpunkt X
Y = TextBox3.Text   'Mittelpunkt Y
O = TextBox4.Text   'Startpunkt Z OBEN
U = TextBox5.Text * (-1) 'Endpunkt Z Unten, positive Eingabe
ZU = TextBox6.Text  'Zustellung Z je Wendel


Range("A1").Value = "G0"
Range("B1").Value = "X"
Range("C1").Value = X
Range("D1").Value = "Y"
Range("E1").Value = Y

Range("B2").Value = "Z"
Range("C2").Value = O

Range("A3").Value = "G42"
Range("B3").Value = "G1"
Range("C3").Value = "X"
Range("D3").Value = DM / 2 + X

Range("A4").Value = "G2"
Range("B4").Value = "I-"
Range("C4").Value = DM / 2
Range("D4").Value = "Z"
Range("E4").Value = O - ZU

Range("B5").Value = "I-"
Range("C5").Value = DM / 2
Range("D5").Value = "Z"
Range("E5").Value = Range("E4") - ZU

For i = Cells(5, "E") - ZU To U + (-ZU) Step -ZU
 Cells(5 + j, "E") = i + ZU
 Cells(5 + j, "B") = "I-"
 Cells(5 + j, "C") = DM / 2
 Cells(5 + j, "D") = "Z"
    j = j + 1
Next i

Cells(j + 5, "A").Value = "G40"
Cells(j + 5, "B").Value = "G1"
Cells(j + 5, "C").Value = "X"
Cells(j + 5, "D").Value = X
Cells(j + 5, "E").Value = "Y"
Cells(j + 5, "F").Value = Y

Cells(j + 6, "A").Value = "G0"
Cells(j + 6, "B").Value = "Z"
Cells(j + 6, "C").Value = O

Columns("A:F").Copy

End Sub

Und hier gleich noch das Ergebnis nach der Weiterverarbeitung mit dem CNC-Editor:

G0 X0. Y0.
Z1.
G42 G1 X5.
G2 I-5. Z0.6
I-5. Z0.2
I-5. Z-0.2
I-5. Z-0.6
I-5. Z-1.
I-5. Z-1.4
I-5. Z-1.8
I-5. Z-2.2
I-5. Z-2.6
I-5. Z-3.
I-5. Z-3.4
I-5. Z-3.8
I-5. Z-4.2
I-5. Z-4.6
I-5. Z-5.
I-5. Z-5.4
I-5. Z-5.8
I-5. Z-6.2
I-5. Z-6.6
I-5. Z-7.
I-5. Z-7.4
I-5. Z-7.8
I-5. Z-8.2
I-5. Z-8.6
I-5. Z-9.
I-5. Z-9.4
I-5. Z-9.8
G40 G1 X0. Y0.
G0 Z1.


Mhh, jetzt stelle ich hier beim Einfügen des CNC-Codes ein das es nur dann genau funtkioniert wenn sich der U-Wert durch den ZU-Wert teilen lässt, ansonsten gibt es einen Rest der in der Tabelle fehlt, das habe ich nicht bedacht.
Also hier habe ich jetzt für den Startwert von Z 1.0 und für die Zustellung pro Wedel 0.4 genommen. Die letzte Wendel geht dann bis Z-9.8 Das geht natürlich nicht. Da muß dann noch eine Zeile mit dem Rest eingefügt werden. Aber da versuche ich mich jetzt mal selber dran. Mit Ihren Ansätzen bin ich doch schon sehr weitergekommen.Falls es Sie interessiert gebe ich dann gerne nochmal eine Rückmeldung. Aber soweit noch einmal vielen Dank.

MfG
Wolfi
Top
#8
Hallöchen,

Rückmeldungen sind immer gern gesehen Smile
Ich könnte mir dazu auch eine Formellösung vorstellen.
Andererseits - was für eine CNC-Steuerung ist das denn? Bietet die keine entsprechenden Zyklen?
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste