Excel -- Prozedur mit Abfrage

  • #1
F

freestyler96

Bekanntes Mitglied
Themenersteller
Dabei seit
11.01.2005
Beiträge
114
Reaktionspunkte
0
Ort
Berlin
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 :)
 
Thema:

Excel -- Prozedur mit Abfrage

ANGEBOTE & SPONSOREN

Statistik des Forums

Themen
113.838
Beiträge
707.961
Mitglieder
51.491
Neuestes Mitglied
haraldmuc
Oben