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

Forumthread: SpecialCells(xlCellTypeVisible) richtig einbinden

SpecialCells(xlCellTypeVisible) richtig einbinden
10.03.2017 12:08:06
Marcel
Hallo zusammen,
ich habe ein Makro, dass mir Thumbnails anhand einer Artikelnummer in meine Exceldatei spielt. Die Exceldatei enthält >6000 Artikel. Ich möchte jedoch nicht für alle Artikel die Bilder ziehen sondern nur für die Artikel, die aktuell sichtbar sind, d.h. die ich über verschiedene Filter ausgewählt habe.
Im Forum habe ich gefunden, dass der Befehl "SpecialCells(xlCellTypeVisible)" wohl der sein soll, der mich weiter bringt nur weiß ich nicht wo ich den einbinden muss. Kann mir hier bitte jemand helfen?
Hier der Code zum Ziehen des Bildes:
  • 
    Public Sub prcInsertPicture()
    ' Legt das Dateiverzeichnis der Artikelbilder fest
    Const strPath = "\\PFAD\" '
    ' Definiert die Variablen Zeile (Row), SpalteArtNr (columnartnr), SpalteNild (ColumnPic),   _
    _
    Bildobjekt (object) und einen Index
    Dim lngRow As Long
    Dim lngIndex As Long
    Dim ArtNr As String
    Dim intColumnArtNr As Integer
    Dim intColumnPic As Integer
    Dim objShape As Object
    Dim Dateinamen As String
    Dim Verzeichnis As String
    ' Weist den Variablen SpalteArtNr (Column) und SpaltePic und Index Startwerte zu. In diesen  _
    _
    Spalten wird die artikelnummer gesucht und das Bild platziert.
    intColumnArtNr = 2
    intColumnPic = 1
    lngIndex = 27
    Range("B:B").Select
    Selection.NumberFormat = "0#\.####\.####"
    ' Löscht jedes Bild in der Arbeitsmappe
    For Each objShape In ActiveSheet.Shapes
    If objShape.Type = msoPicture Then objShape.Delete
    Next
    For lngRow = 2 To 4000
    ArtNr = Trim$(Cells(lngRow, intColumnArtNr).Text)
    Dateinamen = Left(ArtNr, 2) & "_" & Mid(ArtNr, 4, 4) & "_" & Right(ArtNr, 4)
    Verzeichnis = Left(ArtNr, 2) & "\" & Left(ArtNr, 2) & "_" & Mid(ArtNr, 4, 2) & "\"
    If ArtNr  "" Then
    If Dir$(strPath & Verzeichnis & Dateinamen & "_100" & ".jpg", vbNormal)  "" Then ' _
    _
    Prüft die Existenz eines Artikelbilds auf dem oben definierten Verzeichnis
    Set objShape = ActiveSheet.Pictures.Insert(strPath & Verzeichnis & Dateinamen &  _
    _
    "_100" & ".jpg") 'Fügt das Artikelbild in das aktive Tabellenblatt ein
    'Definiert die Position/Ausrichtung sowie Größe des Bilds
    With objShape
    .Left = Cells(lngRow, intColumnPic).Left
    .Top = Cells(lngRow, intColumnPic).Top
    .ShapeRange.Width = Cells(lngRow, intColumnPic).Height - 10
    End With
    ElseIf Dir$(strPath & Verzeichnis & Dateinamen & ".jpg", vbNormal)  "" Then ' Prü  _
    _
    ft die Existenz eines Artikelbilds auf dem oben definierten Verzeichnis
    Set objShape = ActiveSheet.Pictures.Insert(strPath & Verzeichnis & Dateinamen &  _
    _
    ".jpg") 'Fügt das Artikelbild in das aktive Tabellenblatt ein
    'Definiert die Position/Ausrichtung sowie Größe des Bilds
    With objShape
    .Left = Cells(lngRow, intColumnPic).Left
    .Top = Cells(lngRow, intColumnPic).Top
    .ShapeRange.Width = Cells(lngRow, intColumnPic).Width
    End With
    End If
    End If
    Next
    Set objShape = Nothing
    For Each objShape In ActiveSheet.Shapes
    If objShape.Type = msoPicture Then
    objShape.OnAction = "Bild_aendern"
    End If
    Next
    End Sub
    


  • Danke und Grüße
    Anzeige

    3
    Beiträge zum Forumthread
    Beiträge zu diesem Forumthread

    Betreff
    Datum
    Anwender
    Anzeige
    AW: SpecialCells(xlCellTypeVisible) richtig einbinden
    10.03.2017 12:41:25
    Daniel
    Hi
    dafür musst du so vorgehen.
    statt: For lngRow = 2 To 4000
    diese Schleife: For Each Zelle In Range("A2:A4000").SpecialCells(xlcelltypevisible)
    (zelle ist as Range zu dimensionieren)
    in der Schleife ersetzt du dann jedes Cells(lngRow, Spaltennummer)
    durch Cells(Zelle.Row, Spaltennummer) oder durch Zelle.Offset(0, Spaltennummer - 1)
    Gruß Daniel
    Anzeige
    AW: SpecialCells(xlCellTypeVisible) richtig einbinden
    13.03.2017 09:12:09
    Marcel
    Top, vielen Dank hat funktioniert!!!
    AW: SpecialCells(xlCellTypeVisible) richtig einbinden
    13.03.2017 11:19:13
    Marcel
    Halt noch eine Frage:
    Wie verhält sich das Problem bei dieser Formel?
    Sub Neu_formatieren()
    Dim lngRow As Long
    Dim lngColumn As Long
    Dim lngRowgesamt As Long
    Dim Bereich As Range
    Dim Gesamt As Range
    Cells(1, 1) = "Bild"
    For lngColumn = 1 To 8000
    Columns("A:A").ColumnWidth = 24 'Bild
    Next
    For lngRow = 2 To 8000
    If Trim$(Cells(lngRow, 2).Text)  "" Then
    Rows(lngRow).RowHeight = 129.75 'Definiert die Höhe der Zellen
    Else
    lngRowgesamt = lngRow
    Exit For 'Verlässt die For Schleife bei nicht vorhandenen Werten
    End If
    Next
    'Artikelnummer formatieren
    Range("B:B").Select
    Selection.NumberFormat = "0#\.####\.####"
    End Sub
    
    Nur durch das Ersetzen wie von Daniel geschrieben hat es nicht funktioniert...
    Danke und Gruß
    Anzeige
    ;
    Anzeige
    Anzeige

    Infobox / Tutorial

    SpecialCells(xlCellTypeVisible) in Excel VBA richtig nutzen


    Schritt-für-Schritt-Anleitung

    Um die SpecialCells(xlCellTypeVisible)-Methode in deinem VBA-Skript zu verwenden, gehe wie folgt vor:

    1. Ändere die Schleife: Ersetze die bestehende Schleife:

      For lngRow = 2 To 4000

      mit:

      For Each Zelle In Range("A2:A4000").SpecialCells(xlCellTypeVisible)
    2. Zugriff auf die Zellen: Ersetze alle Vorkommen von Cells(lngRow, <Spaltennummer>) durch:

      Cells(Zelle.Row, <Spaltennummer>)

      oder

      Zelle.Offset(0, <Spaltennummer> - 1)
    3. Aktualisiere den Rest des Codes: Achte darauf, dass alle Stellen, an denen du auf die Variable lngRow zugreifst, entsprechend angepasst werden.

    4. Überprüfe die Sichtbarkeit: Stelle sicher, dass die Zellen, die du bearbeitest, auch tatsächlich sichtbar sind, um Fehler zu vermeiden.


    Häufige Fehler und Lösungen

    • Fehler 1: Laufzeitfehler 1004: Keine sichtbaren Zellen gefunden

      • Lösung: Stelle sicher, dass im angegebenen Bereich sichtbare Zellen vorhanden sind. Wenn alle Zellen ausgeblendet sind, gibt es keine Zellen, die SpecialCells(xlCellTypeVisible) zurückgeben kann.
    • Fehler 2: Typenunterschied

      • Lösung: Achte darauf, dass du die Variable Zelle als Range deklariert hast:
        Dim Zelle As Range

    Alternative Methoden

    Wenn du nicht mit SpecialCells(xlCellTypeVisible) arbeiten möchtest, kannst du auch folgende Methoden in Betracht ziehen:

    • Filtern: Verwende die AutoFilter-Funktion von Excel, um nur die gewünschten Daten anzuzeigen und bearbeite dann die sichtbaren Zellen.

    • Verwendung von If-Bedingungen: Du kannst in deiner Schleife zusätzliche Bedingungen einfügen, um nur bestimmte Zellen zu bearbeiten, die du manuell definierst.


    Praktische Beispiele

    Hier ist ein einfaches Beispiel, das zeigt, wie du SpecialCells(xlCellTypeVisible) in einem Makro verwenden kannst:

    Public Sub BilderEinfügen()
        Dim Zelle As Range
        Dim strPath As String
        strPath = "\\PFAD\"
    
        For Each Zelle In Range("A2:A4000").SpecialCells(xlCellTypeVisible)
            If Not IsEmpty(Zelle) Then
                ' Dein Code zum Einfügen von Bildern hier
            End If
        Next Zelle
    End Sub

    Dieses Beispiel durchläuft nur die sichtbaren Zellen im Bereich A2:A4000 und führt für jede nicht leere Zelle den definierten Code aus.


    Tipps für Profis

    • Vermeide unnötige Selektionen: Arbeite direkt mit Objekten, anstatt erst etwas auszuwählen. Das macht deinen Code effizienter.

    • Fehlerbehandlung: Implementiere Fehlerbehandlungsroutinen mit On Error Resume Next, um Laufzeitfehler bei der Verwendung von SpecialCells abzufangen.

    • Variablen nutzen: Verwende Variablen für häufig verwendete Werte oder Objekte, um den Code lesbarer und wartungsfreundlicher zu machen.


    FAQ: Häufige Fragen

    1. Was ist SpecialCells(xlCellTypeVisible)?
    Es handelt sich um eine Methode in Excel VBA, die es dir ermöglicht, auf sichtbare Zellen in einem definierten Bereich zuzugreifen. Diese Methode ist besonders nützlich, wenn du mit gefilterten Daten arbeitest.

    2. Wie kann ich sicherstellen, dass mein Code für alle Excel-Versionen funktioniert?
    Achte darauf, dass du keine spezifischen Funktionen verwendest, die nur in neueren Versionen verfügbar sind. Teste den Code in verschiedenen Versionen, um die Kompatibilität sicherzustellen.

    3. Kann ich SpecialCells auch für andere Zelltypen verwenden?
    Ja, SpecialCells kann auch für andere Zelltypen wie xlCellTypeFormulas oder xlCellTypeBlanks verwendet werden, um spezifische Zellen basierend auf ihren Eigenschaften zu identifizieren.

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Entdecke mehr
    Finde genau, was du suchst

    Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

    Suche nach den besten Antworten
    Unsere beliebtesten Threads

    Entdecke unsere meistgeklickten Beiträge in der Google Suche

    Top 100 Threads jetzt ansehen
    Anzeige