Vielleicht kann mir jemand mit VBA Kenntnisse helfen
Ich möchte mit einer Schleife eine Tabelle erstellen lassen. Breite und Länge werden durch InputBox eingegeben. Nun soll ein Raster ausgegeben werden; Am Anfang sowie am Ende werden jeweils 40 abgezogen. Schrittweise soll dann z.B. 1000 abgezogen werden und in vorletzter Spalte bzw. Reihe soll der Restwert eingetragen werden. Datei mit Skizze für das Raster sind beigefügt. Im voraus Vielen Dank
hier mal zum Verständnis ein Tabellenausschnitt. Der ist jetzt zwar mit 30, aber für's Prinzip auch ok. Eingegeben werden jeweils 1400. Der Endwert in der letzten benötigten Spalte wäre bei 30 dann jeweils 1370. In der ersten Spalte kommt die 30 rein. Die dazwischen benötigte Spaltenzahl muss ermittelt werden. Hier steht allerdings die Frage, wo der Wert "z.B. 1000" festgelegt wird. Per Inputboxen würde ich nur die beiden Grenzwerte 1400 (senkrecht) und 1400 (waagerecht), erhalten. In meiner Erklärung sind die Werte gleich, in der realität sicher meist unterschiedlich, daher 2 Inputboxen oder ich gebe die Werte in einer ein, z.B. durch Semikolon getrennt. In dem Blatt mit dem 30er Muster werden jeweils 610 abgezogen. Ich brauche also zwischen der 30 und der 1370 folgende Spalten:
1370-610 = 760 760-610 = 150
Das war's hier auch schon, 150 - 610 ist < 30.
Arbeitsblatt mit dem Namen 'Tabelle1'
B
C
D
E
F
G
H
I
2
30
150
760
1370
Länge
1400
3
30
Breite
1400
4
150
5
760
6
1370
7
Verwendete Systemkomponenten: [Windows (32-bit) NT :.00] MS Excel 2016
Danke dir für deine Antwort "schauan" Das Raster mit den 610 funktioniert ja auch. bei dem werden jeweils am Anfang und Ende zuerst 30 und dann 120 (30+120 =150) abgezogen, bzw Spalten und Reihen gemacht. Das hatte ich schon hin bekommen. Jedoch wollte ich nun ein Raster haben, in dem jeweils nur 40 am Anfang und Ende abgezogen wird, und zwischendurch z.B. 1000 d.h. beim Raster 1000: wenn ich eine Breite von 4500 habe, dann müsste es so sein das 40, 1040, 2040, 3040, 4040, 4460. Und das bekomme ich nicht hin.
ich habe jetzt mal nicht nach dem Fehler gesucht. Dein code ist recht umfangreich für diese Aufgabe und Du hast für jede Variante einen eigenen. Daher habe ich mal einen flexiblen geschrieben, hier nur für die waagerechten Werte und ohne die Zellrahmen.
Die 4 Ausgangswerte solltest Du entweder alle abfragen, oder Du schreibst zumindest die 40 und die 1000 oder 30 und 610 usw. irgendwo im Blatt fest hin und holst sie Dir von dort. Du könntest dazu sogar den Blattnamen verwenden, nenne es z.B. 40-1000.
Code:
Sub test() 'Variablendeklaration 'Integer Dim i1%, i2%, i3%, i4%, iCnt% 'String, Variant Dim strWerte$, arrWerte 'Werte festlegen - später über Inputbox oder andere Quellen i1 = 40 i2 = 4500 i3 = 8500 i4 = 1000 'Endwert festlegen / um Startwert verringern i2 = i2 - i1 'Schleife solange Endwert>=Wert Do While i2 >= i1 'Wert merken strWerte = strWerte & i2 & ";" 'Endwert um Schrittweite verringern i2 = i2 - i4 'Ende Schleife solange Endwert>=Wert Loop 'Startwert hinzufuegen strWerte = strWerte & i1 'Werte in ein Array wandeln arrWerte = Split(strWerte, ";") 'Schleife ueber alle Werte im Arrray, rueckwaerts For iCnt = UBound(arrWerte) To 0 Step -1 'Wert in Zelle eintragen - hier ab A1 Cells(1, UBound(arrWerte) - iCnt + 1) = arrWerte(iCnt) 'Ende Schleife ueber alle Werte im Arrray Next End Sub
. \\\|/// Hoffe, geholfen zu haben. ( ô ô ) Grüße, André aus G in T ooO-(_)-Ooo (Excel 97-2019+365)
Hab recht vielen Dank für deine Mühe. Jedoch ist es leider nicht so wie ich es wollte. Bei deinem Test zählt er die ganze Reihe Rückwärts. Ich wollte jedoch etwas anderes (Siehe neues Raster2) Vielleicht hab ich mich bei meiner ersten Frage falsch ausgedrückt
schaue mal in Deine erste Datei bei dem 610er Raster: Das geht doch rückwärts, oder? Jetzt ist die Frage, wodurch entschieden wird, ob es rückwärts oder vorwärts geht.
Arbeitsblatt mit dem Namen 'Raster 610'
B
C
D
E
F
G
H
I
J
K
19
30
150
760
1370
1980
2590
3200
3350
3470
Verwendete Systemkomponenten: [Windows (32-bit) NT 10.00] MS Excel 2016
Sub Raster(rngRaster As Range, lngLänge As Long, lngBreite As Long, lngSchritt As Long) Dim lngAnz As Long Dim lngPos As Long lngAnz = WorksheetFunction.RoundUp((lngLänge - 80) / lngSchritt, 0) + 1 For lngPos = 1 To lngAnz If lngPos = lngAnz Then rngRaster.Offset(lngPos - 1, 0) = lngLänge - 40 Else rngRaster.Offset(lngPos - 1, 0) = 40 + lngSchritt * (lngPos - 1) End If Next lngPos lngAnz = WorksheetFunction.RoundUp((lngBreite - 80) / lngSchritt, 0) + 1 For lngPos = 1 To lngAnz If lngPos = lngAnz Then rngRaster.Offset(0, lngPos - 1) = lngBreite - 40 Else rngRaster.Offset(0, lngPos - 1) = 40 + lngSchritt * (lngPos - 1) End If Next lngPos End Sub
helmut
Für mich ist die Möglichkeit in Excel an Zellen und Bereichen Namen zu vergeben die wichtigste Funktionalität. Sie macht Formeln und den VBA-code verständlicher. Für Makros gilt die Regel: "Nur über benannte Bereiche auf den Inhalt der Zellen zugreifen." Und wofür sind Regeln da? Um nachzudenken bevor man sie bricht.
Für mich ist die Möglichkeit in Excel an Zellen und Bereichen Namen zu vergeben die wichtigste Funktionalität. Sie macht Formeln und den VBA-code verständlicher. Für Makros gilt die Regel: "Nur über benannte Bereiche auf den Inhalt der Zellen zugreifen." Und wofür sind Regeln da? Um nachzudenken bevor man sie bricht.
Das 610er Raster funktioniert einwandfrei. Jedoch wird bei diesem am Anfang und Ende zuerst 30 und dann 120 abgezogen. Dann fängt es am Anfang ab 150 (30+120) mit jeweils 610 er Schritten an zu zählen. Raster Werte von links nach rechts 30, 150, 760, 1370, 1980, 2590 usw. , am Ende (z.B. breite 5000) 4850, 4960
Beim 1000 er Raster soll es am Anfang und Ende jeweils nur einen Wert (hier 40) abziehen. Dann wären die Raster Werte von links nach rechts 40, 1040, 2040, 3040, 4040 usw., am Ende (z.B. breite 5000) 4960
Bei deiner Schleife wird vom Endwert z.B. 5000 abgezogen: 4960, 3960, 2960 usw.
Es macht was es soll, jedoch müsste hier bei "0" angefangen werden, damit auf Breite und Länge jeweils der Anfangswert erscheint Sonst kann man keine Raster bzw. Rahmen um die Werte eingeben