chef1568
Goto Top

Vba Excel Tabellenblatt nach Zellennamen durchsuchen

Hallo,

ich habe ein Problem bei meinem VBA-Script.
Und zwar möchte ich ein bestimmtes Tabellenblatt durchsuchen ob ein bestimmter Zellenname vorhanden ist.

Sub Zellenname_suchen()

Dim Tabelle As String 'Tabellenblatt Name  
Dim STG(0 To 100, 0 To 2) As String 'Array  
Dim iSTG, jSTG As Integer 'Zähler  

'Array einlesen  
For iSTG = 3 To 100                        'Startadresse Zeile 4...54 --> Zeile 10 = Adresse 11  
    For jSTG = 0 To 1                       'Startadresse Spalte A..C --> Spalte A = Adresse 0  
        STG(iSTG, jSTG) = Sheets("Tabelle").Cells(iSTG + 1, jSTG + 1).Value  
    Next jSTG

    If Range(STG(iSTG, 1) & "_SWnummer").Value = STG(iSTG, 1) & "_SWnummer" Then  
        '##############  
        ' Code  
        '##############  
    End If
Next iSTG

End Sub

Leider funktioniert der Code nicht und gibt immer einen Fehler aus.
Das Problem liegt irgendwo in Zeile 13.

Laufzeitfehler '1004':  
Die Methode 'Range' für das Objekt '_Global' ist fehlgeschlagen  

Auch die explizierte Definition des Tabellenblattes funktioniert nicht
    If Sheets("Tabelle").Range(STG(iSTG, 1) & "_SWnummer").Value = STG(iSTG, 1) & "_SWnummer" Then  
Laufzeitfehler '1004':  
Anwendungs- oder objektdefinierter Fehler

Wäre für einen Tipp dankbar
Gruß Feder

Content-ID: 246614

Url: https://administrator.de/contentid/246614

Ausgedruckt am: 05.11.2024 um 10:11 Uhr

colinardo
colinardo 16.08.2014 um 10:59:54 Uhr
Goto Top
Hallo Feder,
suchst du nach Zellnamen also dem Alias den man für einen Zellbereich auf dem Tab Formeln > Namensmanager festlegen kann, oder nur nach dem Inhalt bzw. Wert einer Zelle ?

Du gibst nämlich in Zeile 13 als Range keine Zelladressierung an sondern einen String-Namen für einen Bereich, und wenn dieser nicht existiert läuft das Script natürlich in eine Exception.
Aber erkläre doch mal was du wo suchst, denn dein Ansatz ist viel zu kompliziert gedacht für diese Aufgabe.
Mit der Range.Find Methode ist das ganze wesentlich schneller und effektiver erledigt.

Grüße Uwe
chef1568
chef1568 17.08.2014 um 17:36:32 Uhr
Goto Top
Ja genau, ich suche den Zellennamen - nicht den Inhalt der Zelle!
Und den suche ich in einem ausgewähltem Tabellenblatt (also in allen Spalten des Tabellenblattes XY.

Das Ergebnis soll dann wie folgt aussehen:
Zellenname in ausgewähltem Tabellenblatt vorhanden (egal wo) = TRUE
Zellenname in ausgewähltem Tabellenblatt nicht vorhanden = FALSE
colinardo
Lösung colinardo 17.08.2014 aktualisiert um 18:45:44 Uhr
Goto Top
Sub FindRangeName()
    Dim ws As Worksheet, cell As Range, found As Boolean, objDic As Object, n As Name
    'Bestimmtes Worksheet verwenden  
    Set ws = Worksheets("Tabelle")  
    'Dictionary Objekt erstellen  
    Set objDic = CreateObject("Scripting.Dictionary")  
    'Alle Bereichsnamen in das Dictionary laden  
    For Each n In ActiveWorkbook.Names
        objDic.Add n.Name, ""  
    Next
    'Suche im belegten Bereich des Worksheets nach einem Bereichsnamen der sich aus dem Zellwert und dem String "_SWNummer" zusammensetzt  
    For Each cell In ws.UsedRange
        ' wenn der Bereichsname existiert verlasse die Schleife  
        If objDic.Exists(cell.Value & "_SWNummer") Then  
            found = True
            Exit For
        End If
    Next
    If found Then
        MsgBox "Gefunden"           'Gefunden  
    Else
        MsgBox "Nicht gefunden"        'nicht gefunden  
    End If
    Set objDic = Nothing
End Sub
chef1568
chef1568 17.08.2014 um 18:52:56 Uhr
Goto Top
Hallo colinardo,

danke für deinen Lösungsvorschlag.

Ich habe derzeit eine andere Variante als Lösung gefunden

 
Sub Zellenname_suchen()

Dim Tabelle As String 'Tabellenblatt Name  
Dim STG(0 To 100, 0 To 2) As String 'Array  
Dim iSTG, jSTG As Integer 'Zähler  
Dim STGexist 'mit Range-Informationen  

'Array einlesen  
For iSTG = 3 To 100                        'Startadresse Zeile 4...54 --> Zeile 10 = Adresse 11  
    For jSTG = 0 To 1                       'Startadresse Spalte A..C --> Spalte A = Adresse 0  
        STG(iSTG, jSTG) = Sheets("Tabelle").Cells(iSTG + 1, jSTG + 1).Value  
    Next jSTG

    On Error Resume Next
    STGexist = Names(STG(iSTG, 1) & "_SWnummer")  
            
    If Not STGexist = "" Then  
        '##############  
        ' Code  
        '##############  
    End If
Next iSTG

End Sub

Trotzdem danke für deine Lösung - werde sie bei Gelegenheit auch mal testen und vielleicht auch so einbauen weil ich deine Lösung etwas eleganter finde face-wink
mfg feder
colinardo
colinardo 17.08.2014 aktualisiert um 18:54:24 Uhr
Goto Top
"Dirty" gehts natürlich auch face-wink

Grüße Uwe