Excel -- Prozedur mit Abfrage

Dieses Thema Excel -- Prozedur mit Abfrage im Forum "Microsoft Office Suite" wurde erstellt von freestyler96, 18. Jan. 2005.

Thema: Excel -- Prozedur mit Abfrage Hallo @ all, seit einiger Zeit tauche ich in die Tiefen von Excel ein. Die Makro - Funktionen die Office im...

  1. Hallo @ all,

    seit einiger Zeit tauche ich in die Tiefen von Excel ein. Die Makro - Funktionen die Office im allgemeinen bietet haben mir hier völlig neue Möglichkeiten eröffnet. Leider beschränken sich meine Kenntnisse im Visual - Basic nur darauf, aufgezeichnete Prozeduren im Nachgang im Editor zu bearbeiten. Somit ist mein Wissen über Befehle und Funktionen im Editor bisher noch arg beschränkt /aber ich arbeite an mir ;-).

    Meine Frage ist nun:

    Hat zufällig jemand bereits eine Prozedur, bei der gezielt Spalten glöscht werden können? Konkret stelle ich mir vor, dass, nach entsprechender Tastenkombination eine Abfrage aufgeht, welche Spalte (anhand der Überschrift) gelöscht werden soll. Ist diese Spalte nicht mehr vorhanden soll aber nicht die Fehlermeldung mit dem Debugger aufgehen sonder einfach nur eine Meldung, dass diese Spalte nicht mehr vorhanden bzw. falsch bezeichnet ist.

    Weiterhin wollte ich fragen, ob nicht jemand einen guten Tip für einen Link hat auf dem ich umfassende Funktionen/ Formeln für VisualBasic mit Anwendungsbeispielen bzw. guten Erklärungen finde?

    --> Als Gegenleistung kann ich ein fundiertes Formel-Wissen im Excel direkt anbieten (auch für anspruchsvolle und komplexe Problemlösungen).

    Vielen Dank für eure Hilfe
     
  2. Hi freestyler96,

    bzgl. deinem Vorhaben->Spalten-Löschen' hab ich mal folgenden Makro zusammengestellt.

    Die zu kontrollierenden Spaltenüberschriften sind in f_soll zusammengefaßt. Sie haben den Namen Spalte1 - Spalte7. Diese mußt Du entsprechend anpassen und ggf. das Feld erweitern oder verkleinern. In f_soll_cnt muß die Anzahl entsprechend angepaßt werden (jetzt: f_soll_cnt = 7).

    Als Zeile der Überschriften hab ich mal die Zeile 1 angenommen (definiert in Const c_ZeileSPNamen = 1). Ggf auch anpassen. Weiterhin habe ich die Annahme getroffen, daß die Spalten von 1 (also A) an zu kontrollieren sind.


    Zur Installation:
    a) Öffne eine neue Excel-Arbeitsmappe
    b) Mit Alt+F11 öffnest Du den VB-Editor
    c) Markiere im Pojektfenster VBAPoject(Mappe..)
    d) rechte Maustaste -> Einfügen -> Modul
    es öffnet sich das  Code-Fenster->Modul1'
    e) dort hinein kopierst Du das Makro per Copy & Paste
    f) zur Sicherheit schauen, ob beim Übersetzen Fehler kommen
    Menüleiste->Testen'-> Kopilieren von VBA-Projekt
    g) mit Alt+Q den VB-Editor schliessen
    h) Die Mappe unter einem Namen(z.B. Excel_SpaltenKontroolieren.xla) im Ordner->XLStart' des MS-Office-Verzeichnisses als MS-Excel-AddIn (.xla) speichern
    i) Excel beenden
    h) Excel starten
    j) Extras->AddIn-Manager... Durchsuchen
    die Datei im XLStart-Ordner aussuchen ok


    Ab jetzt wird das Makro beim Start von Excel geladen.

    Jetzt kannst Du dir einen Aufruf-Button erzeugen.
    a) in die Werkzeug-Leiste mit rechter Maus klicken -> Anpassen
    Es öffnet sich der Anpassen-Dialog
    b) aus dem Reiter->Befehle' unter Kategorie->Makro' auswählen
    c) den Smily im rechten Fenster->Befehle' anklicken und mit gedrückter linken Maustaste auf eine Werkzeugleiste ziehen.
    d) den neuen Smily mit der rechten Maustaste anklicken und unter->Schaltflächensymbol ändern' ein passendes auswählen
    e) wieder rechte Maustaste auf des neue Symbol -> Makro zuweisen
    Hier trägst Du den Namen des aufzurufenden Makros ein : SpaltenKontrollieren
    dann Ok
    f) Anpassen-Dialog schliessen


    Wenn Du noch weitere Fragen hast, dann melde dich.

    Gruß Matjes  ;)

    Code:
    Option Explicit
    
    'Verwaltuns-Struktur Spalten
    Type my_SpalteVerwaltung_typ
      s_SPName As String
      b_vorh As Boolean
    End Type
    
    '**************************************************************
    Sub SpaltenKontrollieren()
    '**************************************************************
     ->Definition, welche Zeile die Spaltennamen enthält
      Const c_ZeileSPNamen = 1
    
      Dim wb As Workbook, ws As Worksheet
      
     ->Verwaltung der Ist-Spalten
      Dim f_ist() As my_SpalteVerwaltung_typ, f_ist_cnt As Long
      
     ->Verwaltung der Soll-Spalten
      Dim f_soll() As my_SpalteVerwaltung_typ, f_soll_cnt As Long
     ->Definition der Soll-Spaltennamen (hier 7)
      ReDim f_soll(1 To 7)
      f_soll(1).s_SPName = Spalte1
      f_soll(2).s_SPName = Spalte2
      f_soll(3).s_SPName = Spalte3
      f_soll(4).s_SPName = Spalte4
      f_soll(5).s_SPName = Spalte5
      f_soll(6).s_SPName = Spalte6
      f_soll(7).s_SPName = Spalte7
      f_soll_cnt = 7
      
      
      Set wb = ActiveWorkbook
      Set ws = ActiveSheet
    
     ->prüfen, ob aktives Blatt Worksheet
      If ws.Type = xlWorksheet Then
       ->Arbeitsschleife
        Call Spaltenbearbeitung( _
                wb, ws, f_soll(), f_soll_cnt, f_ist, f_ist_cnt, c_ZeileSPNamen)
      Else
        MsgBox (aktives Blatt ist kein Worksheet.)
      End If
    Aufraeumen:
      On Error Resume Next
      Set wb = Nothing: Set ws = Nothing
      On Error GoTo 0
    End Sub
    '**************************************************************
    Function Spaltenbearbeitung( _
                wb As Workbook, ws As Worksheet, _
                f_soll() As my_SpalteVerwaltung_typ, f_soll_cnt As Long, _
                f_ist() As my_SpalteVerwaltung_typ, f_ist_cnt As Long, _
                l_zeile As Long)
    '**************************************************************
      Dim s_Txt_ist As String, s_Txt_soll_fehlt As String
      Dim s_Txt_Zusaetzlich As String, s_tmp As String
      Dim b_Mld_NurEinmal As Boolean, x As Long
      Dim s_Input As String, l_Input As Long, b_EingabeUnzul As Boolean
      Dim l_SpalteMax As Long, ret As Integer
      
     ->Endlosschleife bis Abbruch
      Do
       ->vorhandene Spaltenüberschriften feststellen
        Call Spalten_IstFeststellen(ws, f_ist, f_ist_cnt, l_zeile, l_SpalteMax)
        
       ->Abgleich mit den Soll-Spalten und Meldungstext-Aufbereitung
        Call AbgleichIstSoll(f_ist, f_ist_cnt, f_soll, f_soll_cnt, _
                      s_Txt_ist, s_Txt_soll_fehlt, s_Txt_Zusaetzlich)
                    
        If Not b_Mld_NurEinmal Then
         ->diese Meldung nur beim ersten Durchlauf
          b_Mld_NurEinmal = True
          MsgBox (s_Txt_soll_fehlt)->Meldung der fehlenden Soll-Spalten
          MsgBox (s_Txt_Zusaetzlich)->Meldung zusätzlicher Spalten
        End If
        
       ->Meldung der vorhanden Spalten und Lösch-Abfrage
        s_Input = InputBox( _
          s_Txt_ist & vbLf & vbLf & _
          Zum Löschen einer Spalte geben Sie bitte die SPNr. ein., _
          Spalten löschen, )
        
        If s_Input =  Then Exit Do->Abbruch oder keine Eingabe
        
       ->Eingabe auf Zeilennummer prüfen
        b_EingabeUnzul = True
        For x = 1 To Len(s_Input)
          s_tmp = Mid(s_Input, x, 1)
          Select Case s_tmp
            Case 0 To 9
            Case Else
              b_EingabeUnzul = False
              Exit For
          End Select
        Next
        If Not b_EingabeUnzul Then
          MsgBox (Bitte eine zulässige Spaltennummer eingeben.)
        Else
         ->String in eine Zahl umwandeln
          l_Input = s_Input
         ->Pruefen, ob es eine Zulässige Spaltennummer ist
          If (1 <= l_Input) And (l_Input <= l_SpalteMax) Then
            ret = MsgBox( _
                  Wollen Sie wirklich Spalte  & l_Input &  löschen?, _
                  vbQuestion + vbDefaultButton2 + vbYesNo)
            If ret = vbYes Then
             ->Spalte löschen
              ws.Columns(l_Input).Delete
            End If
          Else
            MsgBox (Spaltennummer  & l_Input &  ist unzulässig.)
          End If
        End If
      Loop
    End Function
    '**************************************************************
    Function Spalten_IstFeststellen(ws As Worksheet, _
                f_ist() As my_SpalteVerwaltung_typ, f_ist_cnt As Long, _
                l_zeile As Long, l_SpalteMax As Long)
    '**************************************************************
      Dim x As Long
        
     ->letzte Überschriftszeile feststellen
      l_SpalteMax = ws.Cells(l_zeile, ws.Columns.Count).End(xlToLeft).Column
      
     ->Feld initialisieren
      ReDim f_ist(1 To 1): f_ist_cnt = 0
      f_ist(1).b_vorh = False
      
      For x = 1 To l_SpalteMax
       ->neuen Eintrag bereitstellen
        f_ist_cnt = f_ist_cnt + 1
        ReDim Preserve f_ist(1 To f_ist_cnt)
       ->Spaltennamen eintragen
        f_ist(x).s_SPName = ws.Cells(l_zeile, x)
      Next x
    End Function
    '**************************************************************
    Function AbgleichIstSoll( _
              f_ist() As my_SpalteVerwaltung_typ, f_ist_cnt As Long, _
              f_soll() As my_SpalteVerwaltung_typ, f_soll_cnt As Long, _
              s_Txt_ist As String, s_Txt_soll_fehlt As String, _
              s_Txt_Zusaetzlich As String)
    '**************************************************************
      
      Dim i As Long, s As Long, b_gefunden As Boolean
      
     ->Ist / Soll abgleichen
      For i = 1 To f_ist_cnt
        For s = 1 To f_soll_cnt
          If f_ist(i).s_SPName = f_soll(s).s_SPName Then
            f_ist(i).b_vorh = True->Kennung Sollvorgabe
            f_soll(s).b_vorh = True->Kennung ist vorhanden
            Exit For
          End If
        Next s
      Next i
      
     ->s_Txt_soll_fehlt aufbereiten
      s_Txt_soll_fehlt = 
      For s = 1 To f_soll_cnt
        If f_soll(s).b_vorh = False Then
          s_Txt_soll_fehlt = s_Txt_soll_fehlt & vbLf & f_soll(s).s_SPName
        End If
      Next s
      If s_Txt_soll_fehlt =  Then
        s_Txt_soll_fehlt = Es sind alle Soll-Spalten vorhanden.
      End If
      s_Txt_soll_fehlt = fehlende Soll-Spalten: & vbLf & s_Txt_soll_fehlt
      
     ->s_Txt_Zusaetzlich aufbereiten
      s_Txt_Zusaetzlich = 
      For i = 1 To f_ist_cnt
        If f_ist(i).b_vorh = False Then
          s_Txt_Zusaetzlich = s_Txt_Zusaetzlich & vbLf & f_ist(i).s_SPName
        End If
      Next i
      If s_Txt_Zusaetzlich =  Then
        s_Txt_Zusaetzlich = Es sind keine zusätzlichen Spalten vorhanden.
      End If
      s_Txt_Zusaetzlich = zusätzliche Spalten: & vbLf & s_Txt_Zusaetzlich
      
     ->s_Txt_ist aufbereiten
      s_Txt_ist = 
      For i = 1 To f_ist_cnt
          s_Txt_ist = s_Txt_ist & vbLf & Format(i, ##0) &  ___  & f_ist(i).s_SPName
      Next i
      s_Txt_ist = vorhandene Spalten: & vbLf & vbLf & SPNr. & s_Txt_ist
    End Function
     
  3. Hallo Matjes,

    du hast mir gleich in mehrfacher Hinsicht geholfen.

    Die Prozedur funktioniert hervorragend und der weitere Abgleich von fehlenden und zusätzlichen Spalten ist mehr als ich selber bedacht und erhofft hatte.

    Mein Job bringt sowieso eine Vielzahl von Analysen, Statistiken und Bearbeitungen unterschiedlichen Umfangs der Datensätze mit sich.

    Für all das habe ich zwar schon diverse Prozeduren entwickelt - jedoch sind diese jeweils nur in diversen Arbeitsmappen gespeichert. Diese in die AddIns einzubinden war auch ein sehr nützlicher Hinweis.

    Ich danke dir vielmals für deine Hilfe - vielleicht kann ich mich bei Gelegenheit mal revanchieren.

    Hast du vielleicht noch einen Tip für einen Link auf dem ich mich weiter in das Thema einarbeiten kann?

    VIELEN DANK NOCH MAL!

    Mit besten Grüßen aus Berlin

    FREESTYLER96
     
  4. Hi freestyler96,

    auf dieser site findest du alle MS MVPs und deren Homepage - ist also ein ganz guter Ausgangspunkt.
    http://www.mvps.org/links.html

    Gruß Matjes :)
     
Die Seite wird geladen...

Excel -- Prozedur mit Abfrage - Ähnliche Themen

Forum Datum
Excel-Feature gesucht Microsoft Office Suite 11. Okt. 2016
Excel Tabelle Werte zu ordnen Microsoft Office Suite 23. Sep. 2016
Excel: Bereiche auf 'leer' Überprüfen Microsoft Office Suite 15. Sep. 2016
Import Datensatz inkl = und - Zeichen in Excel/Libre CALC Software: Empfehlungen, Gesuche & Problemlösungen 20. Mai 2016
Bestimmter User kann seine Excel Dateien nicht mehr direkt öffnen Software: Empfehlungen, Gesuche & Problemlösungen 16. Apr. 2016