Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1328to1332
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

Excel Ad-In /Funktion

Excel Ad-In /Funktion
28.08.2013 22:24:12
Sebastian
Hallo allerseits!
Ich schreibe nun seit 2 Jahren Makros für meinen Nebenjob. Beigebracht habe ich mir VBA quasi nur durchs testen und Internet-recherchieren. Da ich hierfür oftmals eine Antwort in diesem Forum gefunden habe, stelle ich nun auch meine eigene Frage, die ich durch Googeln bisher nicht lösen konnte hier.
Für mein neuestes privates Excel-Projekt würde ich gerne eine eigene ExcelFunktion/Add-In programmieren, welches folgendes können sollte:
-Ich habe 3000 Excel Sheets, die mit Zahlen gefüllt sind (In der ersten Spalte steht jeweils der Name der Kennzahlen und in der ersten Zeile die verschiedenen Daten (z.B. "Q1-2012"). Diese Sheets liegen alle in einem Verzeichnis und haben alle einen eindeutigen Namen.
-Nun will ich eine solche Funktion haben: =Funktion(Dateiname;Kennzahl;Periode) ,die mir dann logischerweise die richtige Zahl aus einem der zahlreichen Sheets liefert.
Ist also an sich eine ganz simple Geschichte. Ich hänge jedoch gerade daran, wie ich auf eine andere Datei mit dieser Funktion zugreifen kann. Wie das bei einem normalen Makro funktioniert ist mir klar. Aber in der Funktion scheinen ein paar andere Gesetze zu gelten^^.
Ich habe es mit GetObject(C":\......) usw. versucht, aber das funktioniert nicht. Da bekomme ich im Endeffekt nur "#Wert" zurückgemeldet. Wie das ganze mit eine Funktion innerhalb von einer Datei funktioniert habe ich schon zum Großteil verstanden. Die Referenz zu einer anderen Datei (ohne diese zu öffnen) konnte ich mir jedoch immer noch nicht erschließen.
Ich wäre für einen Tipp sehr dankbar, da ich auch mit langem googeln einfach nicht weiter gekommen bin :(
Daanke!!!
Gruß Sebastian

18
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Du meinst Dateien=Mappen=Workbooks, ...
29.08.2013 01:03:30
Luc:-?
nicht Sheets, Sebastian;
Letztere sind die Blätter einer Mappe!
Blatt- oder gar dateiübergreifende datenbereitstellende StandardFunktionen hat XL nicht! In diesem Fall müsstest du mit direkten Zellverweisen arbeiten und dir so die ganze Mappe heranholen, was natürlich irrwitzig und selbstverständlich nicht zu empfehlen ist!
Eine Alternative wäre eine UDF (benutzerdefinierte Fkt in VBA), allerdings könnte die nur auf geöffnete Mappen zugreifen, was eine begleitende Subprozedur (kurzzeitig) ermöglichen müsste, ist also auch kaum zu empfehlen.
Ich schlage deshalb einen definierten Eingabebereich auf einem Blatt oder einem UserForm(ular) vor. Dazu dann eine Subprozedur, die die nötigen Schritte unternimmt (ggf auch unter Einsatz von ExecuteXl4Macro.
Gruß Luc :-?

Anzeige
AW: Du meinst Dateien=Mappen=Workbooks, ...
29.08.2013 09:33:02
Sebastian
Hi Luc, entschuldige die Ungenauigkeit. Ich meine natürlich Mappen und nicht Sheets!
Zu deiner ersten Alternative; Direkte Zellverweise: ist wie du sagst zu unpraktikabel.
dritte Alternative; UserForm mit Subprozedur: Wenn ich das richtig verstehe meinst du damit, das ich z.B. in einem UserForm die benötigten Daten auswähle und dann mit einem "normalen" Makro mir aus den Mappen ziehe? Das ist der ursprüngliche Weg den ich einschlagen wollte. Hatte mir aber mit der UDF erhofft flexibler zu sein. Ich weiß nicht ob du das vll. von den großen Datenanbietern wie Bloomberg kennst. Die haben alle ein Excel Add-In bei denen man wie in meiner ursprünglichen Nachricht eine einfache Funktion eintippen kann und dann die richtige Zahl aus einer Datenbank an die Stelle geladen wird.
2. Alternative UDF: Wenn ich das richtig sehe wäre das ja genau mein Ansatz um möglichst Flexibel mir ein Sheet mit den Daten aus den anderen Mappen zusammenzubasteln. Wenn aber natürlich für jeden Abfrage die Datei einmal geöffnet werden muss, ist das natürlich eher unschön :( (könntest du bitte trotzdem kurz 2 Zeilen Code schreiben wie ich von der UDF auf eine begleitende Subprozedur kurz zugreifen kann um z.B. eine Mappe zu öffnen? , um wieder etwas dazu zu lernen :))
Nun ist mir zu der UDF noch eine Idee gekommen. Was ist wenn ich die ganzen Daten in eine Datenbank (Access oder MySQL) bringe. Kann ich mit einer UDF die Daten komfortabel abfragen? Oder ist auch das nur mit Umständen möglich?
Vielen Dank für deine/eure Hilfe!
Gruß Sebastian

Anzeige
Deine letzte Idee ist die beste, ...
29.08.2013 15:03:24
Luc:-?
…Basti;
damit bist du am flexibelsten! Ich habe allerdings nicht behauptet, dass es mit einer UDF nicht möglich sei, die Daten auszulesen, nur muss die Mappe dann iaR offen sein! Das ergibt das Problem, wer bzw was die öffnet! Dazu müsste auf das DatenausleseAnsinnen der UDF eine Subroutine reagieren (physisch von der UDF „entkoppelt“ – wie ich das nenne –, aber zB über eine Globalvariable von der UDF beeinflusst), die die jeweilige Datei öffnet.
Code kann ich jetzt gerade nicht liefern (bin auf Linux, weil ich vorerst ohnehin keine Zeit habe), habe aber ein Bsp in meinem AddIn. Bei Bedarf ggf später!
Gruß Luc :-?

Anzeige
AW: Deine letzte Idee ist die beste, ...
29.08.2013 16:05:00
Sebastian
Hey Luc,
Ich habe jetzt eine Frage in meiner Antwort auf Klaus auch an dich gerichtet zu dem UDF-Thema. (Verstehe nicht ganz wer hier was angezeigt bekommt^^) Würde mich zu gegebener Zeit über eine Antwort freuen.
Danke Dir!
Gruß Sebastian

Ich benutze ebenfalls eine Version von ...
30.08.2013 21:32:15
...
GetValue, Sebastian,
natürlich aus einer Subprozedur heraus, die ggf von Ereignisprozeduren aufgerufen wird. Ein solcher Fall tritt ein, wenn eine spezielle UDF Werte einer geschlossenen Datei lesen will und deshalb ihre Argumente nach einem speziellen führenden Kommando(IdentifizierungsKurz-)Text in eine globale String-Variable schreibt. Das Anlegen der ZellFml löst ein Worksheet_Change-Ereignis aus, das unter definierten Umständen die anfangs genannte Subprozedur aufruft. Diese wertet dann die Globalvariable aus und veranlasst das Erforderliche, parametriert hier also GetValue.
Da das ein eher nicht massen­daten­verarbeitungs­taugliches Experiment war, fürchte ich, dass das deinen Zweck so nicht erfüllt. Denn auch, wenn dir die HptProzedur auch das Anlegen diverser Hilfs- u.Ereignisprozeduren schon abnimmt, musst du die spezielle UDF doch selber schreiben – ich habe nur BspCodes und eine UDF, die mit dem HptPgm auf etwas andere Weise zusammen­arbeitet (es wdn vorbereitete VBA-Texte durch dazu passende UDF-Argumente ergänzt und in den Body vorbereiteter, leerer Prozeduren geschrieben, die dann vom HptPgm in Abhängigkeit vom führenden KommandoText der globalen String-Variable bei dessen Auslösung aufgerufen wdn), denn das Wichtige war das aufgerufene HptPgm.
Im HptPgm müsste ich wohl erst einiges sperren, was bei dir nicht fktionieren würde, denn das Ganze ist in ein AddIn eingebunden und benutzt natürlich auch dessen Möglichkeiten, die du nicht hast. Da kann ich das gleich noch mal schreiben, wofür ich aber jetzt definitiv keine Zeit habe, zumal ich es auch noch nicht mal unter XL12 getestet habe (ist 6 Jahre alt, letztes UpDate vor 4 Jahren!). Könnte dir also ohnehin nur die Hilfe dazu und ein paar BspCodes zeigen u/o dir helfen, falls du so etwas Ähnliches probieren willst…
Gruß Luc :-?

Anzeige
AW: Ich benutze ebenfalls eine Version von ...
31.08.2013 00:04:22
...
Alles klar!
Ich seh schon du bist hier auf einem Level unterwegs was ich in 10 Jahren hoffentlich mal erreiche ;) Ich werde mein Projekt in den nächsten 2 Wochen konkretisieren und beginnen umzusetzen. Die Infos hier von euch Profis haben mich aber schon sehr viel weiter gebracht. Wenn nochmal konkrete Probleme (spätestens in zwei Wochen :D )hierzu entstehen oder ich das Projekt über diese Grenzen hinaus wie du in deiner Nachricht skizziert hast erweitern werde, weiß ich jetzt ja wo ich sehr guten Rat finden kann. :)
Danke nochmal!
Gruß Sebastian

Bitte sehr, gern geschehen! ;-) Gruß owT
31.08.2013 00:53:21
Luc:-?
:-?

Anzeige
AW: Excel Ad-In /Funktion
29.08.2013 09:51:40
Balder
Hallo Sebastian,
so wie ich die Lage einschätze, benötigst du nicht unbedingt eine Funktion!?
Schau mal hier: http://youtu.be/o4rjkPkqCzk
Hier werden Daten aus mehreren Arbeitsblättern zusammengefasst. Für deinen Fall könnte man auf die Zusammenfassung verzichten und nur nach den entsprechenden Argumenten (Kennzahl,...) suchen. Sobald die Argument erfüllt sind könnte das Programm abgebrochen werden und der aktuelle Dateiname ausgegeben werden.
Wenn es wirklich das sein sollte was du brauchst, dann kann ich dir den Quelltext auch zur Verfügung stellen.
Gruß Balder
http://www.youtube.com/BaldersWelt

Anzeige
AW: Excel Ad-In /Funktion
29.08.2013 10:52:09
Sebastian
Hi, danke für das Video!
Leider ist das nicht meine gesuchte Funktionsweise. Vll. mache ich am besten es nochmal konkreter:
Ich habe zahlreiche Mappen mit Daten. Zur Vereinfachung haben diese z.B. folgende Struktur:
Dateiname z.B. "AA"
.............2012....2013
Umsatz...100....120
Gewinn....10......20
(Weiß gerade nicht wie ich das besser hier darstellen kann? Also Umsatz steht hier in "A2" und die 20 in "C3")
Alle haben einen eindeutigen Namen. (Eine evtl. Datenbank (s. vorherige Nachricht) hätte dann natürlich eine ähnliche Struktur)
So jetzt will ich in einer übergreifenden Mappe z.B. in Zelle A1 "AA" eintragen und mein Sheet soll sich automatisch mit den Daten von "AA" laden. Also z.B. so:
AA............2013
Gewinn...=MeineFormel(A1;A3;B1)
Die Formel würde jetzt "20" als Wert liefern. Bedeutet wenn ich jetzt den Dateinamen in Zelle "A1" einfach auf BB ändere, soll automatisch der Gewinn von BB erscheinen. Oder wenn ich in "B1" statt 2013, 2012 schreibe sollt der Wert für 2012 kommen.
So jetzt könnte ich das ganze über eine "=Indirekt" Funktion machen. Dafür müsste ich jedoch immer die Quelldatei öffnen. Das bleibt also als Notlösung verbunden mit einem Makro was immer die Quell-Mappe zum aktualisieren öffnet. Dann kann man natürlich auch noch direkt verlinken. Aber das ist sehr unflexibel. So und jetzt kenne ich eben noch diese Add-Ins/Functions von der Arbeit, bei denen das mit einer solchen Formel wie oben funktioniert, natürlich mit noch viel mehr Funktionen. Aber ich will wirklich nur die eigentlich simple Funktion, das in überschaubarer Zeit sämtliche in der Übersichtsmappe definierten Daten aus den einzelnen Daten-Mappen geladen werden. All das halt ohne ein Makro starten zu müssen, was die Daten quasi aus der Quelldatei an dem richtigen Ort einfügt, sondern mit einer Funktion die das flott im Hintergrund erledigt sobald ich z.B. die Jahreszahl ändere.
Vll. gibt es hierzu auch keine gute Lösung auf Excel Ebene. Vll. ist eine Anbindung von Excel an eine Datenbank, in der die Daten liegen schneller und sinnvoller? Lieber wäre mir natürlich alles in Excel zu lösen, weil ich mich hier wohl fühle :)
Ich hoffe ich konnte mich verständlich ausdrücken. :)
Vielen vielen Dank für eure Mithilfe!
Gruß Sebastian

Anzeige
AW: Excel Ad-In /Funktion
29.08.2013 12:30:26
KlausF
Hallo Sebastian,
das könnte vielleicht helfen:
https://www.herber.de/bbs/user/87086.zip
Die Funktion ist in der Datei GetValue from ClosedMap.xls.
Die Werte werden aus der Datei Vokabeltrainer.xls eingelesen.
Die Datei stammt aus meinen gesammelten Werken ...
Gruß
Klaus

AW: Excel Ad-In /Funktion
29.08.2013 14:12:44
Sebastian
Hallo Klaus,
genau so eine Funktion habe ich gesucht!! Danke dir vielmals!! Ich hoffe ich kann mich mal im Forum für eure Antworten revanchieren! Nur noch eine Sache:
Mit deinem TestGetValue() Sub funktioniert das auch alles gut. Nun bleibt noch die letzte Frage, ob und wie ich das jetzt als eine allgemeine Funktion in Excel einführen kann um die volle Flexibilität zu erreichen. Ich hab die "Function GetValue" als Add-in ohne das "Private" gespeichert und dann aktiviert. Trotzdem liefert mir bei dieser Eingabe: =GetValue("C:\Users\Basti\Downloads\87086\GetValue from ClosedMap\";"Vokabeltrainer.xls";"Vokabeln";"A4") Nur "#Wert" . Ich scheine etwas falsch zu machen. Oder man kann es so gar nicht machen, Luc meinte ja dass das nur mit einer Subprozedur möglich sei.
Nochmals vielen Dank!
Gruß Sebastian

Anzeige
AW: Excel Ad-In /Funktion
29.08.2013 15:03:23
KlausF
Hallo Sebastian,
ich bin in dem Thema auch nicht so drin, ist wie gesagt eine Datei aus meinem
Sammelfundus. Der von Dir eingeschlagene Weg kann allerdings schon deshalb
nicht funktionieren, weil der Pfad in der Funktion vordefiniert ist:
p = ThisWorkbook.path
Das heißt, es wird der Pfad ausgelesen, an dem sich die Datei befindet aus der
das Makro gestartet wird.
Zwei Möglichkeiten:
Erstens, du vergibst den Pfad fest
p = "C:\Users\Basti\Downloads\87086\"
oder Du beziehst Dich auf eine Zelle, in der der korrekte Pfad steht
p = Range("A1").Value
Hab leider im Moment keine Zeit zum Testen.
Gruß
Klaus

Anzeige
AW: Excel Ad-In /Funktion
29.08.2013 16:00:47
Sebastian
Danke für die schnellen Rückmeldungen!
Ich habe folgenden Code (Nur deine Funktion ergänzt um die Variablen-Definitionen und dem entfernen des "Private" vor Function) von dir als Excel-Add-Inn gespeichert um es als einfache Funktion in Excel nutzen zu können. Was wohl nicht so einfach geht^^.:
Original von Klaus:
Private Function GetValue(path, file, sheet, ref)
'   Retrieves a value from a closed workbook
Dim arg As String
'   Make sure the file exists
If Right(path, 1)  Application.PathSeparator Then path = path & Application.PathSeparator
If Dir(path & file) = "" Then
GetValue = "File nicht gefunden"
Exit Function
End If
'   Create the argument
arg = "'" & path & "[" & file & "]" & sheet & "'!" & _
Range(ref).Range("A1").Address(, , xlR1C1)
'   Execute an XLM macro
GetValue = ExecuteExcel4Macro(arg)
End Function
Meine Anpassung für Add-In:
Function GetValue(path As String, file As String, sheet As String, ref As String) As String
'   Retrieves a value from a closed workbook
Dim arg As String
'   Make sure the file exists
If Right(path, 1)  Application.PathSeparator Then path = path & Application.PathSeparator
If Dir(path & file) = "" Then
GetValue = "File nicht gefunden"
Exit Function
End If
'   Create the argument
arg = "'" & path & "[" & file & "]" & sheet & "'!" & _
Range(ref).Range("A1").Address(, , xlR1C1)
'   Execute an XLM macro
GetValue = ExecuteExcel4Macro(arg)
End Function

Klaus TestGetValue() Sub:
Sub TestGetValue()
Dim p As String, f As String, s As String, a As String
p = ThisWorkbook.path
If p = "" Then
MsgBox "Die Datei mu§ zuerst gespeichert werden"
Exit Sub
End If
If Right(p, 1)  Application.PathSeparator Then p = p & Application.PathSeparator
f = "Vokabeltrainer.xls"
s = "Vokabeln"
a = "A4"
MsgBox GetValue(p, f, s, a)
End Sub
Die TestGetValue() Prozedur greift ja wenn ich das richtig sehe auch nur auf diese Funktion zu und füllt in diesem Fall p mit dem aktiven Pfad. Aber da ich ja nur die Funktion gespeichert habe und ausführen will und nicht deine gesamte Prozedur, dürfte dass das Problem doch eigentlich nicht sein oder?
Hier die Frage (auch an Luc):
Bei dem Code von Klaus wird doch die Quelldatei gar nicht geöffnet, weder in der Function noch in der Prozedur darunter oder? Funktioniert es trotzdem systematisch nicht diese Funktion als allgemeine Funktion auszuführen und ich muss deinen Weg über die "physisch entkoppelte" Subroutine nehmen, die mir die Quelldatei öffnet? Wenn ja wäre ich natürlich über jeden Code, der mich zu meinem Ziel bringt, solang es zeitlich möglich ist, sehr dankbar.
P.S.: Jetzt habe ich die oben gennante Funktion von Klaus nochmal so wie erklärt getestet, aber die Quelldatei geöffnet. Auch so funktioniert es nicht. Ich scheine etwas grundsätzliches bei diesen Funktionen noch nicht verstanden zu haben :(
Danke für eure (Nach-)Hilfe!!
Gruß Sebastian

Wohl nur über Subroutine
29.08.2013 16:50:10
KlausF
Hallo Sebastian,
ich denke, Luc hat Recht mit der Subroutine. Habe es grad eben auch mal probiert,
aber ich komme auch zu keinem anderen Ergebnis. Warum das so ist kann ich
Dir auch nicht sagen. Vermutlich weis Luc mehr darüber. Aber: warum nicht mit
der Subroutine lösen?
Muss jetzt außer Haus.
Gruß
Klaus

Ja, das bestätigt auch Th.Ramel, ...
29.08.2013 19:52:20
Luc:-?
…Leute,
nämlich hier!
Ich suche aber später auch noch mal meine Lösung raus.
Gruß Luc :-?

AW: Ja, das bestätigt auch Th.Ramel, ...
29.08.2013 21:58:17
Sebastian
Alles klar, danke euch für die Hilfe!!
Dann fasse ich mal kurz für die zukünftigen Leser zusammen:
Wenn man rein auf Excel-Ebene bleiben will, dann führt kein Weg an der Subroutine vorbei. Was kein allzu großes Problem darstellen sollte, solange das alles schnell genug funktioniert.
Und wenn ich dich richtig verstanden habe Luc, muss man wenn man eine reine Excel Funktion haben will, wie ich sie in meinen Nachrichten angedeutet habe, also mit direkter Eingabe als Formel auf eine Datenbankabfrage ausweichen?! Welches wiederum auch die flexibelste Lösung darstellen würde.
Ich werde es wohl erstmal über eine Subroutine lösen. Entweder so, dass ich alle gesuchten Daten vorher definiere und dann mit einem Durchlauf alle Zellen aktualisiere oder so, dass sobald eine Zelle gefüllt wird, die Subroutine mit dem Verweis auf die Funktion ausgeführt wird und so direkt gefüllt wird. Letzteres sollte doch hiemit möglich sein?:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$C$8" Then
Call Alles
End If
End Sub 

Oder gibt es noch einen schnelleren besseren Weg?
Luc ich bin schon auf deinen Code gespannt!
Viele Grüße
Sebastian

AW: Ja, das bestätigt auch Th.Ramel, ...
29.08.2013 22:09:04
KlausF
Hallo Sebastian,
ein Beispiel mit Worksheet.Change anbei
https://www.herber.de/bbs/user/87096.zip
Sie funktioniert nur, wenn alle 4 Zeilen korrekt ausgefüllt sind, sonst gibt es eine Fehlermeldung.
Wenn alle Dateien im gleichen Verzeichnis liegen könnte man diese in Spalte A einlesen lassen
und dann über eine Schleife abarbeiten.
Gruß
Klaus

AW: Ja, das bestätigt auch Th.Ramel, ...
30.08.2013 23:56:28
Sebastian
Danke dir Klaus! Entschuldige die späte Rückmeldung, ich war heute den ganzen Tag unterwegs und konnte nicht schreiben.
Das sieht ja fast einfacher aus als ich es dachte.
Der Code von dir ist zu 90% das was ich gesucht habe. Ich hoffe die letzten 10% schaffe ich alleine. Wenn nicht muss ich dich wohl nochmal belästigen ;)
Vielen Dank nochmal!
viele Grüße
Sebastian

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige