Eigene VBA-Funktion in Tabellenblatt verwenden

Informationen und Beispiele zu den hier genannten Dialog-Elementen:
Label
Bild

Betrifft: Eigene VBA-Funktion in Tabellenblatt verwenden
von: Alexander Früh
Geschrieben am: 10.03.2005 11:37:10
Hallo,
ich habe ein Tabellenblatt, in dem ich eine selbstgeschriebene VBA-Funktion verwenden möchte.
Die Funktion funktioniert auch soweit, lediglich mit der Eingabe im Arbeitsblatt haperts.
Und zwar benötigt die Funktion als Eingabe einen Zellbereich und eine Zeilennummer, und genau die Zeilennummer ist das Problem.
Ich hätte gerne, dass wenn der Benutzer eine Zelle auswählt, automatisch die ganze Zeile ausgewählt wird, genau wie im Dialog "Seite einrichten"-"Tabelle"-"Wiederholungszeilen oben". Dort hat man den gleichen Vorgang.
Wie kriege ich das mittels VBA hin? Geht das überhaupt?
Vielen Dank für eure Hilfe.
Gruß Alex

Bild

Betrifft: AW: Eigene VBA-Funktion in Tabellenblatt verwenden
von: Volker
Geschrieben am: 10.03.2005 12:11:23
Hallo Alex,
suchst Du so etwas:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
selection.entirerow.select
End Sub

Gruß
Volker
Bild

Betrifft: AW: Eigene VBA-Funktion in Tabellenblatt verwenden
von: Alexander Früh
Geschrieben am: 10.03.2005 12:22:14
Hallo Volker,
danke für Deine Antwort. Ich denke, dass dies die Funktion ist, die ich suche, nur weiß ich nicht, wie ich diese jetzt einbauen soll.
Ich habe die Funktion in Personl.xls als Public deklariert, d.h. sie steht immer zur Verfügung.
Wenn ich die Prozedur von Dir jetzt ebenfalls in Personl.xls einbaue, bezieht sich das doch auf die aktuelle Tabelle, allerdings dann auch immer, d.h. wenn ich eine Zelle auswähle, markiert es mir die ganze Zelle. Ich möchte das aber nur auf diese Funktion beschränkt haben. Oder habe ich da einen Denkfehler?
Gruß Alex
Bild

Betrifft: AW: Eigene VBA-Funktion in Tabellenblatt verwenden
von: Martin Beck
Geschrieben am: 10.03.2005 12:18:51
Hallo Alexander,
poste doch mal den Code der Funktion und beschreibe, wie Du Dir die Eingabe vorstellst.
Gruß
Martin Beck
Bild

Betrifft: AW: Eigene VBA-Funktion in Tabellenblatt verwenden
von: Alexander Früh
Geschrieben am: 10.03.2005 12:33:40
Hallo Martin,
hier der Code:
'*****Code Start*******
Public

Function GetLabelMin(Zellbereich As Range, Spaltenüberschrift As Range) As Variant
Dim mySearchRange, myHeaderRange, mySearchValue
Dim strRangeSelection$, myFound, myColumn, i%, strColumn$
    Application.ScreenUpdating = False
    mySearchRange = Zellbereich
    myHeaderRange = Spaltenüberschrift
    strRangeSelection$ = ActiveWindow.RangeSelection.Address
    mySearchValue = Application.WorksheetFunction.Min(mySearchRange)
    myFound = Application.WorksheetFunction.Match(mySearchValue, mySearchRange, 0)
    strColumn$ = Left(mySearchRange, 1)
    i% = 1
    Do Until strColumn$ <> "$"
        'hier muss ich die erste amrkierte Spalte aus dem Range-Objekt auslesen?????
        strColumn$ = Mid(mySearchRange, i%, 1)
        i% = i% + 1
    Loop
    myColumn = Range(strColumn$ & ":" & strColumn$).Column + myFound - 1
    GetKayeLabelMin = Cells(Left(myHeaderRange, 1), myColumn)
    Range(strRangeSelection$).Select
    Application.ScreenUpdating = True
End Function

'*****Code Ende*******
Die Eingabe soll so aussehen, dass der Benutzer einen Zellbereich markiert, in dem gesucht werden soll, und einen, in dem die Überschriften stehen.
Für die Überschriften benötige ich ja aber nur die Zeile, da die Spalte von dem Suchergebnis (Zelle) festgelegt wird, wo sich der gefundene Wert befindet.
Herauskommen soll dann eben die Überschrift der Spalte.
Ein nächstes Problem ist jetzt noch aufgetaucht, dass ich aus einem markierten Bereich die erste Zelle auslesen muss, also Range("B4:S4") soll zu "B:B" werden.
Ich hoffe, dass alles soweit verständlich ist.
Gruß Alex
Bild

Betrifft: AW: Eigene VBA-Funktion in Tabellenblatt verwenden
von: Volker
Geschrieben am: 10.03.2005 13:03:15
Hallo Alex,
zum 2. Problem:
mach es doch über den Spaltenindex der Markierung:
spalte=selection.column ergibt in deinem Bsp. 2
Gruß
Volker
Bild

Betrifft: AW: Eigene VBA-Funktion in Tabellenblatt verwenden
von: Alexander Früh
Geschrieben am: 10.03.2005 13:34:08
Hallo Volker,
irgendwie klappt es mit der Column-Eigenschaft nicht, da es mir immer sagt, es sei ein Objekt erforderlich, obwohl mySearchRange ein Range-Objekt ist.
Hier der Ausdruck:
strColumn$ = mySearchRange.Select
Gruß Alex
Bild

Betrifft: AW: Eigene VBA-Funktion in Tabellenblatt verwenden
von: Volker
Geschrieben am: 10.03.2005 14:06:25
Also ich steh mit Range-Variablen selber auf Kriegsfuß und arbeite lieber mit Adressen als string:
Schau Dir doch mal im Editor die Werte deiner Var's an
Das eine Range-Variable keine ist merkst du daran, daß z.B.
Zellbereich.select
einen Fehler gibt.
Was auf jeden Fall geht
mySearchRange = Zellbereich.address
und dann z.B.
Range(mySearchRange).select
Was mir noch aufgefallen ist:
sollte es nicht statt strRangeSelection$ = ActiveWindow.RangeSelection.Address eher
strRangeSelection$ = ActiveWindow.Selection.Address lauten?
Gruß
Volker
Bild

Betrifft: AW: Eigene VBA-Funktion in Tabellenblatt verwenden
von: Alexander Früh
Geschrieben am: 10.03.2005 14:22:23
Hallo Volker,
mySearchRange = Zellbereich.Address oder Zellbereich.Select funktionieren z.B. nicht.
Ich erhalte beim Ausführen die Fehlermeldung Objekt erforderlich.
Ich würde auch lieber mit Strings arbeiten, aber wenn der Benutzer mit dem Cursor Zellen markiert, liefert mir das leider ein Range-Objekt zurück, oder nicht?
strRangeSelection$ = ActiveWindow.RangeSelection.Address
strRangeSelection$ = ActiveWindow.Selection.Address
Geht beides!
Gruß Alex
Bild

Betrifft: AW: Eigene VBA-Funktion in Tabellenblatt verwenden
von: Volker
Geschrieben am: 10.03.2005 14:40:16
Hallo Alex,
sag ich doch: Zellbereich soll ein Range sein, Zellbereich.Select funktioniert aber nicht.
mySearchRange = Zellbereich.Address geht nicht, weil die Variable eben als Range deklariert ist, aber Zellbereich.Address ein string ist.
Wie gesagt, alles Käse mit den Ranges.
Kurz und gut, ich würd es etwa so machen:

Sub Makro1()
Dim bereich As String
bereich = Selection.Address
mySearchValue = Application.WorksheetFunction.Min(Range(bereich))
End Sub

Oder ganz kurz und ohne Umwege (eben weil selection ein Rangeobjekt ist:

Sub Makro1()
mySearchValue = Application.WorksheetFunction.Min(Selection)
End Sub

Ich hoffe Sie konnten geholfen werden.
Gruß
Volker
Bild

Betrifft: AW: Eigene VBA-Funktion in Tabellenblatt verwenden
von: Martin Beck
Geschrieben am: 10.03.2005 13:07:18
Hallo Alexander,
das war wohl ursprünglich mal ein Makro. Einige Sahen sind mir noch unklar, vermutlich weil der Code etwas "umständlich" ist.
Kannst Du noch einmal die Problemstellung verbal genauer beschreiben? Ich verstehe es so, das Du einen Zellenbereich hast (z.B. C4:F20). Dann hast Du Spaltenüberschriften, aber worauf beziehen die sich? Stehen die irgendwo über dem Zellenbereich, d.h. die Spalten überschrift "gehören" zu dem Zellenbereich und stehen z.B. in C1:F1? Oder könnte für Spaltenüberschriften auch G1:M1 markiert werden.
Ich nehme mal an Zellenbereich und Spaltenüberschriften geören zusammen. Dann suchst Du das Minimum in Zellenbereich (z.B. gefunden in C7) und anschließend soll die Funktion die Spaltenüberschrift auf dieser Spalte zurückgeben, also den Inhalt von C1 (in diesem Beispiel). Ist das so richtig?
Gruß
Martin Beck
Bild

Betrifft: AW: Eigene VBA-Funktion in Tabellenblatt verwenden
von: Alexander Früh
Geschrieben am: 10.03.2005 13:40:59
Hallo Martin,
also meine Tabelle sieht so aus:
T1 T2 T3 T4 ...
15:00:00 25,1 23,4 26,4 24,7
15:05:00 26,3 23,5 28,1 23,5
15:10:00 26,5 24,1 29,9 25,7
...
Ich möchte jetzt z.B. für den Bereich "B2:E2" muss am Ende "T2" rauskommen, da um 15:00:00 Uhr die minimale Temperatur 23,4°C an Fühler T2 gemessen wurde.
Der Benutzer soll jetzt einmal den Suchbereich auswählen ("B2:E2") und die Überschriftszeile (1. Zeile), wobei beim Auswwählen der Überschriftszeile beim Markieren einer Zelle automatisch die gesamte Zeile ausgewählt werden soll.
Ich denke jetzt sollte es etwas klarer sein.
Gruß Alex
Bild

Betrifft: AW: Eigene VBA-Funktion in Tabellenblatt verwenden
von: Martin Beck
Geschrieben am: 10.03.2005 14:42:22
Hallo Alexander,
versuche mal

Function GetLabelMin2(Zellbereich As Range, Spaltenüberschrift As Range) As Variant
myRow = Spaltenüberschrift.Row
mySearchValue = Application.WorksheetFunction.Min(Zellbereich)
For Each cell In Zellbereich
    If cell = mySearchValue Then
        GetLabelMin2 = Cells(myRow, cell.Column)
        Exit For
    End If
Next
End Function

Als Eingaben werden z.B. akzeptiert:
=GetLabelMin2(B2:E4;B1)
=GetLabelMin2(B2:E4;B1:B4)
=GetLabelMin2(B2:E4;1:1)
Gruß
Martin Beck
Bild

Betrifft: AW: Eigene VBA-Funktion in Tabellenblatt verwenden
von: Alex
Geschrieben am: 10.03.2005 15:01:16
Hallo Martin,
also die Funktion liefert mir jetzt den korrekten Wert, aber das mit der Zellauswahl hatte ich etwas anders gemeint.
Der Benutzer wählt jetzt eine Zelle aus, die auch eingetragen wird, und intern wird daraus dann die Reihe ausgelesen.
Ich würde aber lieber gleich bei Auswahl der Zelle die gesamte Reihe auswählen. Vielleicht kennt jemand dafür noch eine Lösung.
Danke.
Gruß Alex
Bild

Betrifft: AW: Eigene VBA-Funktion in Tabellenblatt verwenden
von: Martin Beck
Geschrieben am: 10.03.2005 15:22:18
Hallo Alexander,
ich verstehe nicht, wozu das gut sein soll. Wie stellst Du dir das Handling der Funktion/der Eingabe konkret vor, und welchen Grund gibt es dafür?
Gruß
Martin Beck
Bild

Betrifft: AW: Eigene VBA-Funktion in Tabellenblatt verwenden
von: Alex
Geschrieben am: 10.03.2005 15:30:13
Hallo Martin,
der Grund dafür ist rein optisch, um dem Benutzer direkt bei der Eingabe zu signalisieren, hier wird lediglich eine ZEILE benötigt, und nicht irgendein bestimmter Zellbereich.
Schau Dir mal den Dilaog "Seite einrichten" - "Tabelle" an. Klicke mal hinter dem Eingabefeld für die "Wiederholungszeilen oben" auf den Button, um das Dialogfenster zu minimieren und den Bereich mittels Cursor im Tabellenblatt zu markieren.
Hier habe ich gar keine Möglichkeit eine einzelne Zelle auszuwählen, sondern nur ganze Zeilen, da dies letzten Endes auch benötigt wird.
So hatte ich mir das hier auch vorgestellt. Ich weiß nur nicht, ob's machbar ist.
Gruß Alex
Bild

Betrifft: AW: Eigene VBA-Funktion in Tabellenblatt verwenden
von: Martin Beck
Geschrieben am: 10.03.2005 15:58:57
Hallo Alex,
das geht nicht. Im Prinzip kann man zwar das Worksheet_SelectionChange-Ereignis verwenden, um beim Anklicken einer Zelle die ganze Zeile zu markieren. Hier mal ein Beispiel für Zeile 1:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Row = 1 Then Rows(Target.Row).Select
End Sub

Das funktioniert aber nicht, wenn Du die Eingabe der Parameter einer Funktion per Maus erledigst, da auf diese Weise das SelectionChange-Ereignis nicht ausgelöst wird.
Und m.E. brauchst Du es auch nicht, da der Benutzer ja irgendeine Zelle oder auch mehrere markieren kann und das Ergebnis ist immer richtig.
Also: an dieser Stelle ist einfach Ende der Fahnenstange.
Gruß
Martin Beck
Bild

Betrifft: noch mal von vorn
von: Volker
Geschrieben am: 10.03.2005 15:57:26
Hallo Alex,
erklär mir doch mal, wo Du Deine Function eigebaut hast und wie sie ausgelöst wird?
Steht Sie in Deiner Excel-Start über einen Button zur Verfügung?
Markiert der User eine Zelle und drückt dann auf den Button?
Dann kannst Du erst recht
selection.entirerow.select
nehmen. Du mußt die Zeile nur in deine function einbauen.
Und den ganzen Rest, den ich Dir gegeben hab, kannst Du dann auch verwenden.
Ich versteh echt nicht, wo Dein Problem ist.
Gruß
Volker
Bild

Betrifft: AW: noch mal von vorn
von: Alex
Geschrieben am: 10.03.2005 16:13:38
Hallo Volker,
also meine Function habe ich in der Personl.xls (Excel-Start) eingebaut, damit sie excelweit zur Verfügung steht.
Die Function rufe ich darüber auf, dass ich die Zelle markiere, in der mein Ergebnis stehen soll, und dann in der Bearbeitungsleiste auf die Funktionsschaltfläche (fx) klicke. Es öffnet sich ein Fenster, in dem ich alle Funktionen in Excel angezeigt bekomme, und mir die passende auswählen kann.
Ich wähle nun meine Function aus und klicke auf OK. Dann öffnet sich ein weiteres Fenster, in dem ich dann entweder die Bereiche manuell eintrage, oder über minimieren mit dem Cursor im Tabellenblatt den Bereich markiere (der markierte Bereich erhält dann einen gestrichelten Laufrahmen), der dann automatisch in das Dialogfenster übernommen wird. Mit OK schließe ich die Formel ab, und sie steht in der Zelle und zeigt das Ergebnis an.
Ich füge sie also wie jede von Excel bereitgestellte Formel ein.
Bei der Eingabe über Cursor wollte ich jetzt eben die ganze Zeile automatisch auswählen lassen, aber die Funktion funktioniert auch ohne diese "Spielerei". Wäre halt schön gewesen.
Trotzdem danke.
Gruß Alex
Bild

Betrifft: AW: noch mal von vorn
von: Volker
Geschrieben am: 10.03.2005 17:04:46
Hallo Alex,
hast recht, wär 'ne schöne Spielerei.
Aber eigentlich kannst Du Dir deine function auch sparen und es über eine Tabellenfunktion machen, die Dir auch die Spaltenüberschrift über dem Min-Wert liefert
Hier mal ein Bsp.:
https://www.herber.de/bbs/user/19472.xls

Die Formel versagt, wenn zwei Temperaturen gleich sind, aber das kriegt man ev. auch noch hin. War ja auch nur mal zum gucken.
In diesem Sinne:
Ciao bis zum nächsten Problem
Volker
 Bild

Beiträge aus den Excel-Beispielen zum Thema "Eigene VBA-Funktion in Tabellenblatt verwenden"