Excel-Macros: Wer kennt sich aus?

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • Excel-Macros: Wer kennt sich aus?

      Hallo zusammen ,

      aus Erfahrung weiß ich , dass es hier Experten aller Art gibt .

      Problem : habe von Windows XP auf Windows 7 umgestellt .
      Nahezu alles läuft wieder , nur meine Excel-Macros nicht mehr !

      Es erscheint nach "Ausführen" der Text Laufzeitfehler "9" Index außerhalb des gültigen Bereiches bei Zeile

      Windows(Inp_Name) . Activate

      Fühlt sich jemand angesprocen ?!?

      Danke und Gruß

      D1
    • Moin,

      hast du schon versucht das Script schrittweise (F8 ) durchlaufen zu lassen.
      Da findet sich meist schon nach kurzer Suche der Grund allen Übels.

      Zur Not kannst du die Fehlersuche mit "Debug.print XXX" erweitern, wobei XXX dein Variablenname ist, dessen Wert dann im Direktfenster (über Anischt --> Direktfenster oder STRG + G) angezeigt wird.

      Erfahrungsgemäß würd ich sagen Excel will ein Tabellenblatt, Dokument o.ä. haben, welches es nicht bekommt. (Darauf geachtet, dass die Dateiendung in der Klammer des "Workbooks"-Befehls angegeben ist?)

      So Ad hoc könnte ich aber nicht sagen woran es liegt, kann mir auch nicht vorstellen, dass es nur an der reinen Windowsumstellung liegt. (Lerne aber gerne was Neues)
      Probier mal oben beschriebene Debug-Methode und schreib mal bei welcher Funktion der Fehler kommt.
      Hoffentlich konnt ich fürs Erste weiterhelfen.

      Gruß R_R
      ___________________________________
      "Halt' mal mein Bier! Ich muss überholen."

      "Sänk ju for Träwälling wiss Deutsche Bahn"
    • Dazu fallen mir spontan 4 Möglichkeiten ein:

      1. Öffne den VBA-Editor (ALT+F11) - Extras - Optionen - Allgemein - Haken muss "bei nicht verarbeiteten Fehlern" gesetzt sein

      2. Öffne Excel -Datei - Optionen - AddIns - Wähle die Dokumentenbezogenen AddIns ab, schliesse Excel und starte es neu

      3. Lösche die VBA-Funktionen - speichern - schreibe sie neu - abspeichern und neu starten.

      4. Prüfe ob die Tabellenblätter ggf. in verschiedenen Ordnern parallel gespeichert sind, prüfe auch ob die Pfade/Verweise nach dem Upgrade auf Win7 noch dieselben sind und passe sie ggf. an.

      Punkt 3 sollte es aber richten können.

      Viel Erfolg
    • *seufz*
      und schon ist mein hart ergaunertes Beitragzählerinkrement wieder weg ;(
      Dabei hab ich extra so getan, als ob ich zur Problemlösung beitragen kann...

      naja, zurück zum Tagesgeschäft ^^

      @ile: die Dateiendung hat nix mit der Windowsversion zu tun, auch wenn das womöglich naheliegt.
      Die Endungen *.doc, *.xls und so weiter sind Relikte aus der MS-Office-Welt bis Version 2003.
      Ab Version 2007 wurde das "x" überall angefügt.
      Da ungefähr um die Zeit Vista und Win 7 rauskamen, kann da ein Zusammenhang vermutet werden.

      Gruß R_R
      ___________________________________
      "Halt' mal mein Bier! Ich muss überholen."

      "Sänk ju for Träwälling wiss Deutsche Bahn"
    • Hallo zusammen ,

      danke für eure Tipps - aber ich komme nicht viel weiter :
      also Windows Xp lief einwandrei
      bei Windows 7 erscheint der Laufzeitfehler 9 ( s.U.)
      Wieso findet er die Datei nicht ?!?

      Modul-Anfang :

      Option Explicit

      Dim i As Integer
      Dim zeile As Integer
      Dim zz As Integer
      Dim blatt As Integer
      Dim s As Integer

      Dim akt_von As String
      Dim akt_nach As String
      Dim mem As String

      Const Inp_Name As String = "MSVdb.xls"

      Const outp_name = "LIS-TEL.xls"


      Sub Ausgeben()

      ----> Windows(Inp_Name).Activate <----- hier passiert es !
      akt_von = ActiveWorkbook.Name

      Noch eine Idee ?!?

      Gruß
      D1
    • Muss gestehen, dass ich keine Ahnung habe was der Const-Befehl macht. Bin immer ohne ausgekommen.

      So wie ich das interpretiere willst du die Variable Inp_name als String deklarieren und ihr dann den Wert "MSVdb.xls" zuordnen.

      Als Idee könnte ich zum einen anbieten, sofern das "const" keine zwingende Extrafunktion hat, die ich noch nicht kenne, obiges durch ein einfaches "Dim Inp_name As String" sowie später im Text mit "Inp_name = "MSVdb.xls" zu ersetzen.

      Andere Idee, vorausgesetzt der Name muss eine Variable sein, wovon ich jetzt mal ausgehe: Den "Windows().Activate"-Befehl gegen den "Workbooks().Activate"-Befehl ersetzen. Sollte soweit ich weiß dasselbe auslösen (Dateifenster aktivieren) . Meines Wissens wird "Windows" vom Makrorecorder verwendet. Möglicherweise ist die Art und Weise wie VBA auf einzelne Dateien zugreift oder was auch immer unter Win 7 anders als bei XP.

      Vielleicht hilft das weiter. Sind aber alles nur vage Ideen nach dem "ausprobieren und gucken woran es liegt"-Prinzip. Mal hat man Glück, mal probiert man ein wenig mehr. ^^

      Gruß R_R
      ___________________________________
      "Halt' mal mein Bier! Ich muss überholen."

      "Sänk ju for Träwälling wiss Deutsche Bahn"
    • Hi Ritter

      habe die Tipps ausprobiert - leider ohne wirklichen Erfolg.

      Noch 2 letzte Ideen , die mir so einfallen.

      1. Hast Du laufende Macros ab Windows 7 --> dann wären die ersten 10 Zeilen hilfreich wg. Open der Datei
      Vielleicht kann ich da "abkupfern"

      2. Ich habe das Macro vor langer Zeit mit "aufzeichnen" estellt .
      Weiß aber die Schritte nicht mehr - Kleine Hilfestellung wäre gut , wenn es möglich ist.

      Danke & Gruß
      D1
    • Nabend,

      Ich habe mal deinen Scriptschnipsel versucht nachzubauen bzw. dran rumgepfuscht. ^^

      Ich habe dein Problem bisher so verstanden, dass du mit der Datei, in der sich dein VBA-Modul befindet und ausgeführt wird, ein anderes Excel-Dokument aktivieren/in den Vordergrund bringen möchtest.
      Ich habs in "Test1.xls" ausführen lassen und wollte "Test2.xls" aktivieren. Das ging bisher nur, wenn beide bereits geöffnet waren (zur Not extra Datei öffnen-Befehl):

      Quellcode

      1. Const Inp_Name As String = "Test2.xls"
      2. Const outp_name = "LIS-TEL.xls"
      3. Sub Ausgeben()
      4. Windows(Inp_Name).Activate
      5. akt_von = ActiveWorkbook.Name
      6. End Sub

      Den Option Explicit Teil hab ich rausgenommen, da es auch so funktioniert.
      Unter der Prämisse also, dass der selbe Code unter Win XP funzt, könnte ich mir vorstellen, dass du unbewusst vielleicht besagte Datei nicht offen hast oder gar in einem anderen Verzeichnis, dessen Pfad Excel natürlich gern hätte.

      Von meinen Makros hab ich das erst beste genommen (weil einzige auf dem Rechner wo ich grad bin).
      Es ruft zwar nur andere Subs auf, ist aber auch der einzige Teil mit etwas "Besonderem" in der obersten Zeile:

      Quellcode

      1. Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
      2. Call Sub1
      3. Call Sub2
      4. Call Sub3
      5. 'usw.
      6. End Sub

      In einem dieser Subs kommt

      Quellcode

      1. Option Explicit
      2. Public CBoxJNNr
      vor, aber auch nur, weil CBoxJNNr das ganze Sub und daüber hinaus aktiv sein muss.

      Funzt aber auch unter Win 7.
      Makros, die eher in diese Richtung gehen, hab ich auf einem anderen Rechner (der aber auch XP ist). Ich kann mal gucken, ob die was Option Explicit o.ä. haben und testen, ob die Win 7 vertragen..
      Unter der Woche habe ich momentan nur recht wenig Zeit, deshalb kann ich leider nichts versprechen. Hoffe es ist nicht allzu zeitkritisch.
      Bis wann muss es wieder laufen?

      Gruß und Schöne Woche R_R

      PS: Bezogen auf die Aufzeichnung: Da hab ich bisher nur einmal mit rumgespielt, weil da vieles nicht für mich ersichtlich war. Leider kann ich mit dem Const-Befehl nix anfangen, vermute aber oben beschriebenes (Wert zuweisen, der Subübergreifend gelten soll).
      ___________________________________
      "Halt' mal mein Bier! Ich muss überholen."

      "Sänk ju for Träwälling wiss Deutsche Bahn"
    • Die Funktion mit der dur Schwierigkeiten hast bringt das Blatt in den Vordergrund.
      Das funktioniert bei Win7 nicht, der Fokus wird nicht gesetzt.

      Aber du mußt das Blatt nicht in den Vordergrund bringen um darauf zugreifen zu können.
      Es reicht wenn du per Makro die Datei öffnest und dann ganz normal darauf zugreifst z. B. mit der Funtkion

      MeineExcelDatei.MeinBlatt.Value usw.
    • Hallo Lukas ,

      danke für den Tipp .

      Was müsste ich in diesem kleinen Macro dann konkret ändern , damit es läuft ?!?

      Option Explicit

      Dim i As Integer
      Dim zeile As Integer
      Dim zz As Integer
      Dim blatt As Integer
      Dim s As Integer
      Dim anz As Integer

      Dim akt_von As String
      Dim akt_nach As String
      Dim mem As String

      Const Inp_Name As String = "MBdb.xls"

      Const outp_name = "Vn\MSVexcel\LIS-MAIL.xls"

      Sub Ausgeben()

      Windows(Inp_Name).Activate
      akt_von = ActiveWorkbook.Name

      Workbooks.Add
      akt_nach = ActiveWorkbook.Name

      zeile = 1
      anz = 0

      s = 1

      Windows("Mappe1").Activate
      Columns("A:A").Select
      Selection.ColumnWidth = 15
      Columns("B:B").Select
      Selection.ColumnWidth = 15
      Columns("C:C").Select
      Selection.ColumnWidth = 6
      Columns("D:D").Select
      Selection.ColumnWidth = 10
      Columns("E:E").Select
      Selection.ColumnWidth = 3
      Windows("Mappe1").Activate
      Columns("A:E").Select
      Selection.NumberFormat = "@"

      For i = 1 To 300
      If Workbooks(akt_von).Worksheets(1).Cells(i, 1).Value = "" And _
      Workbooks(akt_von).Worksheets(1).Cells(i + 1, 1).Value = "" Then

      Exit For
      End If

      If Workbooks(akt_von).Worksheets(1).Cells(i, 19).Value = "eMail" Then


      If zeile = 1 Then

      Workbooks(akt_nach).Worksheets(s).Cells(zeile, 1).Value = _
      "Name"
      Workbooks(akt_nach).Worksheets(s).Cells(zeile, 2).Value = _
      "Vorname"
      Workbooks(akt_nach).Worksheets(s).Cells(zeile, 3).Value = _
      "Kurz"
      Workbooks(akt_nach).Worksheets(s).Cells(zeile, 4).Value = _
      "Status"
      Workbooks(akt_nach).Worksheets(s).Cells(zeile, 5).Value = _
      "lfd"

      zeile = zeile + 2

      End If

      anz = anz + 1

      Workbooks(akt_nach).Worksheets(s).Cells(zeile, 1).Value = _
      Workbooks(akt_von).Worksheets(1).Cells(i, 1).Value

      Workbooks(akt_nach).Worksheets(s).Cells(zeile, 2).Value = _
      Workbooks(akt_von).Worksheets(1).Cells(i, 2).Value

      Workbooks(akt_nach).Worksheets(s).Cells(zeile, 3).Value = _
      Workbooks(akt_von).Worksheets(1).Cells(i, 3).Value

      Workbooks(akt_nach).Worksheets(s).Cells(zeile, 4).Value = _
      Workbooks(akt_von).Worksheets(1).Cells(i, 19).Value

      Workbooks(akt_nach).Worksheets(s).Cells(zeile, 5).Value = _
      anz

      Workbooks(akt_nach).Worksheets(s).Range(Cells(zeile, 5), Cells(zeile, 5)).Select
      Selection.HorizontalAlignment = xlRight

      zeile = zeile + 1


      ' Range("A1").Select
      End If

      Next i

      ActiveWorkbook.SaveAs Filename:=outp_name, FileFormat:= _
      xlNormal, Password:="", WriteResPassword:="", ReadOnlyRecommended:=False _
      , CreateBackup:=False


      ' ActiveWorkbook.Close





      End Sub

      ==> an welcher Stelle muss ich eingreifen ?

      Gruß
      D1
    • Ersetze das durchgestrichene durch das neue daneben:

      ActiveWorkbook.Name
      durch den Namen: also z. B.
      "d:\meineExcelDatei.xlsx"

      Windows(Inp_Name).Activate
      akt_von = ActiveWorkbook.Name "d:\meineExcelDatei.xlsx"

      Workbooks.Add
      akt_nach = ActiveWorkbook.Name "d:\meineZweiteExcelDatei.xlsx" (falls du eine andere Excel Datei brauchen solltest)


      Wenn du Glück hast funktioniert es damit bereits, falls nicht dann melde dich. (oder falls du nicht verstanden hast, wie es geht) :)


      Der Rest sieht ja gut aus:
      Workbooks(akt_nach).Worksheets(s).Cells(zeile, 2).Value = "Vorname"

      Falls du die Werte nur in der aktiven Excel Datei ändern wilst, brauchst du den Workbooks(...) nich angeben, dann geht auch:

      Worksheets(s).Cells(zeile, 2).Value = "Vorname"

      Falls du nur im aktiven Blatt etwas ändern willst, dann kannst du dir auch Worksheets(s) sparen und schreibst einfach:

      Cells(zeile, 2).Value = "Vorname"
      Cells(1, x).Font.Bold = True
      Cells(1, x).Interior.ColorIndex = 3
      Cells(1, x).Font.Size = 72
      Cells(1, x).Font.Color = RGB(99, 179, 73)
    • Hi d1,

      sorry, war eine recht ereignisreiche Woche. Ich übernehme mal kurz wieder den Staffelstab von sorim. ^^

      Wenn du das Vorhandensein einer Datei prüfen willst, probiers hiermit:

      Quellcode

      1. Sub Test()
      2. If Dir("C:\test.txt") = "" Then
      3. MsgBox "gibts nicht"
      4. Else
      5. MsgBox "gibts"
      6. End If
      7. End Sub


      Gruß R_R
      ___________________________________
      "Halt' mal mein Bier! Ich muss überholen."

      "Sänk ju for Träwälling wiss Deutsche Bahn"
    • Grafiken mit VBA auslesen

      Ich grabe das Thema nochmal aus in der Hoffnung, dass es auf der Arena VBA-Sachkundige gibt, die mir freundlicherweise helfen können und das hier auch noch lesen.

      Gibt es eine Möglichkeit Grafiken bzw. Shapes pixelweise anzusprechen resp. auszulesen?

      Ich würde nämlich gern eine bestimmte Aktion durchführen, wenn eine über die Zwischenablage eingefügte Grafik spezielle Attribute erfüllt.
      Sei es, dass sie gleich einer Referenzgrafik ist, die ich vorher hinterlegt habe oder Pixel (x,y) eine bestimmte Farbe aufweist.

      Die standardmäßigen Eigenschaften wie Höhe/Breite usw, die man auch mit einem Rechtsklick auf das Objekt ermitteln kann, reichen hier leider nicht aus.
      Habe mal was in der Form >ActiveSheet.Shapes("Bild")< versucht, weiß aber nicht womit ich nun weitermachen kann, werde gleichzeitig aber weder aus der VBA-Bibliothek schlau, noch nach Suchmaschinennutzung fündig.

      Gruß R_R