Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Application.Goto(Reference: Erklärung

Forumthread: Application.Goto(Reference: Erklärung

Application.Goto(Reference: Erklärung
09.11.2020 16:53:17
Peer
Hallo.
Ich habe durch die tatkräftigen Hilfen im Forum mein Projekt weit gebracht und einiges lernen können.
Leider kann ich folgenden Code (noch) nicht verstehen.

Private Sub lst_Dienstreise_Click()
' bei Klick wird der Datensatz in der Tabelle markiert (frm_Dienstreise auf Showmodal = False   _
_
setzen)
Dim avntAddress As Variant
With lst_Dienstreise
avntAddress = Split(.List(.ListIndex, 1), "|")
'        If .List(.ListIndex, 10) > 0 Then
'            Me.lbl_Status = .List(.ListIndex, 10).Value
'        Else: Exit Sub
'        End If
End With
Call Application.Goto(Reference:=Worksheets(avntAddress(0)).Cells(avntAddress(1), 0))
End Sub
Er soll eigentlich bei Klick auf einen Eintrag in der ListBox den Datensatz im Sheet selektieren.
Noch bleibt der Debugger aber bei folgender Zeile hängen.

Call Application.Goto(Reference:=Worksheets(avntAddress(0)).Cells(avntAddress(1), 0))

Kann mir jemand erklären, was hier gemeint ist?
Vielen Dank
Gruß
Peer
Anzeige

16
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Application.Goto(Reference: Erklärung
09.11.2020 17:29:46
Nepumuk
Hallo Peer,
die Spalte 0 gibt es nicht. Versuch es so:
Call Application.Goto(Reference:=Worksheets(avntAddress(0)).Cells(avntAddress(1), 1))
Gruß
Nepumuk
AW: Application.Goto(Reference: Erklärung
09.11.2020 17:45:18
Peer
Hallo Nepumuk.
Brachte keinen Erfolg.
Vielleicht erkennst du es.
https://www.herber.de/bbs/user/141435.xlsm
Gruß
Peer
Anzeige
AW: Application.Goto(Reference: Erklärung
09.11.2020 18:28:09
max.kaffl@gmx.de
Hallo Peer,
ich habe es dir mal eingebaut:
' **********************************************************************
' Modul: frm_Dienstreisen Typ: Userform
' **********************************************************************

Option Explicit

Private mBaseArray As Variant

Private Sub btn_OK_Click()
    Unload Me
End Sub

Private Sub UserForm_Initialize()
    '############### Variante 1 #####################################################################
    'Dim lngMonth As Long, ialngIndex As Long, lngRow As Long, lngColumn As Long
    'Dim avntValues() As Variant, avntTemp As Variant, vntItem As Variant
    'Dim datReisezeit As Date
    '
    ' For lngMonth = 1 To 2 'auf 12 Monate erhöhen!!!
    ' lngRow = 6
    ' With Worksheets(MonthName(Month:=lngMonth))
    ' Do
    ' lngRow = .Cells(lngRow, 4).End(xlDown).Row 'letzte Zeile Beginn Spalte 4
    ' If lngRow < .Rows.Count Then
    ' ReDim Preserve avntValues(18, ialngIndex)
    ' lngColumn = 0
    ' avntTemp = .Range(.Cells(lngRow, 4), .Cells(lngRow, 18)).Value
    '
    ' For Each vntItem In avntTemp
    ' Select Case lngColumn
    ' Case 2, 6, 9 'BeginnZeit, EndeZeit, Dauer
    ' avntValues(lngColumn, ialngIndex) = Format$(vntItem, "Hh:Nn")
    ' If lngColumn = 9 Then
    ' Select Case vntItem
    ' Case Is < TimeSerial(8, 0, 0)
    ' avntValues(9, ialngIndex) = "00,00 €"
    ' Case Is >= TimeSerial(24, 0, 0)
    ' avntValues(9, ialngIndex) = "24,00 €"
    ' Case Is > TimeSerial(8, 0, 0)
    ' avntValues(9, ialngIndex) = "12,00 €"
    ' Case Else
    ' avntValues(9, ialngIndex) = "Fehler"
    ' Debug.Print vntItem
    ' End Select
    ' End If
    ' Case Else
    ' avntValues(lngColumn, ialngIndex) = vntItem
    ' End Select
    ' lngColumn = lngColumn + 1
    ' Next
    ' ialngIndex = ialngIndex + 1
    ' Else
    ' Exit Do
    ' End If
    ' Loop
    ' End With
    ' Next
    ' lst_Dienstreise.Column = avntValues
    
    '############## Variante 2 ##########################################################################
    
    '----------- ListBox mit Daten von allen Sheets füllen mit Hilfe von ralf_b von herber.de ------ _
        _
        ---------------------------------------

    
    Dim lngMonth As Long, ialngIndex As Long, lngRow As Long
    Dim lngColumn As Long, lngDauer As Long
    Dim datBeginn As Date, datEnde As Date, strBeginnOrt As String
    Dim strEndeOrt As String, strReiseOrt As String
    Dim avntValues() As Variant, avntTemp As Variant, vntItem As Variant
    Dim datAbgabe As Date, datAnnahme As Date, datGezahlt As Date
    
    For lngMonth = 1 To 2 'auf 12 Monate erhöhen!!!
        lngRow = 12
        With Worksheets(MonthName(Month:=lngMonth))
            Do
                
                If ialngIndex = 4 Then MsgBox "x"
                If IsEmpty(.Cells(lngRow + 1, 26).Value) Then
                    lngRow = .Cells(lngRow, 26).End(xlDown).Row
                Else
                    lngRow = lngRow + 1
                End If
                If lngRow < .Rows.Count Then
                    'Festlegung der Listenspalten (hier 8)
                    Redim Preserve avntValues(11, ialngIndex)
                    
                    lngColumn = 0
                    datBeginn = CDate(.Cells(lngRow, "AA")) + CDate(.Cells(lngRow, "AB"))
                    datEnde = CDate(.Cells(lngRow, "AD")) + CDate(.Cells(lngRow, "AE"))
                    lngDauer = DateDiff("h", datBeginn, datEnde)
                    strBeginnOrt = Left(.Cells(lngRow, "AC"), 1)
                    strEndeOrt = Left(.Cells(lngRow, "AF"), 1)
                    datAbgabe = .Cells(lngRow, "AH").Value
                    datAnnahme = .Cells(lngRow, "AI").Value
                    
                    'Werte für Spalten 1-8 aus Spalte 26 bis 32 Sheets(oder 38 für AL)
                    avntTemp = .Range(.Cells(lngRow, 26), .Cells(lngRow, 35)).Value
                    
                    'Array Spaltengröße erhöhen und 2 Spalten hinzufügen
                    Redim Preserve avntTemp(1 To 1, UBound(avntTemp, 2) + 1)
                    
                    avntTemp(1, 7) = .Cells(lngRow, "AE") - .Cells(lngRow, "AB").Value '(Dauer)
                    avntTemp(1, 9) = datAbgabe
                    avntTemp(1, 10) = ""
                    
                    Select Case lngDauer
                        Case Is <= 8 'der Wert <= 8
                            avntTemp(1, 8) = "00,00 €"
                        Case Is >= 24
                            avntTemp(1, 7) = "24:00"
                            If strBeginnOrt = "A" Or strEndeOrt = "A" Then
                                avntTemp(1, 8) = "40,00 €"
                            ElseIf strBeginnOrt = "I" Or strEndeOrt = "I" Then
                                avntTemp(1, 8) = "40,00 €"
                            Else
                                avntTemp(1, 8) = "28,00 €"
                            End If
                        Case Is > 8
                            If strBeginnOrt = "A" Or strEndeOrt = "A" Then
                                avntTemp(1, 8) = "27,00 €"
                            ElseIf strBeginnOrt = "I" Or strEndeOrt = "I" Then
                                avntTemp(1, 8) = "27,00 €"
                            Else
                                avntTemp(1, 8) = "14,00 €"
                            End If
                        Case Else
                            avntTemp(1, 8) = "Fehler"
                            Debug.Print vntItem
                    End Select
                    
                    For Each vntItem In avntTemp
                        Select Case lngColumn
                            Case 2, 5, 7
                                avntValues(lngColumn, ialngIndex) = Format$(vntItem, "Hh:Nn")
                                lngColumn = lngColumn + 1
                            Case Else
                                avntValues(lngColumn, ialngIndex) = vntItem
                                lngColumn = lngColumn + 1
                        End Select
                    Next
                    avntValues(11, ialngIndex) = MonthName(Month:=lngMonth) & "|" & CStr(lngRow) '******************************************
                    ialngIndex = ialngIndex + 1
                Else
                    Exit Do
                End If
            Loop
        End With
    Next
    lst_Dienstreise.Column = avntValues
    '--------- Ende Füllen ListBox ---------------------------------------------------------------
    
    '--------- ComboBox "Monat" mit Monatsnamen vom Sheet füllen ---------------------------------
    Dim j As Integer
    
    'cbx_FilterMonat.Clear
    cbx_FilterMonat.AddItem "alle Monate"
    For j = 1 To 2 'auf 12 Monate ändern
        cbx_FilterMonat.AddItem Worksheets(j).name
    Next j
    cbx_FilterMonat.ListIndex = 0 'ersten Eintrag als Standard
    
    
    '--------- ComboBox "Reisezweck" füllen --------------------------------------------------------
    cbx_FilterZweck.AddItem "alle Reisezwecke"
    
    cbx_FilterZweck.ListIndex = 0
    
    '--------- ComboBox "offene Abrechungen" füllen ------------------------------------------------
    cbx_FilterOffen.AddItem "keine"
    
    cbx_FilterOffen.ListIndex = 0
    
End Sub

Private Sub lst_Dienstreise_Click()
    ' bei Klick wird der Datensatz in der Tabelle markiert (frm_Dienstreise auf Showmodal = False setzen)
    Dim avntAddress As Variant
    With lst_Dienstreise
        avntAddress = Split(.List(.ListIndex, 11), "|")
        If .List(.ListIndex, 9) > 0 And .List(.ListIndex, 10) <= 0 And .List(.ListIndex, 11) <= 0 Then
            Me.lbl_Status = "eingereicht"
        ElseIf .List(.ListIndex, 9) = 0 Then
            Me.lbl_Status = "nicht eingereicht"
        ElseIf .List(.ListIndex, 10) > 0 Then
            Me.lbl_Status = "geprüft"
        ElseIf .List(.ListIndex, 11) > 0 Then
            Me.lbl_Status = "abgerechnet"
        Else
            Exit Sub
        End If
        ' Select Case .List
        ' Case .ListIndex, 9 > 0: Me.lbl_Status = "eingereicht"
        ' Case .ListIndex, 9 = 0: Me.lbl_Status = "nicht eingereicht"
        ' Case .ListIndex, 10 > 0: Me.lbl_Status = "geprüft"
        ' Case .ListIndex, 11 > 0: Me.lbl_Status = "abgerechnet"
        ' End Select
    End With
    Call Application.GoTo(Reference:=Worksheets(avntAddress(0)).Cells(Clng(avntAddress(1)), 26))
End Sub

Gruß
Nepumuk
Anzeige
AW: Application.Goto(Reference: Erklärung
09.11.2020 18:34:47
Peer
Hallo Nepumuk.
Vielen Dank.
Genial.
Aber was macht die eingefügte Zeile?
Gruß
Peer
AW: Application.Goto(Reference: Erklärung
09.11.2020 18:39:10
Nepumuk
Hallo Peer,
die schreibt den Tabellennamen und die Zeile getrennt durch ein Pipe in das Array.
Gruß
Nepumuk
Vielen Dank, Nepumuk, für deine Hilfe (owT)
09.11.2020 18:45:56
Peer
Ist für mich aktuell hohe Mathematik.
Anzeige
AW: Application.Goto(Reference: Erklärung
09.11.2020 18:37:24
onur
Ach - in Spalte 12 waren die benötigten Daten versteckt ! :)
AW: Application.Goto(Reference: Erklärung
09.11.2020 17:30:31
onur
Du bist doch oft genug in diesem Forum dass du eigentlich wissen müstest, das die Aussage "bleibt der Debugger aber bei folgender Zeile hängen" OHNE die Fehlermeldung zu nennen Müll ist.
Cells(avntAddress(1), 0) gibt es nicht, weil es keine Spalte 0 gibt.
Anzeige
AW: Application.Goto(Reference: Erklärung
09.11.2020 17:43:11
Peer
Sorry onur.
"Laufzeitfehler 9 (Index außerhalb des Bereichs"
Gebe ich Spalte 1 eine, sagt das Lokalfenster den Wert der Spalte 2 (in diesem Fall das Datum).
Trotzdem bleibt der Fehler.
Die ListBox hat 8 Spalten, aber egal welche Spaltenzahl ich eingebe, erfolgreich bin ich nicht.
Deshalb wollte ich gern wissen, was die Anweisung aussagt.
Gruß
Peer
Anzeige
AW: Application.Goto(Reference: Erklärung
09.11.2020 17:56:53
onur
Der Code Zerstückelt die zweite Spalte (offenbar - warum auch immer - wurden dort mehrere Daten - durch "|" getrennt - reingequetscht) und nimmt den ZWEITEN Eintrag als Zeilennummer. Welche Spaltennummer, weisst nur du, da du die Datei hast.
Selbst wenn die Zeilennummer korrekt wäre - Splitfunktion spuckt Strings aus, die musst du erst in Long oder Int umwandeln.
Anzeige
AW: Application.Goto(Reference: Erklärung
09.11.2020 17:59:21
Peer
Hallo onur.
Vielen Dank für deine Erklärung.
Gruß
Peer
AW: Application.Goto(Reference: Erklärung
09.11.2020 18:15:19
onur
Verstehe den Code nicht - er versucht z.B. Blatt "Schulung" zu öffnen - aber es gibt kein solches Blatt.
WAS GENAU SOLL DENN JETZT DER CODE MACHEN ?
AW: Application.Goto(Reference: Erklärung
09.11.2020 18:28:31
Peer
Er soll bei Klick in lst_Dienstreise die dazugehörige Zeile im Sheet selektieren.
Wie kommst du auf Blatt "Schulung"?
Ich sende mal die Datei. Ich habe ebenfalls die Splitfunktion rausgenommen, aber es hat keine Einfluss.
Lass dich nicht beirren von meinen Code-Versuchen. In dem genannten Event möchte ich eine Abfrage über Einträge in der ListBox in lbl_Status einbauen. Da bin ich noch am Überlegen, wie ich das bewerkstellige, wenn Einträge vorhanden sind und/oder nicht.
Du kommst im Reiter "Erfassungsbeleg" mit dem Button "Dienstreise" auf die UF.
https://www.herber.de/bbs/user/141439.xlsm
Gruß
Peer
Anzeige
AW: Application.Goto(Reference: Erklärung
09.11.2020 20:44:25
ralf_b
Hallo Peer,
Da du den Code aus einer anderen Verwendung heraus für diese Listbox angepasst haben mußt, kannst du die Adresse der Zeile nicht finden.
Einen Lösungsvorschlag hätte ich. Um die entsprechende Addresse zu erhalten, sollte sie auch in der Listbox in einer oder zwei versteckten(nicht angzeigten) Spalten verfügbar gemacht werden.
Indem du avntValues um 2 Elemente vergrößerst und beim Schleifendurchlauf Tabellenname und Zeilennummer des Datensatzes reinschreibst, ist es später leicht möglich beim Klick die Werte aus der Listbox abzufragen. Wie das geht hast du dir hier erklären lassen wollen.
gruß
RB
Anzeige
AW: Application.Goto(Reference: Erklärung
09.11.2020 18:27:10
onur
Der Code ist bestimmt nicht auf deinem Mist gewachsen.
Irgend Jemand hat die Datei genommen und am Code herumgepfuscht, ohne die geringste Ahnung zu haben.
Z.B. werden die Daten in der ersten Spalte der Listbox durch "/" (Schulung / Seminar / ....) getrennt, aber der Code splittet die Spalte später nach "|", um sie wieder zu trennen.
usw usw
Anzeige
AW: Application.Goto(Reference: Erklärung
09.11.2020 17:59:35
Planlos
Weil nicht sichergestellt ist daß das Array auch die entsprechende Anzahl der Elemente hat welche du mit avntAddress(0) und avntAddress(1) erfragen tust.
;
Anzeige

Infobox / Tutorial

Anwendung der Methode Application.Goto in VBA


Schritt-für-Schritt-Anleitung

Um die Methode Application.Goto in Excel VBA richtig anzuwenden, befolge diese Schritte:

  1. Öffne den VBA-Editor in Excel durch Drücken von ALT + F11.

  2. Füge ein neues Modul hinzu oder öffne das bestehende Modul, in dem du den Code implementieren möchtest.

  3. Verwende den folgenden Code, um eine Zelle oder einen Bereich in einem Arbeitsblatt zu markieren:

    Sub GeheZuZelle()
       Application.Goto Reference:=Worksheets("Sheet1").Cells(1, 1)
    End Sub
  4. Passe den Code an, indem du den Namen des Arbeitsblattes und die gewünschte Zelle änderst.


Häufige Fehler und Lösungen

  • Laufzeitfehler 9 (Index außerhalb des Bereichs): Dieser Fehler tritt auf, wenn das angegebene Arbeitsblatt nicht existiert. Stelle sicher, dass der Arbeitsblattname korrekt ist.

  • Spalte 0 existiert nicht: Wenn du versuchst, auf Cells(avntAddress(1), 0) zuzugreifen, wirst du einen Fehler erhalten, da Excel keine Spalte 0 hat. Verwende stattdessen die Spalte 1 oder eine andere gültige Spalte.

  • Falsche Zellreferenz: Achte darauf, dass du die richtigen Indizes verwendest, besonders wenn du mit Arrays arbeitest. String-Werte müssen in die entsprechenden Datentypen umgewandelt werden, bevor sie in Cells verwendet werden.


Alternative Methoden

Wenn Application.Goto nicht die gewünschte Funktionalität bietet, kannst du auch folgende Methoden verwenden:

  • Selektieren einer Zelle direkt:

    Worksheets("Sheet1").Cells(1, 1).Select
  • Scrollen zu einer bestimmten Zelle:

    ActiveWindow.ScrollIntoView Left:=Worksheets("Sheet1").Cells(1, 1).Left, _
       Top:=Worksheets("Sheet1").Cells(1, 1).Top

Beide Methoden können nützlich sein, wenn du nur die Sicht auf eine Zelle ändern möchtest, ohne sie tatsächlich auszuwählen.


Praktische Beispiele

Hier sind einige spezifische Beispiele, wie Application.Goto in verschiedenen Szenarien verwendet werden kann:

  1. Eintrag in einer ListBox wählen und zur Zelle springen:

    Private Sub lst_Dienstreise_Click()
       Dim avntAddress As Variant
       With lst_Dienstreise
           avntAddress = Split(.List(.ListIndex, 1), "|")
           Call Application.Goto(Reference:=Worksheets(avntAddress(0)).Cells(avntAddress(1), 1))
       End With
    End Sub
  2. Markieren einer gesamten Zeile:

    Sub GeheZuZeile()
       Dim zeile As Long
       zeile = 5 ' Beispielzeile
       Application.Goto Reference:=Worksheets("Sheet1").Rows(zeile)
    End Sub

Tipps für Profis

  • Verwende Application.Goto mit ScrollIntoView: Wenn du nur die Sicht auf eine Zelle ändern möchtest, kann es sinnvoll sein, die Methode ScrollIntoView zu verwenden, um die Benutzeroberfläche nicht unnötig zu stören.

  • Fehlerbehandlung einbauen: Verwende On Error Resume Next, um Laufzeitfehler zu vermeiden, wenn du mit Application.Goto arbeitest.

    On Error Resume Next
    Application.Goto Reference:=Worksheets("Sheet1").Cells(1, 1)
    If Err.Number <> 0 Then
       MsgBox "Fehler beim Gehen zur Zelle."
    End If
  • Versteckte Spalten in ListBox: Wenn du mit ListBoxen arbeitest, stelle sicher, dass Tabellennamen und Zeileninformationen in versteckten Spalten gespeichert werden, um Probleme mit Application.Goto zu vermeiden.


FAQ: Häufige Fragen

1. Was ist der Unterschied zwischen Application.Goto und Select?
Application.Goto springt zu einer Zelle oder einem Bereich, während Select die Zelle auswählt. Goto kann nützlich sein, um die Sicht zu ändern, ohne die aktuelle Auswahl zu beeinflussen.

2. Wie kann ich sicherstellen, dass das Arbeitsblatt existiert, bevor ich Application.Goto verwende?
Du kannst eine Überprüfung einfügen:

If Not Evaluate("ISREF('" & "Sheet1" & "'!A1)") Then
    MsgBox "Das Arbeitsblatt existiert nicht."
Else
    Application.Goto Reference:=Worksheets("Sheet1").Cells(1, 1)
End If

3. Kann ich Application.Goto auch in einer Schleife verwenden?
Ja, du kannst Application.Goto in einer Schleife verwenden, um durch mehrere Zellen zu navigieren. Achte darauf, die Zellreferenzen korrekt zu handhaben.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige