Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1884to1888
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Kleines Programm zur Sporenmessung

Kleines Programm zur Sporenmessung
17.06.2022 17:07:19
Sebastian
Hallo liebe Foristen, ich bräuchte nach langer Zeit mal wieder etwas Hilfe ...
mit meiner Mikroskopsoftware messe ich Pilzsporen aus. Die ermittelten Werte kann man in eine CSV-Datei exportieren. Leider kann man in dem Programm nur Längen nacheinander messen, die dann aufgelistet werden. Nun misst man bei Pilzsporen aber immer Länge und dann von der selben Spore die Breite. Das ist relevant, da man zu mykologischen Zwecken immer mehrere Sporen misst und dann das Ergebnis sowohl der Länge als auch der Breite mittelt und zudem aus der Länge und Breite der jeweiligen Spore den Quotient berechnet. Das weiß die Software aber nicht. Sie misst nur stumpf Länge 1, 2, 3, 4, 5, 6 usw. ... die ausgegebene Tabelle des Programms sieht dann so aus:
Userbild
In dem Fall wäre Länge 1 die Länge von Spore 1, Länge 2 die Breite von Spore 1 ... Länge 3 wäre dann die Länge von Spore 2 und Länge 4 eben die Breite von Spore 2
Ich möchte die ausgegebenen Werte automatisiert nun so sortieren, das die Länge und Breite der jeweiligen Spore nebeneinander in einer Zeile liegen (Längen in Spalte B und Breite in Spalte C). Mit einem aufgezeichneten Makro lösche ich dazu schonmal die Spalte B (ausgegebene Daten "Distanz" brauche ich nicht) und ändere die Überschriften nach meinen Wünschen:

Sub Sporenmessung()
' Sporenmessung Makro
' Tastenkombination: Strg+m
Range("A1").Select
ActiveCell.FormulaR1C1 = "Sporen"
Range("C1").Select
ActiveCell.FormulaR1C1 = "Länge µm"
Range("D1").Select
ActiveCell.FormulaR1C1 = "Breite µm"
Range("E1").Select
ActiveCell.FormulaR1C1 = "Quotient"
Columns("B:B").Select
Selection.Delete Shift:=xlToLeft
End Sub
Ergebnis ist das:
Userbild
Die rote Farbe habe ich manuell eingefügt. Das sind die jeweiligen Sporenbreiten, die nun neben die Sporenlängen sollen. Also B4 auf C3; B6 auf C5; B8 auf C7 und so weiter. Die dann leeren Zeilen (B4, B6 usw. könnten dann gelöscht werden). Leider bekomme ich das nicht mit einem Makro hin, da ich nicht weiß wieviel Sporen insgesamt gemessen werden. Das können mal 5 oder eben mal hundert sein. Deswegen bräuchte ich wohl so etwas wie eine Schleife?
Super wäre, wenn dann in Spalte D gleich noch der Quotient zu den Sporenmaßen gerechnet würde (also hier beispielsweise D3=B3/C3) und am Ende der Spalte B (unter dem letzten Wert - hier B17 ... könnte aber auch B101 sein!) der Mittelwert der Längen bzw. der Breiten (Spalte C).
Ich hoffe ich konnte mich verständlich machen und ihr könnt mir helfen und mich vielleicht mit einem passenden Codeschnipsel versorgen. Vielen Dank bereits schon mal im Voraus!
Herzlich Sebastian

17
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Kleines Programm zur Sporenmessung
17.06.2022 17:34:25
onur
Zuerst letzte Zeile definieren:

dim lz
lz=500 'z.B.
for z=4 to lz step 2 ' jede 2. Zeile
cells(z-1,3)=cells(z,2) ' Breite 1 Zeile nach oben und in C kopieren
next z
for z= lz to 4 step -1
if z mod 2= 0 then cells(z,1).entirerow.delete' Alle geraden Zeilen VON UNTEN NACH OBEN löschen
next z
Ungetestet, sollte aber funktionieren.
AW: Kleines Programm zur Sporenmessung
17.06.2022 19:04:09
Sebastian
Super, vielen Dank ... das klappt prima!!! Vielen, vielen Dank.
Jetzt versuche ich noch die Berechnungen in eine Schleife zu bekommen:

Range("D3").Select
ActiveCell.FormulaR1C1 = "=RC[-2]/RC[-1]"
Range("D3").Select
Selection.AutoFill Destination:=Range("D3:D9"), Type:=xlFillDefault
Range("D3:D9").Select
Range("B10").Select
ActiveCell.FormulaR1C1 = "=AVERAGE(R[-7]C:R[-1]C)"
Selection.AutoFill Destination:=Range("B10:D10"), Type:=xlFillDefault
Range("B10:D10").Select
Range("B3:D10").Select
Selection.NumberFormat = "0.00"
Range("A3").Select
ActiveCell.FormulaR1C1 = "1"
Range("A3").Select
Selection.AutoFill Destination:=Range("A3:A9"), Type:=xlFillSeries
Range("A3:A9").Select
Range("B16").Select
Das Ergebnis soll dann so aussehen:
Userbild
Aber auch hier weiß ich je nach Anzahl gemessener Sporen nicht, welcher Range (hier A3 bis A9) dass genau sein wird? Auc da brauche ich wohl eine Schleife. Habt ihr da auch noch einen Codeschnipsel zum einbauen für mich?
LG Sebastian
Anzeige
AW: Kleines Programm zur Sporenmessung
17.06.2022 19:14:15
onur
Dann halt 2 Zeilen mehr:

dim lz
lz=500 'z.B.
for z=4 to lz step 2 ' jede 2. Zeile
cells(z-1,3)=cells(z,2) ' Breite 1 Zeile nach oben und in C kopieren
cells(z-1,4)=cells(z-1,2) / cells(z,2) 'Quotient berechnen und eintragen
next z
for z= lz to 4 step -1
if z mod 2= 0 then cells(z,1).entirerow.delete' Alle geraden Zeilen VON UNTEN NACH OBEN löschen
next z
columns(4).NumberFormat = "0.00" 'Spalte D formatieren

AW: Kleines Programm zur Sporenmessung
17.06.2022 20:08:18
Sebastian
Ah, verstehe die Formel glaube ich, dennoch wird leider ein "Überlauf"-fehler produziert. Ich vermute, weil er hier nicht mit leeren Zellen rechnen kann?
Userbild
LG Sebastian
Anzeige
AW: Kleines Programm zur Sporenmessung
17.06.2022 20:20:20
onur
Du hast die letzte Zeile nicht korrekt gesetzt, deswegen wahrscheinlich Division durch Null.
Die 500 war nur ein Beispiel - Setze sie richtig oder nimm diese Zeile dazu:

lz=UsedRange.Row + UsedRange.Rows.Count-1

AW: Kleines Programm zur Sporenmessung
17.06.2022 20:43:52
Sebastian
Das funktioniert leider auch nicht ... ich weiß ja vorab nicht, wieviel Zeilen genutzt werden, da es ja davon abhängt wieviel Sporen gemessen werden.
lz kann also mal 17 sein oder mal 101. Das kann ich nicht vorab festlegen. Die Schleife müsste quasi den "Arbeitsbereich selbst erkennen. Dieser reicht vom ersten Wert bis zur ersten freien Zeile.
LG und danke für die Mühe Sebastian
Anzeige
AW: Kleines Programm zur Sporenmessung
17.06.2022 20:56:05
onur
GENAU DESWEGEN schrieb ich ja: "oder nimm diese Zeile dazu:". :)
AW: Kleines Programm zur Sporenmessung
17.06.2022 21:16:58
Sebastian
Hi ... ja habe die Zeile eingefügt gehabt, aber auch da bekomme ich leider eine Fehlermeldung:
Userbild
Er sagt "Objekt erforderlich" ... sorry, das bekomme ich alleine leider nicht gelöst.
LG Sebastian
AW: Kleines Programm zur Sporenmessung
17.06.2022 21:46:33
onur
Kannst du mal die Datei posten? Sonst hab ich keine Testmöglichkeit.
AW: Kleines Programm zur Sporenmessung
17.06.2022 21:52:52
GerdL
Hallo Sebastian,
in einem allgemeinen Modul wie z.B. Modul1 muss man jeweils vor UsedRange den Blattnamen schreiben;
.....= ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count
Die "gebrauchten" Zellen sind ein unsicherer Messfaktor.
Ich favorisiere .End(xlUp) oder .End(xlDown) .
Gruß Gerd
Anzeige
AW: Kleines Programm zur Sporenmessung
17.06.2022 22:16:04
Sebastian
Hallo ihr beiden,
super so funktioniert es:

Dim lz
'lz = 500 'z.B.
lz = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1
For Z = 4 To lz Step 2 ' jede 2. Zeile
Cells(Z - 1, 3) = Cells(Z, 2) ' Breite 1 Zeile nach oben und in C kopieren
Cells(Z - 1, 4) = Cells(Z - 1, 2) / Cells(Z, 2) 'Quotient berechnen und eintragen
Next Z
For Z = lz To 4 Step -1
If Z Mod 2 = 0 Then Cells(Z, 1).EntireRow.Delete ' Alle geraden Zeilen VON UNTEN NACH OBEN löschen
Next Z
Columns(4).NumberFormat = "0.00" 'Spalte D formatieren
ActiveSheet.Range("b" & ActiveSheet.Rows.Count).End(xlUp).Offset(1, 0).Select
ActiveCell.Formula = "=AVERAGE(B3:B" & ActiveCell.Row - 1 & ")"
Selection.NumberFormat = "0.00"
ActiveSheet.Range("c" & ActiveSheet.Rows.Count).End(xlUp).Offset(1, 0).Select
ActiveCell.Formula = "=AVERAGE(C3:C" & ActiveCell.Row - 1 & ")"
Selection.NumberFormat = "0.00"
Für die Berechnung der Mittelwerte der dynamischen Bereiche (7 Zeilen oder 101?) habe ich mir nun auch eine Formel mit Schnipseln aus dem Netz gebastelt (siehe oben bzw. Formel). Das funktioniert also auch, supercool.
Dieses:

ActiveSheet.Range("c" & ActiveSheet.Rows.Count).End(xlUp).Offset(1, 0).Select
könnte ich auch für die Schleife oben umbasteln, um die Unsicherheit zu umgehen? Naja. so funktioniert es jedenfalls ersteinmal. Vielen, vielen Dank!
Jetzt muss ich mal noch schauen wie ich eine Nummerierung hinbekomme in Spalte A "Spore 1, Spore 2, Spore 3" statt Länge 1, 3, 13 usw.
LG Sebastian
Anzeige
AW: Kleines Programm zur Sporenmessung
17.06.2022 22:20:48
onur
FORMEL IN A

="Spore " & zeile()+2

AW: Kleines Programm zur Sporenmessung
19.06.2022 13:05:38
Sebastian
Hallo zusammen,
die Formel habe ich irgendwie nicht umgesetzt bekommen. Offenbar sind meine VBA-Kenntnisse dafür viel zu schlecht. Habe jetzt mit Videoanleitung aus dem Netz folgende Schleife für eine durchgehende Nummerierung gebastelt. Das funktioniert so für mich und meine Zwecke:

Dim Spalte As Integer
Dim Startwert As Integer
Dim Startzeile As Integer
Dim Letztezeile As Integer
Dim i As Integer
Spalte = 1
Startwert = 1
Startzeile = 3
Letztezeile = ActiveSheet.UsedRange.Rows.Count - 1
For i = Startzeile To Letztezeile
Cells(i, Spalte).Value = Startwert
Startwert = Startwert + 1
Next i
ActiveSheet.Range("a" & ActiveSheet.Rows.Count).End(xlUp).Offset(1, 0).Select
ActiveCell.FormulaR1C1 = "Mittelwerte"
So sieht nun das Ergebnis aus, unabhängig davon wieviel Sporen gemessen werden:
Userbild
Ich wollte nochmals allen für ihre großartige Hilfe danken und ein großes Lob aussprechen. Hier bekommt man wirklich immer schnelle und brauchbare Hilfe, wenn man selbst auch an die Grenzen der leider sehr, sehr, sehr marginalen VBA-Kenntnisse kommt. Kleines Projekt umgesetzt. Das wird mir und Kollegen sehr nützlich sein!
Herzliche Grüße Sebastian
Anzeige
AW: Kleines Programm zur Sporenmessung
19.06.2022 13:11:41
onur
Für die Zukunft:

ActiveCell.FormulaR1C1 = "Mittelwerte"
ist Blödsinn, "Mittelwerte" ist ein Text und keine Formel, also spar dir Formula...usw - schreib einfach:

ActiveCell= "Mittelwerte"
Auch das Select ist überflüssig, wozu erst auf eine Zelle gehen, nur um den Wert zu ändern ?
Statt:

ActiveSheet.Range("a" & ActiveSheet.Rows.Count).End(xlUp).Offset(1, 0).Select
ActiveCell.FormulaR1C1 = "Mittelwerte"
einfach

ActiveSheet.Range("a" & ActiveSheet.Rows.Count).End(xlUp).Offset(1, 0).= "Mittelwerte"

Anzeige
AW: Kleines Programm zur Sporenmessung
19.06.2022 13:27:08
Sebastian
Macht Sinn ... Danke!
AW: Kleines Programm zur Sporenmessung
17.06.2022 17:37:03
HeritzP
Hallo,
nach rechts und unten.

=INDEX($B$4:$D$17;ZEILE(A1)*2-1+SPALTE(A1)-1;3)

AW: Kleines Programm zur Sporenmessung
17.06.2022 17:43:21
GerdL
Hallo Sebastian!

Sub Unit()
Dim X As Variant, a As Long
Const ZeileEins = 3 'ggf. anpassen
X = Range(Cells(ZeileEins, "B"), Cells(ZeileEins, "B").End(xlDown).Offset(0, 2)).Value
For a = LBound(X) To UBound(X) Step 2
X(a, 2) = X(a + 1, 1)
X(a, 3) = X(a, 1) / X(a, 2)
X(a + 1, 1) = ""
Next
Cells(ZeileEins, "B").Resize(UBound(X, 1), UBound(X, 2)) = X
Cells(ZeileEins, "B").Resize(UBound(X, 1) + 1).EntireRow.Delete
End Sub
Gruß Gerd
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige