Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1532to1536
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
Index/Vergleich Funktion in VBA
04.01.2017 12:24:41
JonnyBank
Hallo Freunde,
Ich wünsche euch ein Frohes neues Jahr!
Ausgangslage:
Ich habe eine Eingabe-Maske wo verschiedene Programme ausgewählt werden die dann wiederum verschiedene Eigenschaften haben. Im Moment werden diese Programmspezifischen Eigenschaften per Index/Vergleichs Formel ermittelt. Nun möchte mein Chef gerne das diese "Werte" manuell anpassbar sind und die hinterlegten Werte nur als Standardwerte ermittelt werden.
Die "Werte" werden für später Berechnungen durch ein Makro benötigt.
Somit ist die Verwendung einer Formel nicht möglich... nur eine Betriebsversion (Excel) für ca. 15 Mitarbeiter
Meine Überlegung
wird Zelle Programm verändert dann
nutze Index/vergleichfunktion um den entsprechenden wert zu ermitteln
speicher diesen wert in der variablen "a"
Eigenschaft A = "a"
usw. nur fehlen mir das entsprechende wissen bezüglich der Syntax
mit dem Recorder aufnehmen kommt gleicher auch nichts brauchbares raus...
wäre schön wenn mir jemand da helfen könnte grade was die indexfunktion angeht mit einer Beschreibung was spalte und was zeile ist.
mfg JonnyBank

21
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Bahnhof
04.01.2017 14:30:17
Michael
Hallo!
Kann mir vorstellen, dass es anderen Helfer_innen auch so geht: Ich verstehe leider nicht, was Du brauchst/suchst.
Beschreibe doch noch einmal kurz was Du hast und was Du suchst bzw. welche Aufgabe (in der Tabelle) ein Makro erledigen soll; denk dabei daran, dass wir keine Ahnung von Deinem Beruf, Deiner konkreten Tätigkeit, geschweige denn Deiner Arbeitsmappe und Tabellenstruktur haben.
LG
Michael
AW: Bahnhof
04.01.2017 14:44:57
JonnyBank
Hab ich doch oder nicht?!
Ok neuer Versuch:
Teil 1:
Ich habe eine Eingabemaske wo je nachdem welches Programm( Programm A ; B ;C ) ausgewählt wird bestimmte Eigenschaften hinterlegt wurden. Diese werden im Moment per Index-/Vergleichs- Funktion bestimmt. Mit diesen ermittelten Werten errechnet ein Makro einen Zinssatz aus das durch einen Button ausgeführt wird.
Teil 2:
Aufgabenstellung: Diese Eigenschaften sollen per VBA ermittelt und übergeben werden, denn es soll möglich sein dort manuell einen anderen Wert einzutragen und dann die Berechnung per Makro zu starten.
durch eine manuelle Eingabe würde somit jede hinterlegte Formel gelöscht deswegen VBA
Es geht mir vor allem um die Schreibweise in VBA bezüglich der Index und Vergleichsfunktion mit kleinen Kommentaren.
hoffe das war jetzt deutlicher =)
mfg Jonny
Anzeige
AW: Bahnhof
04.01.2017 14:52:26
Michael
Hi,
auch ich verstehe leider nur Bahnhof.
"Eingabemaske": Userform? Tabellenbereich?
"Eigenschaften": wie viele? Wo?
"manuell anderer Wert": wann? Während der Makro-Laufzeit mit Inputboxen? In einem anderen Tabellenbereich?
Eine (anonymisierte) Beispieldatei wäre hilfreich...
Schöne Grüße,
(ein weiterer) Michael
AW: ......Mainstation
04.01.2017 15:10:39
Gerd
'Somit ist die Verwendung einer Formel nicht möglich...
Hi Jonny!
The reend ends here, the frontend will continue. :-)
Auf theoretisierende Fragen gibt es nur halbwegs passende Antworten.
Sub Geht_nicht_gibt_s_nicht()
Dim meine_Variable As Variant
meine_Variable = Evaluate("=Tabelle1!A1+Tabelle1!B1")
MsgBox meine_Variable
End Sub
Gruß Gerd
Anzeige
AW: ......Mainstation
04.01.2017 15:19:30
JonnyBank
https://www.herber.de/bbs/user/110331.xlsx
D3-D7 soll also manuell verändert werden können
deswegen Daten per vba aus controllingdaten ziehen übergeben und dann manuell bearbeiten
die Übergabe Makro soll dann ausgelöst werden wenn D2 verändert wurde (Change Funktion oder so)
Last station, we have arrived at our destination..
04.01.2017 15:54:51
Michael
Hi!
In Deiner Bsp-Datei: https://www.herber.de/bbs/user/110332.xlsm
Code liegt im Modul der Tabelle "Eingabemaske".
Passt?
LG
Michael
AW: Last station, we have arrived at our destination..
04.01.2017 15:56:58
JonnyBank
Ich schau später mal auf privaten Rechner weil ich die Datei auf Arbeit nicht öffnen darf...
aber schon mal danke für die Hilfe
mfg Jonny
Anzeige
Falls Du vorher schon testen willst...
04.01.2017 17:06:32
Michael
Jonny,
...kannst Du in Deiner Bsp-Datei auch einfach selbst diesen Code einfügen (ReKlick auf den Tabellenblatt-Reiter "Eingabemaske" - Code anzeigen - dort einfügen):
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Wb As Workbook: Set Wb = ThisWorkbook
Dim WsQ As Worksheet: Set WsQ = Wb.Worksheets("Controllingdaten")
Dim Prog$, Sp, Such As Range, rIn As Range, rOut As Range, i&
If Target.Address = "$D$2" And Target.Cells.Count = 1 Then
Prog = Target.Value
With WsQ
Set Such = .Range(.Cells(3, 3), .Cells(3, .Columns.Count).End(xlToLeft))
Sp = Application.Match(Prog, Such, 0)
If Not IsError(Sp) Then
Set rIn = Me.Range(Me.Cells(3, 4), Me.Cells(7, 4))
Set rOut = .Cells(3, Sp + 2).Offset(1, 0).Resize(5, 1)
For i = 1 To rIn.Cells.Count: rIn(i) = rOut(i): Next i
End If
End With
End If
End Sub
Dann musst Du meine Datei nicht laden...
LG
Michael
Anzeige
AW: Falls Du vorher schon testen willst...
05.01.2017 13:08:35
JonnyBank
Danke! Ich habe es gestern nicht mehr geschafft ...
Hab noch was auf Tisch aber versuch es heute zu testen..
Ok, gib Bescheid! owT
05.01.2017 13:28:29
Michael
AW: Ok, gib Bescheid! owT
09.01.2017 08:33:49
JonnyBank
Es funktioniert sehr gut! Nur leider fehlen mir ein paar Kommentare um zu verstehen was genau dort passiert, um die Funktion auf die richtige Datei abzuändern.
Set Such = .Range(.Cells(3, 3), .Cells(3, .Columns.Count).End(xlToLeft))
Sp = Application.Match(Prog, Such, 0)
If Not IsError(Sp) Then
Set rIn = Me.Range(Me.Cells(3, 4), Me.Cells(7, 4))
Set rOut = .Cells(3, Sp + 2).Offset(1, 0).Resize(5, 1)
For i = 1 To rIn.Cells.Count: rIn(i) = rOut(i): Next i
versteh ich nur Bahnhof. Was machen z.B die Zahlen
Anzeige
Code kommentiert...
09.01.2017 10:23:21
Michael
Hallo Jonny,
'Nutzung des Änderungs-Ereignisses auf dem betroffenen Tabellenblatt
'D.h. werden Zellen (in einem bestimmten Bereich) geändert, "feuert"
'das Ereignis und der nachfolgende Code wird ausgeführt
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Wb As Workbook: Set Wb = ThisWorkbook
Dim WsQ As Worksheet: Set WsQ = Wb.Worksheets("Controllingdaten")
Dim Prog$, Sp, Such As Range, rIn As Range, rOut As Range, i&
'Bestimmung der Bedingungen, ob der nachfolgende Code ausgeführt
'werden soll:
'Wenn die geänderte Zelle "D2" auf diesem Blatt ist (jenes Blatt
'in dessen Code-Modul dieser Code liegt) UND auch nur diese eine
'Zelle betroffen ist (keine Auswahl mehrerer Zellen) dann wird der
'nachfolgende Code ausgeführt
If Target.Address = "$D$2" And Target.Cells.Count = 1 Then
'Der eingegebene Zellwert wird zum Suchbegriff
Prog = Target.Value
'WSQ ist das Quellblatt (aus dem die Daten geholt werden), wie
'oben definiert, idF das Blatt "Controllingdaten" in dieser Arbeitsmappe
With WsQ
'Auf dem Quellblatt wird jener Bereich bestimmt, in dem der Suchbegriff
'gesucht wird, hier ab Zelle C3 bis zur letzten gefüllten Zelle in dieser
'Zeile (Zeile 3):
'.Cells(3,3) = Zelle C3 --> Range(Zeile, Spalte) (Spalte C = Spalte 3)
'.Cells(3,.Columns.Count).End(xltoleft) kann man sich wie das manuelle
'"Springen" mit dem Zell-Cursor in Excel vorstellen:
'Ausgehend von der letzten Spalte in Zeile 3 (.Columns.Count = als Spalten-
'Nummer wird die gesamte Anzahl an Spalten der Zeile angesetzt) springt
'Excel nun nach links zur ersten gefüllten Zelle - das ist dann quasi
'das Zeilenende in unserem Suchbereich. D.h. der Suchbereich reicht von
'Spalte 3 bis zu der Spalte dieses Spaltenendes.
Set Such = .Range(.Cells(3, 3), .Cells(3, .Columns.Count).End(xlToLeft))
'Wir suchen den Suchbegriff im Suchbereich:
'Wird der Begriff im Bereich gefunden, gibt uns diese Funktion die Position
'des Begriffs im Bereich an (!); d.h., nachdem wir hier ja in einer Zeile, aber
'in mehreren Spalten suchen, erhalten wir, wenn der Begriff gefunden wird, die
'Angabe in welcher Spalte des Bereichs der Begriff vorkommt
Sp = Application.Match(Prog, Such, 0)
'Wenn der Begriff gefunden wird, werden Daten übertragen, wenn nicht, passiert
'nichts
If Not IsError(Sp) Then
'Wir definieren den Zielbereich (in den die Daten kopiert/übertragen werden)
'Der Zielbereich liegt ja auf diesem Arbeitsblatt (jenes Blatt in dessen
'Code-Modul) dieses Makro steht - dieses Blatt lässt sich idF mit "Me"
'ansprechen... Der Zielbereich wird nun wieder über Zell-Adressen definiert:
'Zelle(3,4) = D3, Zelle(7,4) = D7
Set rIn = Me.Range(Me.Cells(3, 4), Me.Cells(7, 4))
'Aufgrund des gefundenen Suchbegriffs, der ja eine Spaltenzahl zurückgibt,
'können wir auch den Quellbereich, aus dem wir die Daten holen, eindeutig
'definieren:
'Zelle(3, Sp +2) = Zeile 3 in der Spalte, die sich wie folgt definiert:
'Ist der gefundene Begriff zB in der 3. Spalte des Suchbereichs, dann gibt
'uns die Suchfunktion "3" zurück - nachdem wir den Suchbereich aber erst ab
'Spalte 3 (siehe oben [Set Such = .Range(.Cells(3, 3),]) beginnen lassen, mü _
ssen
'wir 2 Spalten (nämlich A+B bzw. 1 + 2) zu jeder gefundenen Spaltenzahl  _
hinzuaddieren,
'dass wir einen korrekten Blattbereich erhalten).
'[.Cells(3, Sp + 2)] wäre nun die Zelle im Quellbereich, die unseren  _
Suchbegriff enthält,
'die interessiert uns aber inhaltlich nicht, sondern die Zahlen die in der  _
Spalte darunter
'stehen, d.h. - ausgehend von der gefundenen Zelle versetzen wir die Zelle um  _
eine Zeilen
'nach unten, und vergrößern dann die Auswahl auf fünf Zeilen...
Set rOut = .Cells(3, Sp + 2).Offset(1, 0).Resize(5, 1)
'...und die Werte dieser fünf Zeilen schreiben wir in die Zellen des  _
Zielbereichs
For i = 1 To rIn.Cells.Count: rIn(i) = rOut(i): Next i
End If
End With
End If
End Sub
Es gibt immer verschiedene Wege, an so etwas heranzugehen; das wäre jetzt meiner. Passt?
LG
Michael
Anzeige
AW: Code kommentiert...
09.01.2017 14:11:44
JonnyBank
Hallo Michael,
vielen vielen Dank für deine Mühe ich wird es später nochmal genau lesen und studieren... Danke Danke!
genau so hab ich mir des vorgestellt. =)
Mfg Jonny
Gern! lg und owT
09.01.2017 14:28:59
Michael
AW: Gern! lg und owT
09.01.2017 15:35:15
JonnyBank
hallo Michael,
Ich hab es versuch anzupassen leider tut sich nichts ... hab diesmal die gleichen Zeilen und Spaltenangaben genutzt wie im richtigen Programm ...vielleicht sieht du ja woran es liegen könnte.
vielleicht hab ich etwas nicht richtig verstanden
https://www.herber.de/bbs/user/110422.xlsm
was wäre eigentlich wenn die Reihenfolge der Daten unterschiedlich wäre ?
mfg Jonny
Anzeige
Kein Wunder...
09.01.2017 16:16:44
Michael
Hallo!
vielleicht sieht du ja woran es liegen könnte.
Ja, nämlich...
vielleicht hab ich etwas nicht richtig verstanden
daran, dass dies zutrifft.
Du hast den Code a) nicht korrekt auf Deine Verhältnisse angepasst und b) in dieser neuen Bsp-Datei auch noch andere Verhältnisse in Deiner Mappe im Vergleich zur ersten Datei.
Hab Dir den Code jetzt nochmal in der neuen Datei angepasst: https://www.herber.de/bbs/user/110425.xlsm
Vergleiche den geänderten Code doch mal mit Deinem, vielleicht fällt Dir dann ja schon auf, wo es hakt.
Grds.: Dir jetzt den gesamten Code so zu erklären, dass Du ihn selbständig umschreiben kannst, kann ich hier nicht leisten... Stichwort VBA-Kurs. Daher ist es grds. immer gut, wenn Du hier Anfragen stelslt, dass Deine Angaben gleich von Anfang an möglichst gut zu Deinen konkreten (!) Bedingungen passen - dann bekommst Du immer passenden Code, den Du nicht groß anzupassen brauchst. Bzw. wenn Du angibst, wo Dynamik (also mögliche Änderungen oder Varianten) evtl. gebraucht wird, dann liefern wir Dir Code, den Du dann leichter warten kannst.
was wäre eigentlich wenn die Reihenfolge der Daten unterschiedlich wäre ?
Was meinst Du damit? Es spielt keine Rolle für den Code ob die Reihe "E" zwischen "A" und "B" steht, oder zwischen "D" und "F" - entscheidend ist ja, dass der Code die richtige Spalte aufgrund des Suchbegriffs im Suchbereich (Überschriften) sucht, damit ist eine Reihenfolge egal. Meintest Du es so?
Also: Wenn Du mit dem angepassten Code nicht zurechtkommst, aber noch was für Deine konkrete (!) Mappe brauchst, gib Bescheid bzw. lade nochmal eine Bsp-Datei hoch, die Deine Verhältnisse exakt (!) nachbildet, aber eben ohne echte Daten (Inhalte). Dann schreib ich Dir das so wie Du es brauchst.
LG
Michael
Anzeige
AW: Kein Wunder...
09.01.2017 17:07:04
JonnyBank
Hallo Michael
Hab mir mal deine Datei angesehen aber dort werden keine Werte eingetragen( in der Tabelle Eingabe).
Ist das die richtige Datei?
Mfg Jonny
Mühsam...
09.01.2017 17:24:13
Michael
Jonny,
Ist das die richtige Datei?
Ja, habe den Link soeben getestet.
dort werden keine Werte eingetragen
Das geänderte Makro funktioniert einwandfrei; auf Basis dessen, was ich bisher von Dir weiß. Leider kann ich nicht exakt nachvollziehen was Du mit "dort" meinst - möglicherweise möchtest Du die Daten nun doch anderswohin übertragen haben, leider weiß ich aber nicht wo.
Du musst in der Datei natürlich Inhalte aktivieren (Makros zulassen!).
LG
Michael
Anzeige
AW: Mühsam...
10.01.2017 08:26:01
JonnyBank
Hey Michael,
ich habe wohl vergessen Makros zu aktivieren nun hat es geklappt.
Sorry für die Umstände schönen Tag noch.
mfg Jonny
Alles klar! Gut, ebenfalls schönen Tag! owT
10.01.2017 09:06:36
Michael
AW: ......Mainstation
04.01.2017 16:08:57
Michael
Hi,
damit ist schon mal geklärt, daß die "Eingabemaske" ein Bereich ist.
Schau Dir mal die Datei an: https://www.herber.de/bbs/user/110333.xlsm
Schöne Grüße,
Michael

27 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige