Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema MsgBox
BildScreenshot zu MsgBox MsgBox-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema CommandButton
BildScreenshot zu CommandButton CommandButton-Seite mit Beispielarbeitsmappe aufrufen

VBA Excel Funktion geschrieben gibt Return #Wert | Herbers Excel-Forum


Betrifft: VBA Excel Funktion geschrieben gibt Return #Wert von: MrSteffen
Geschrieben am: 02.01.2010 16:48:01

Guten Tag, ich habe folgendes Problem.

Es gibt die Dateien: Stundenerfassung.xls und Tagesreport_Projekt.xls

Ich will, dass Tagesreport_Projekt.xls die Stundenerfassung öffnet, in ein Sheet geht und dort eine bestimmte Zeile nach einem Wert (den er aus Tagesreport_Projekt.xls hat) sucht. Wenn er diesen Wert gefunden hat, geht er eine Zeile weiter nach unten (dort steht ein int wert) und gibt ihn als returnwert seiner Funktion wieder.

Wenn ich die Funktion in einem vba Formular per Button mit

Private Sub CommandButton1_Click()
Call SumZusatzPersonalKosten("01.01.2010", "Projekt 1")
End Sub

aufrufe klappt alles wunderbar, wenn ich jedoch in Tagesreport_Projekt.xls in C6 =SumZusatzPersonalKosten("01.01.2010";"Projekt 1") schreibe gibt er mir nur #Wert aus und aus dem Direktfenster kann ich entnehmen,dass er nur einmal die Schleife durchläuft.

Code:

Function SumZusatzPersonalKosten(toSearchDatum, toSearchProject)
Dim i, Spaltenanzahl, i2 As Integer
Dim currentWs, Filename, currentWsName As String

'Mengenerfassung
currentWs = "Stundenerfassung"
'Filename = currentMonth & " " & currentYear & "\" & currentWs
Filename = currentWs
'currentWsName = ActiveSheet.Name
SumZusatzPersonalKosten = 0

If Dir(ThisWorkbook.Path & "\" & Filename & ".xls") <> "" Then
Workbooks.Open ThisWorkbook.Path & "\" & Filename & ".xls", 0
Workbooks.Application.Visible = True
ActiveWindow.Visible = True

'Spaltenanzahl = Workbooks("Stundenerfassung").Sheets(toSearchDatum).Cells(2, Columns.Count).End(xlToLeft).Column
Spaltenanzahl = 100
Debug.Print ":o"
Debug.Print "toSearchDatum = " & toSearchDatum & " - toSearchProject = " & toSearchProject & " - Spaltenanzahl = " & Spaltenanzahl
i = 1
i2 = 0
'MsgBox toSearchProject
Do While i <= 100
i2 = i + 20
Debug.Print "Ich suche! i2 = " & i2 & " i = " & i

If Workbooks("Stundenerfassung").Sheets(toSearchDatum).Cells(2, i2).Value = toSearchProject Then '
SumZusatzPersonalKosten = Workbooks("Stundenerfassung").Sheets(toSearchDatum).Cells(3, i2).Value ' Workbooks("Stundenerfassung").
Debug.Print "GEFUNDEN in " & i2 & " SumZusatzPersonalKosten = " & SumZusatzPersonalKosten
Exit Do
End If
i = i + 1
Loop
Workbooks(currentWs).Close SaveChanges:=True 'true ???
Else
Debug.Print "File: " & ThisWorkbook.Path & "\" & Filename & ".xls nicht gefunden!"
End If

End Function
Wenn ich im Formular (in vba) den Button drücke ist die Direkbereich ausgabe:

Code:
:o
toSearchDatum = 01.01.2010 - toSearchProject = Projekt 1 - Spaltenanzahl = 100
Ich suche! i2 = 21 i = 1
Ich suche! i2 = 22 i = 2
Ich suche! i2 = 23 i = 3
Ich suche! i2 = 24 i = 4
GEFUNDEN in 24 SumZusatzPersonalKosten = 12

Wenn ich im Excel Sheet die Zelle C6 reingehe und Enter drücke bzw. strg+alt+f9 drücke damit die Sachen nochmal durchläuft sehe ich im Direktbereich folgendes:

Code:

:o
toSearchDatum = 01.01.2010 - toSearchProject = Projekt 01 - Spaltenanzahl = 100
Ich suche! i2 = 21 i = 1

Wenn ich folgenden Codeteil auskommentiere:
Code:

If Workbooks("Stundenerfassung").Sheets(toSearchDatum).Cells(2, i2).Value = toSearchProject Then '
SumZusatzPersonalKosten = Workbooks("Stundenerfassung").Sheets(toSearchDatum).Cells(3, i2).Value ' Workbooks("Stundenerfassung").
Debug.Print "GEFUNDEN in " & i2 & " SumZusatzPersonalKosten = " & SumZusatzPersonalKosten
Exit Do
End If

wird die Schleife problemlos ausgeführt, jedoch brauche ich ja eigentlich einen Wert aus der Stundenerfassung.xls

Fehlereingrenzung:

Meine Annahme ist,dass ich falsch auf die Objekte versuche für die Stundenerfassung.xls zuzugreifen und er deswegen irgendwie abbricht, jedoch das nicht sehe in excel. Wenn man das von vba aus ausführt, stimmen aber jedoch die Objekte bzw. sind richtig angesprochen.

In Stundenerfassung gibt es natürlich ein Sheet mit namen "01.01.2010" und auch eine Spalte in der "Projekt 01" drin steht.

Ich hoffe ich konnte verständlich mein Problem schildern, über eine nette konstruktive Hilfe wäre ich sehr dankbar.

  

Betrifft: AW: VBA Excel Funktion geschrieben gibt Return #Wert von: Ramses
Geschrieben am: 02.01.2010 16:59:33

Hallo

Die Funktion schreibt Werte in verschiedene Zellen, und gibt selbst keinen Wert zurück.
Das heisst, du kannst nicht einfach in "=SumZusatzPersonalKosten("01.01.2010";"Projekt 1") " in eine Zelle schreiben um den WErt zu erhalten. EXCEL versucht in der Zelle aus der Funktion einen Wert zu erhalten. Nach dem die Funktion keinen Wert zurückgibt, steht auch "#WERT" in der Zelle

Diese Funktion wurde zur Verwendung mit Commandbuttons geschrieben, und nicht zur Verwendung in einer Zelle

Gruss Rainer


Beiträge aus den Excel-Beispielen zum Thema " VBA Excel Funktion geschrieben gibt Return #Wert"