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

function ohne Dateizugriff?

function ohne Dateizugriff?
03.06.2022 10:52:36
MCO
Guten Morgen!
Ich hab mir eine Funktion gebaut, mit der ich eine Textdatei (Tab-getrennt) öffne, durchsuche und mir einen Datensatz zurückgeben lasse.
Da es sich hier um Personaldaten handelt, hoffe ich, dass die Beschreibung zur Problemlösung genügt.
Folgendes Phänomen:
Rufe ich die funktion im direktfenster auf mit

? MA_Daten ("ABC0815","5")
bekomme ich den korrekten Rückgabewert. Für micht die Bestätigung: Pfad richtig, Suchlogik richtig, Wert vorhanden.
Trage ich die funktion in eine Zelle ein, mit gleichen Parametern (=MA_Daten("ABC0815";"5")), wird mir #WERT zurückgegeben.
Offensichtlich kann hier die funktion nicht meine Textdatei aufrufen!
Die Variable WB in der Zuweisung Set WB = Workbooks.open bleibt nothing
Hat jemand hier einen Lösungshinweis oder ein Workaround?
Hier noch die funktion

Public Function MA_Daten(GID As String, Optional info As String) As String
Dim verantw As String, orga_pfad As String
Dim WB As Workbook
Dim i As Long
Dim gef As Range
Dim Datensatz As Variant, Datensatz_arr  As Variant, Datenkopf As Variant, Datenkopf_arr As Variant
Application.EnableEvents = False
Application.ScreenUpdating = False
orga_pfad = "C:\TEMP\Organigram.txt"
Set WB = Workbooks.Open(orga_pfad, , 1, 6, , , , , Chr(9))
'WB.Windows(1).Visible = False
Set gef = WB.Sheets(1).Range("D:D").Find(GID, lookat:=xlWhole)
If Not gef Is Nothing Then
Datenkopf = WB.ActiveSheet.Range("A1:L1").Value
Datenkopf_arr = Application.Transpose(Datenkopf)
Datenkopf_arr = Application.Transpose(Datenkopf_arr)
Datensatz = WB.ActiveSheet.Range("A" & gef.Row & ":L" & gef.Row).Value
Datensatz_arr = Application.Transpose(Datensatz)
Datensatz_arr = Application.Transpose(Datensatz_arr)
Else
MA_Daten = GID & " wurde nicht gefunden"
End If
If info = 0 Then
'MA_Daten = Join(Datensatz_arr, ";")
For i = 1 To UBound(Datensatz_arr)
MA_Daten = MA_Daten & "(" & i & ") " & Datenkopf_arr(i) & ": " & Datensatz_arr(i) & Chr(10)
Next i
Else
MA_Daten = Datensatz_arr(info)
End If
WB.Close 0
Application.EnableEvents = True
End Function
Vielen Dank schonmal für´s Lesen!
Gruß, MCO

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: function ohne Dateizugriff?
03.06.2022 10:58:15
Daniel
Hi
Eine Function, die in einer Zelle verwendet wird, darf nichts weiter tun als einen Erfebniswert ausgeben.
Jede Aktion mit Außenwirkung ist ihr verboten.
Im direktfenster ist die Function ein normales Makro mit allen Rechten.
Gruß Daniel
AW: function ohne Dateizugriff?
03.06.2022 12:19:27
MCO
Hallo Daniel!
Das ist ja schon wertvoll zu wissen, dass ich nicht doofer bin als andere :-)
Die Datei nicht explizit in Excel zu öffnen sondern nur zu lesen (etwas umständlich ausgedrückt) war hier die Lösung.
Für alle, die es interessiert:

Public Function MA_Daten(GID As String, Optional info As Long) As String
Dim orga_pfad As String, zeil As String
Dim i As Long, x As Long
Dim datamax As Variant, Alldata  As Variant
Application.EnableEvents = False
Application.ScreenUpdating = False
orga_pfad = "C:\Temp\Organigram.txt"
ReDim Alldata(999)
Open orga_pfad For Input As #1
Do While Not EOF(1)
Line Input #1, zeil: Alldata(i) = Split(zeil, Chr(9))
i = i + 1
Loop
Close #1
ReDim Preserve Alldata(i - 1)
datamax = Application.Transpose(Alldata)
Alldata = Application.Transpose(datamax)
For i = 2 To UBound(Alldata)
If Alldata(i, 4) = GID Then
If info = 0 Then
For x = 1 To UBound(datamax)
MA_Daten = MA_Daten & "(" & x & ") " & Alldata(1, x) & ": " & Alldata(i, x) & Chr(10)
Next x
Else
MA_Daten = Alldata(i, info)
End If
Exit For
End If
Next i
Application.EnableEvents = True
End Function

Anzeige
AW: function ohne Dateizugriff?
03.06.2022 12:48:59
Daniel
Schöne Lösung.
Ich hätte wahrscheinlich ein Tabellenblatt angelegt und dort das Textfile importiert, um dann in der Function auf das Tabellenblatt zugreifen zu können.
Kleiner Tipp noch: das Transponieren kannst du dir sparen, wenn du die Einzelwerte von Alldata so ansprichst: Alldata(i)(x) anstelle von Alldata(i, x)
Dein ursprüngliches Alldata ist ein eindimensionales Array, bei dem anstelle von Einzelwerte ein weiteres eindimensionales Array steht, und so kann man auch die Einzelwerte ansprechen. Eine transformation in ein zweidimensionales Array ist nicht notwendig.
Gruß Daniel
Anzeige
1 Zeile gespart...
03.06.2022 13:11:20
MCO
Puh, ob es das Wert war?
Ich musste alle indizes umschreiben weil das array plötzlich wieder bei 0 Anfing, nicht bei 1 . (Ja, kann man deklarieren.)
Dennoch hab ich schon geahnt, dass ich da noch nicht so wirklich professionell arbeite.
Also: Danke für den Tip.
Gruß, MCO
AW: 1 Zeile gespart...
03.06.2022 13:25:40
Daniel
nachträglich umändern ist immer aufwendiger als gleich so machen.
es sind halt dinge, die man wissen sollte. Was du dann verwendest, ist deine Entscheidung, funktionieren tut beides.
Gruß Daniel
AW: function ohne Dateizugriff?
03.06.2022 10:58:53
Oberschlumpf
Hi,
wenn es so sein sollte, dass auch andere wie ich, ohne Bsp-Dateien (Quell (txt)/Zieldatei mit Makro) per Upload nicht helfen können, würde ich das hier vorschlagen:
"Da es sich hier um Personaldaten handelt..."
Tausch doch die Realdaten gegen Bsp-Daten aus - und in der Bsp-Quelldatei würden ja auch nur einige Datenzeilen reichen.
Ciao
Thorsten
Anzeige
AW: function ohne Dateizugriff?
03.06.2022 12:22:55
MCO
Hallo!
Grundsätzlich geb ich Dir recht, dafür hab ich es auch schon zu oft angemahnt.
Allerdings war hier absehbar, dass es sich um Zugriffsproblem auf die Datei handelte oder ein Datentyp-konfikt, daher war ein upload nicht zwingend notwendig.
Dennoch Danke für´s Reindenken...
Gruß, MCO

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige