Hot News:

Unser Angebot:

  Foren auf CAD.de (alle Foren)
  Excel
  VBA-Benutzerdefinierte Funktionen

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
Autor Thema:  VBA-Benutzerdefinierte Funktionen (4125 mal gelesen)
Jürgen56
Mitglied
Dipl.-Ing. Verkehrswesen (Eisenbahn)


Sehen Sie sich das Profil von Jürgen56 an!   Senden Sie eine Private Message an Jürgen56  Schreiben Sie einen Gästebucheintrag für Jürgen56

Beiträge: 23
Registriert: 05.05.2004

erstellt am: 10. Jan. 2006 16:46    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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


Sehen Sie sich das Profil von BJ an!   Senden Sie eine Private Message an BJ  Schreiben Sie einen Gästebucheintrag für BJ

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Jürgen56 10 Unities + Antwort hilfreich

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



Sehen Sie sich das Profil von rainberg an!   Senden Sie eine Private Message an rainberg  Schreiben Sie einen Gästebucheintrag für rainberg

Beiträge: 147
Registriert: 14.01.2005

erstellt am: 10. Jan. 2006 17:47    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Jürgen56 10 Unities + Antwort hilfreich

Hallo Jürgen,

vielleicht hilft dir Folgendes:

Code:
Option Explicit

Sub 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


Sehen Sie sich das Profil von startrek an!   Senden Sie eine Private Message an startrek  Schreiben Sie einen Gästebucheintrag für startrek

Beiträge: 1361
Registriert: 13.02.2003

.

erstellt am: 10. Jan. 2006 17:59    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Jürgen56 10 Unities + Antwort hilfreich

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 ツ




Sehen Sie sich das Profil von Thomas Harmening an!   Senden Sie eine Private Message an Thomas Harmening  Schreiben Sie einen Gästebucheintrag für Thomas Harmening

Beiträge: 2897
Registriert: 06.07.2001

Das Innerste geäussert
und aufs Äusserste verinnerlicht

erstellt am: 11. Jan. 2006 21:33    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Jürgen56 10 Unities + Antwort hilfreich

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)


Sehen Sie sich das Profil von Jürgen56 an!   Senden Sie eine Private Message an Jürgen56  Schreiben Sie einen Gästebucheintrag für Jürgen56

Beiträge: 23
Registriert: 05.05.2004

erstellt am: 18. Jan. 2006 13:21    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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


Sehen Sie sich das Profil von DegraA an!   Senden Sie eine Private Message an DegraA  Schreiben Sie einen Gästebucheintrag für DegraA

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Jürgen56 10 Unities + Antwort hilfreich

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


Sehen Sie sich das Profil von Nepumuk an!   Senden Sie eine Private Message an Nepumuk  Schreiben Sie einen Gästebucheintrag für Nepumuk

Beiträge: 351
Registriert: 16.10.2004

erstellt am: 05. Mrz. 2009 23:43    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Jürgen56 10 Unities + Antwort hilfreich

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


Sehen Sie sich das Profil von DegraA an!   Senden Sie eine Private Message an DegraA  Schreiben Sie einen Gästebucheintrag für DegraA

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Jürgen56 10 Unities + Antwort hilfreich

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


Sehen Sie sich das Profil von Paulchen an!   Senden Sie eine Private Message an Paulchen  Schreiben Sie einen Gästebucheintrag für Paulchen

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Jürgen56 10 Unities + Antwort hilfreich

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 ツ




Sehen Sie sich das Profil von Thomas Harmening an!   Senden Sie eine Private Message an Thomas Harmening  Schreiben Sie einen Gästebucheintrag für Thomas Harmening

Beiträge: 2897
Registriert: 06.07.2001

Das Innerste geäussert
und aufs Äusserste verinnerlicht

erstellt am: 06. Mrz. 2009 12:42    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Jürgen56 10 Unities + Antwort hilfreich

     
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.


BTWBy the way (So nebenbei bemerkt), 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


Sehen Sie sich das Profil von DegraA an!   Senden Sie eine Private Message an DegraA  Schreiben Sie einen Gästebucheintrag für DegraA

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für Jürgen56 10 Unities + Antwort hilfreich

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

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz