Autor
|
Thema: VBA-Benutzerdefinierte Funktionen (4125 mal gelesen)
|
Jürgen56 Mitglied Dipl.-Ing. Verkehrswesen (Eisenbahn)
Beiträge: 23 Registriert: 05.05.2004
|
erstellt am: 10. Jan. 2006 16:46 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen! Ich habe mir die unten dargestellte Benutzerdefinierte Funktion in EXCEL2000 geschrieben, um die Höhe eines Zellbereiches in Zentimeter zurückzugeben. Sie funktioniert auch. Aber: wenn ich die Höhe einer Zeile verändere, findet (natürlich) keine Neuberechnung statt, da sich ja kein Zellwert geändert hat. Wie kann ich eventuell die Neuberechnung dennoch automatisch erreichen? Function Z_Höhe(Bereich) Dim i, j, k, Höhe Höhe = 0 j = Bereich.Row k = j + Bereich.Rows.Count - 1 For i = j To k Höhe = Höhe + ActiveSheet.Rows(i).Height Next Z_Höhe = Höhe / 29.5 End Function Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
BJ Mitglied PLM System Administrator
Beiträge: 488 Registriert: 20.12.2002 SolidEdge V15, SP14 SolidEdge V16, SP8 SolidEdge V17, SP2 --- Win XP Prof., SP 2 DELL Precision WorkStation 340 2,26 GHz, 1GB RAM NVIDIA Quadro4 900 XGL, 128MB
|
erstellt am: 10. Jan. 2006 17:07 <-- editieren / zitieren --> Unities abgeben: Nur für Jürgen56
Hallo! Also mir ist kein Worksheet-Event bekannt, mit dem die Neuberechnung nach einer Änderung der Zeilenhöhe erzwungen werden kann. Notlösung wäre vielleicht ein Button, mit dem du die Neuberechnung ausführst. Noch ein paar Tipps: - Versuche Umlaute für Variablen zu vermeiden (gibts nur in Deutsch). - Eine Dim-Anweisung ohne Variablen-Deklaration bringt nichts, für Excel ist dann alles vom Typ Variant=größt möglicher Speichernutzung; z.B. Dim i As Integer, Dim j As Integer, Dim k As Integer, dim Hoehe As Double Gruß, BJ
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
rainberg Mitglied
Beiträge: 147 Registriert: 14.01.2005
|
erstellt am: 10. Jan. 2006 17:47 <-- editieren / zitieren --> Unities abgeben: Nur für Jürgen56
Hallo Jürgen, vielleicht hilft dir Folgendes: Code: Option ExplicitSub Zeilenhoehe() Dim rngZelle As Range, dblHoehe As Double For Each rngZelle In Selection dblHoehe = dblHoehe + rngZelle.Rows.Height Next Cells(1, 1).Value = dblHoehe / 29.5 End Sub
Kopiere diesen Code in ein Allgemeines Modul und weise ihm z.B die Tastenkombination Strg+h zu. Markiere soviele Zellen einer Spalte, deren Höhe du berechnen willst und drücke die genannte Tastenkombination. (keine ganzen Zeilen selektieren!!) Das Ergebnis wird in Zelle A1 angezeigt------------------ Gruß Rainer Feedback wäre nett! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
startrek Moderator Architekt
Beiträge: 1361 Registriert: 13.02.2003 .
|
erstellt am: 10. Jan. 2006 17:59 <-- editieren / zitieren --> Unities abgeben: Nur für Jürgen56
Hi Jürgen, ist zwar nicht das Gelbe vom Ei, aber müsste gehen mit F9;-) Formel: =dest(E11;ZUFALLSZAHL())
Code:
Function dest(Bereich As Range, x As Double) as double Application.Volatile dest = Bereich.Height / 29.5 End Function
Gruss Nancy [edit]Formel irreführend dargestellt, geht auch bei [zusammenhängenden] Bereichen, zB mit(A2:A10)[/edit]Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Thomas Harmening Moderator Arbeiter ツ
Beiträge: 2897 Registriert: 06.07.2001 Das Innerste geäussert und aufs Äusserste verinnerlicht
|
erstellt am: 11. Jan. 2006 21:33 <-- editieren / zitieren --> Unities abgeben: Nur für Jürgen56
eigentlich wollte ich Rainbergs vorschlag erweitern, aber das Ergebnis ist bei mehrfachzellenauswahl falsch, es addiert alle Höhen der Zellen *zwinker*: ... meine Lösung:
Code: Sub HuB() 'dest :-) Application.StatusBar = "Der Markierte Zellbereich ist " & Format(Selection.Height / 29.5, "###0.00 cm Hoch") & " und " & Format(Selection.Width / 2.662, "###0.00 mm Breit") End Sub
in das entsprechende Tabellenblatt folgender Code
Code: Private Sub Worksheet_SelectionChange(ByVal Target As Range) HuB End Sub
...
[Diese Nachricht wurde von Thomas Harmening am 11. Jan. 2006 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Jürgen56 Mitglied Dipl.-Ing. Verkehrswesen (Eisenbahn)
Beiträge: 23 Registriert: 05.05.2004
|
erstellt am: 18. Jan. 2006 13:21 <-- editieren / zitieren --> Unities abgeben:
Hallo BJ, reinberg, startrek und Thomas Harmening. Vielen Dank für Eure Bemühungen und Hinweise. Sie waren alle sehr Hilfreich. Nur das eigentliche Problem, die automatische Neuberechnung haben sie nicht (und konnten sie nicht) gelöst. Da es nun mal kein Ereignis "Eigenschaft einer Zelle ändert sich" gibt, ist leider auch keine Automatisierung möglich. Ansonsten habe ich den Ansatz von Thomas Harmening gewält. Also nochmals vielen Dank für Eure Unterstützung und bis die Tage. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
DegraA Mitglied staatl. gepr. Techniker - Maschinenbau
Beiträge: 177 Registriert: 29.03.2005 Dell Latitude E5500 Core2Duo 2,53GHz 3,45 GB RAM Win XP Prof. SP3 Office 2003 Prof. Catia V4.2.4 Catia V5R19 i break together
|
erstellt am: 05. Mrz. 2009 22:50 <-- editieren / zitieren --> Unities abgeben: Nur für Jürgen56
Hallo, ich bräuchte mal kurz eine Aufschlüsselung was da gerade passiert:
Code: Sub Thema_Erledigt() ActiveCell.EntireRow.Range("O1").Select While ActiveCell.Interior.ColorIndex <> 24 ActiveCell.Offset(-1, 0).Select Wend ActiveCell.Offset(0, 1).Value = 99 ActiveCell.Offset(0, 2).Value = LastMeetingDate ActiveCell.Range("A1:C1").Font.ColorIndex = 41
kurz zur Erläuterung von "LastMeetingDate"
Code: Function LastMeetingDate() As Date LastMeetingDate = Sheets("Meetings").Range("B3").End(xlDown).Value
Dann hätte ich da mal ein paar allgemeine Fragen, da ich nicht viel Ahnung von VBA habe, es aber gerne verstehen möchte. z.B. wer oder was ist ein/e Range und was macht man damit ? Was macht der Befehl: EntireRow und WTF ist ein "Wend" ------------------ Am lautesten werden Lehrer, wenn sie "Ruhe!" brüllen. Lattenrost ist keine Geschlechtskrankheit !! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Nepumuk Mitglied Entwicklungsleiter
Beiträge: 351 Registriert: 16.10.2004
|
erstellt am: 05. Mrz. 2009 23:43 <-- editieren / zitieren --> Unities abgeben: Nur für Jürgen56
Hallo, Range ist ein Objekt welches einen Zellbereich beinhaltet. Dieser Bereich kann eine einzelne Zelle bis alle Zellen einer Tabelle beinhalten. Ein Range-Objekt hat Eigenschaften die du lesen und schreiben (ändern) kannst [z.B. die Value-Eigenschaft]. Du kannst Methoden auf dieses Objekt anwenden [z.B. die Delete-Methode]. EntireRow (Entire = komplett / gesamt) ist die ganze Zeile eines Bereiches. In deinem Code ActiveCell.EntireRow ist also die Zeile in welcher sich der Cursor befindet. While - Wend ist eine veraltete Schleife. In deinem Code wird damit in der Spalte O nach oben eine Zelle gesucht, welche die Farbe mit dem Index 24 (helles grau) enthält. While wird so lange ausgeführt, bis ihre Bedingung erfüllt ist. Wend schickt die Ausführung wieder nach While zurück. Ist die Bedingung erfüllt, wird der Code nach der Wend-Anweisung fortgesetzt. In der Schleife wird über die Offset-Eigenschaft mit der Select-Methode die Zelle oberhalb der aktiven Zelle aktiviert. (-1, 0) = eine Zeile nach oben kein Versatz in der Spalte. Alles klar? ------------------ Gruß Nepumuk [Diese Nachricht wurde von Nepumuk am 06. Mrz. 2009 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
DegraA Mitglied staatl. gepr. Techniker - Maschinenbau
Beiträge: 177 Registriert: 29.03.2005 Dell Latitude E5500 Core2Duo 2,53GHz 3,45 GB RAM Win XP Prof. SP3 Office 2003 Prof. Catia V4.2.4 Catia V5R19 i break together
|
erstellt am: 06. Mrz. 2009 09:08 <-- editieren / zitieren --> Unities abgeben: Nur für Jürgen56
Hallo, vielen Dank für die ausführliche Erklärung. so langsam wächst mein Verständnis für die Vorgänge die da passieren. In dem zusammenhang habe ich ein problem.... Beim ausführen eines bestimmten Makros hängt sich Excel jedes mal auf und muss neu gestartet werden. kann einer von euch in dem nachfolgenden Code einen Fehler entdecken ? Code: Sub Neues_Thema() ' Dim Nr As Integer' ActiveCell.EntireRow.Range("F1").Select Do Selection.End(xlDown).Select Loop Until ActiveCell.Value = "Ende der Liste" Nr = ActiveCell.EntireRow.Range("B1").Offset(1, 0).Value + 1 Selection.EntireRow.Insert Selection.EntireRow.Insert Selection.Rows.Ungroup Call Überschrift ActiveCell.EntireRow.Range("A1").Select ActiveCell.Value = LastMeetingNumber ActiveCell.Offset(0, 1).Value = Nr ActiveCell.Offset(1, 4).Value = LastMeetingDate ActiveCell.Range("A1:A2").EntireRow.Font.ColorIndex = 41 ActiveCell.Offset(0, 2).Select End Sub
------------------ Am lautesten werden Lehrer, wenn sie "Ruhe!" brüllen. Lattenrost ist keine Geschlechtskrankheit !! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Paulchen Mitglied Bauing./SW-Entwickler
Beiträge: 1227 Registriert: 19.08.2004 Büro: Win10 Enterprise 64bit, Office Professional Plus 2013 - Privat: Linux Mint 15, LibreOffice
|
erstellt am: 06. Mrz. 2009 09:31 <-- editieren / zitieren --> Unities abgeben: Nur für Jürgen56
Hallo DegraA, in VBA F1 drücken, Suche nach: unterbrechen --> Haltemodus: Die Tastenkombination STRG+Pause hält den Code an. Ich vermute, bei "Loop Until ActiveCell.Value = "Ende der Liste" " ist der Fehler (ich lasse den Code NICHT laufen): VBA rennt so lange durch die Schleife, bis die aktive (!) Zelle den Wert "Ende der Liste" enthält. Wenn Dein Cursor beim Aufruf des Makros in einer anderen Zelle steht, rennt die Schleife endlos. ------------------ DIN1055.de | Lastannahmen für Anwender NEU: Foren zu DIN 1055 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Thomas Harmening Moderator Arbeiter ツ
Beiträge: 2897 Registriert: 06.07.2001 Das Innerste geäussert und aufs Äusserste verinnerlicht
|
erstellt am: 06. Mrz. 2009 12:42 <-- editieren / zitieren --> Unities abgeben: Nur für Jürgen56
Zitat: Original erstellt von Paulchen: VBA rennt so lange durch die Schleife, bis die [b]aktive (!) Zelle den Wert "Ende der Liste" enthält.[/B]
Wobei Selection.End(xlDown).Select schon bis zur letzten Zelle der Reihe F springt, da ist dann nichts mehr mit Finden des Wertes 'Ende der Liste!;) Ich würde mal den Schnippsel bis Nr= durch das hier ersetzen
Code: lz = Cells.Find("Ende der Liste", [F1], , , xlByRows, xlPrevious).Row Range("F" & lz).Activate
dannach läufe es mit Nr = ActiveCell.EntireRow.Range("B1").Offset(1, 0).Value + 1 weiter, es soll ja der B1-Wert+1 aus der Zeile mit Ende der Liste genommen werden = Nr und ruhig mal mit der F8 das makro ablaufen lassen und den Curser über die Variablen halten. BTW, Fragmente eines Codes zu posten bringt IHMO nur was, wenn man auch der Meinung ist, das es ausreicht. Wenn man aber selber den Code nicht lesen/verstehn kann ist es besser den kompletten Code / mappe zu uppen, als immer das Scheibchenweise nachliefern weitere Problemchen... <abgesehen davon das dann die Weiterbehandlung nicht mehr dem Thread entspricht - IHMO neues Thema aufmachen.> Was zb. Call Überschrift macht/drinnen steht könnte ja auch eine mögliche ursache des Fehlers sein...
und dann gäbe es noch die Escape - Taste, um den Code abzubrechen zb. wegen der Endlosschleife. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
DegraA Mitglied staatl. gepr. Techniker - Maschinenbau
Beiträge: 177 Registriert: 29.03.2005 Dell Latitude E5500 Core2Duo 2,53GHz 3,45 GB RAM Win XP Prof. SP3 Office 2003 Prof. Catia V4.2.4 Catia V5R19 i break together
|
erstellt am: 06. Mrz. 2009 19:41 <-- editieren / zitieren --> Unities abgeben: Nur für Jürgen56
Hallo, besten Dank für eure Erklärungen !!! Werde mich am we mal hinsetzen und bissl rumprobieren. Einige Zellenabfragen und bezüge verschieben und dann sollte es wieder laufen ^^ falls ich noch fragen haben sollte, dann wende ich mich wieder vertrauensvoll an euch. Wollte extra keinen neuen Fred eröffnen um nicht das board zu überschwämmen. Hatte doch sinn her etwas damit zu tun.... ------------------ Am lautesten werden Lehrer, wenn sie "Ruhe!" brüllen. Lattenrost ist keine Geschlechtskrankheit !! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |