PDA

Vollständige Version anzeigen : GetValue nicht vorhanden oder definiert


Mietzekaetzchen
26.06.2014, 15:04
Hallöchen,

ich möchte auf Daten einer geschlossenen Exceldatei zugreifen und diese weiter verarbeiten. Dafür habe ich die Funktion GetValue(...), die Parameter Pfadname,Dateiname, Blattname und Zelle hat, gefunden. Die Parameter werden von mir vorher definiert.

Nummer = GetValue(ThisWorkbook.path, DateiName, BlattName, "A12")
Leider kommt beim Ausführen immer: " Fehler beim kompilieren: Sub oder Function nicht gefunden"

Auch die Hilfe spuckt bei dieser Funktion nicht aus. Als ob es die bei mir nicht gibt.

Hat jemand eine Idee voran das liegt?

Mc Santa
26.06.2014, 15:14
Hallo,

die Funktion gibt es von Excel nicht.

Vermutlich hast du nach einer solchen Funktion in einem Forum gesucht, dann musst du auch den Code dieser Funktion mit in dein Marko kopieren.
Hier einen solchen Code, den ich gefunden habe:
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) <> "\" Then path = path & "\"
If Dir(path & file) = "" Then
GetValue = "File Not Found"
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

Quelle: http://spreadsheetpage.com/index.php/site/tip/a_vba_function_to_get_a_value_from_a_closed_file/

Diese Funktion muss zu deinem Makro dazu.
Hilft dir das weiter?

VG

Mietzekaetzchen
30.06.2014, 13:06
Leider wird bei der Ausführung der Laufzeitfehler 13: Typen unverträglich an gezeigt. Aber meiner Meinung nach ist das Ergebnis von GetValue ein Integer oder irre ich mich da?

Mc Santa
30.06.2014, 13:17
Hallo,

leider gibst du sehr wenige Informationen an, daher kann ich dir nur allgemein helfen.
Die obige Funktion, die ich gefunden habe, ermittelt aus einer geschlossenen Excelmappe einen Wert aus einer Zelle. Zurückgegeben wird also das, das in der Zelle steht. Das KANN eine Zahl sein und MÖGLICHERWEISE eine Ganzzahl (Integer). Es kann aber eben auch ein Fehlerwert sein oder ein Text (String).

Um jetzt zu ermitteln wie dein Fehler entsteht, muss ich überhaupt wissen, wass du versuchst zu erreichen.
Warum rufst du die Funktion auf und welchen Rückgabewert erwartest du? Wie ist dein Makro aufgebaut? Wie sieht die Exceldatei aus, aus der du einen Wert ermitteln willst?

VG

Mietzekaetzchen
30.06.2014, 15:27
Ich möchte aus einer geschlossenen Datei (.csv) zunächst nur einen bestimmten Wert auslesen und witer verarbeiten. Das merkwürdige ist, wenn ich das Macro ausführe ohne die Datei zu verarbeiten öffnen geht es nicht. Wenn die Datei offen ist geht es und wenn die Datei danach geschlossen wird geht es auch aber nur manchmal.

Hier mein Code dazu´


Sub WertUebernehmen()
'
' WertUebernehmen Makro
'

'
Dim sFile As String
Dim DateiName As String
Dim BlattName As String
Dim Formel As String
Dim Spalte As String
Dim Zeile As String
Dim Zelle As String

Dim Nummer As Single
Dim Zahl As Integer
Dim iDatei As Integer ' Zählvariable für Dateien
Dim iSensor As Integer ' Zählvariable für Sensoren

DateiName = "2014Jun25-151924m.csv"
BlattName = Left(DateiName, Len(DateiName) - 4)

Spalte = "B"
Zeile = 11

Zelle = Spalte + CStr(Zeile)
'MsgBox Zelle
Nummer = GetValue(ThisWorkbook.path, DateiName, BlattName, Zelle)
'MsgBox ThisWorbook.path + DateiName + BlattName + "A12"
MsgBox Nummer
'Mittewert erste Datei auf B9

End Sub

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) <> "\" Then path = path & "\"
If Dir(path & file) = "" Then
GetValue = "File Not Found"
Exit Function
End If
' Create the argument
arg = "'" & path & "[" & file & "]" & sheet & "'!" & _
Range(ref).Range("A1").Address(, , xlR1C1)
' MsgBox arg
' Execute an XLM macro
GetValue = ExecuteExcel4Macro(arg)
End Function

EarlFred
30.06.2014, 16:04
Hallo Name?,

die von Dir verwendete Funktion GetValue ist nicht geeignet, Daten aus einer CSV-Datei (=reine Textdatei!) auszulesen. In einer Textdatei gibt es KEINE Spalten (schon gar keine, die A, B, C.... heißen) und KEINE Zeilennummern. Diese werden erst erzeugt, wenn Excel eine solche Datei öffnet UND einen Spalten- und Zeilentrenner erkennt.

wenn die Datei danach geschlossen wird geht es auch aber nur manchmal.
wenn Du die Datei dabei im Excel-Format speicherst, dann bestimmt.
Auch wenn Excel meist als Standard für CSV-Dateien eingerichtet ist, ist dieser Dateityp kein eigentlicher "Excel-Dateityp": Mach die Datei mal mit dem Editor auf, dann wirst Du es bestimmt erkennen.

CSV-/Textdateien kann man aber in der Regel einfach einlesen, z. B. mit dieser Funktion:
http://vb-tec.de/readfile.htm

Danach kann man, wenn man die Trennzeichen kennt, den Text in Zeilen und Spalten aufteilen und weiter verwenden. Beispiele sollten hier zu finden sein.

Ergänzung: Codevorschlag:
Option Explicit
Sub WertUebernehmen()

Dim vRückgabe As Variant
Dim strDateiname As String
Dim lSpalte As Long, lZeile As Long

strDateiname = "2014Jun25-151924m.csv"

lSpalte = 2 'entspricht Spalte "B"
lZeile = 11

vRückgabe = GetValue(ThisWorkbook.path, strDateiname, lSpalte, lZeile)

MsgBox vRückgabe

End Sub

Private Function GetValue(ByRef strPath As String, ByRef strFile As String, ByRef lSpalte As Long, ByRef lZeile As Long)
Dim strInhalt As String
Dim strZeile As String

strInhalt = ReadFile(strPath & "\" & strFile)
strZeile = Split(strInhalt, vbCrLf)(lZeile - 1)
GetValue = Split(strZeile, ";")(lSpalte - 1)
End Function

Die Function ReadFile (siehe Link) musst Du noch dazukopieren.

Der Code ist nur deshalb so kurz und kompakt, weil ich mir jegliche Prüfung zur Fehlervermeidung und jede Fehlerbehandlung verkniffen habe. Also wundere Dich nicht über Fehlermeldungen.

Grüße
EarlFred

Mietzekaetzchen
01.07.2014, 08:02
Danke Dein Beispiel funktioniert sehr gut.
Jetz kann ich gut darauf aufbauen.

Allerdings noch ein Kommentar zum vorherigen: Ich habe die .csv in als .xlsx gespeichert. Ich vermute eher das kurz nach dem Schließen die Datei trotzdem noch im Arbeitsspeicher war und deshalb konnte ich noch mit "A12" und co arbeiten.