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

Forumthread: Tabellenblatt unter VB ansprechen

Tabellenblatt unter VB ansprechen
04.05.2005 22:44:02
Frank
Hallo und Guten Abend Excelgemeinde,
komme wiedermal von einem Thema nicht los und auch nicht so recht weiter.
Hatte vor einiger Zeit mit Eurer großen Hilfe ein tolles Makro entwickelt. Dies möchte ich nun nach und nach über VB ansprechen. Vielleicht kennt sich jemand aus. Der Code hängt sich in der Zeile "...copy before:=Workbooks..." mit der Fehlermeldung Index ausserhalb des gültigen bereiches auf?
Kann mir jemand weiterhelfen
Gruß Frank
Option Explicit
Private xlApp As Object
Private xlwks As Object

Sub kopieren()
Dim xlwks As Excel.Application
Set xlwks = Excel.Application
With xlwks
.Worksheets(1).Select
.Worksheets(1).Copy Before:=.Workbooks("Kim_1.xls").Worksheets(1)
Application.Run "Kim_1.xls!transpons"
.Worksheets(1).Select
ActiveWindow.SelectedSheets.Delete
Application.DisplayAlerts = False
Application.ScreenUpdating = False
.Worksheets(3).Select
End With
End Sub



Sub transpons()
Dim intRow As Integer
Dim x As String
Range("A1:HQ100").Select
Selection.Copy
Sheets("Tabelle1").Select
Range("A1").Select
Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=True
Rows("2:2").Select ' Zeile 2 gelöscht
Application.CutCopyMode = False
Selection.Delete Shift:=xlUp
Range("A1").Select
Application.DisplayAlerts = False
End Sub

Anzeige

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Tabellenblatt unter VB ansprechen
04.05.2005 23:37:30
Nepumuk
Hallo Frank,
mit deinem Code erzeugst du eine leere Excel - Application. Das kann so nicht funktionieren. Entweder du öffnest die entsprechenden Mappen in dieser Application oder du greifst mit GetObject auf die geöffneten Mappen zu. Wobei eigentlich davon abzuraten ist, da es zu unvorhersehbaren Reaktionen kommen kann. Auch deine Methode, mit einem Verweis auf die ExcelX.OLB ist falsch. Denn damit ist die kompilierte Datei auf diese Excelversion festgelegt. Ich würde das an deiner Stelle so machen:


Option Explicit
Private Sub Main()
    Dim xlApp As Object
    Dim xlWbk1 As Object, xlWbk2 As Object
    On Error GoTo Err_exit
    Set xlApp = CreateObject(Class:="Excel.Application")
    Set xlWbk1 = xlApp.workbooks.open _
        ("D:\Eigene Dateien\Eigene Excelbeispiele\CallByName_Funktion.xls")
    Set xlWbk2 = xlApp.workbooks.open _
        ("D:\Eigene Dateien\Eigene Excelbeispiele\Diagrammdaten_aus_Array.xls")
    
'    Dein Code
    xlApp.displayalerts = False
    xlWbk1.worksheets(1).Delete
    xlApp.displayalerts = True
    xlWbk1.Close savechanges:=True
    xlWbk2.Close savechanges:=True
    Set xlApp = Nothing
    Set xlWbk1 = Nothing
    Set xlWbk2 = Nothing
Err_exit:
    MsgBox "Fehler: " & CStr(Err.Number) & vbLf & Err.Description, 16, "Fehler"
    If Not xlApp Is Nothing Then xlApp.Visible = True
End Sub


Du siehst, auch in VB muss eine Tabelle nicht aktiviert werden, um sie zu löschen.
Gruß
Nepumuk
Anzeige
AW: Tabellenblatt unter VB ansprechen
05.05.2005 00:05:47
Frank
Hallo Nepumuk,
Danke für Deine Bemühungen.
Ich habe ein Tabellenblatt, welches ich in ein anderes Workbook kopieren möchte. Deswegen die beiden SUB kopieren und SUB Transpons Anweisungen. Hatte mir gedacht, selectiere actives Worksheet, füge es im Workbook als erstes Tabellenblatt ein und transponiere. Nur verließen sie mich als ich das Workbook ansprechen wollte.
Ich werd es ausprobieren und mich wieder melden.
guts nächtle
Frank
Anzeige
AW: Tabellenblatt unter VB ansprechen
05.05.2005 00:43:37
Frank
kann doch noch nicht schlafen, bin ja am lernen und ausprobieren.
habe mir gedacht ich will ja das active Worksheet kopieren also xlwbk1 (hoffe dass es richtig ist) mit xlapp.worksheets(1) deklariert (Die Ausgangsdatei hat nur ein worksheet). Programm hängt sich mit Anwendungsfehler auf aber ich weiß nicht wo. Meine Userform muß ich schließen, sehe dann aber nicht mehr wo das makro hängt.
Werd wohl doch erst mal ruhen gehen.
Frank

Private Sub kopieren()
Dim xlApp As Object
Dim xlWbk1 As Object, xlWbk2 As Object
On Error GoTo Err_exit
Set xlApp = CreateObject(Class:="Excel.Application")
Set xlWbk1 = xlApp.Worksheets(1)
Set xlWbk2 = xlApp.Workbooks.Open("I:\Excel\Kerstin\Kim\Kim_1.xls")
xlApp.Worksheets(1).Select
xlApp.Worksheets(1).Copy Before:=Workbooks("Kim_1.xls").Worksheets(1)
Application.Run "Kim_1.xls!transpons"
xlApp.Worksheets(1).Select
ActiveWindow.SelectedSheets.Delete
Application.DisplayAlerts = False
Application.ScreenUpdating = False
xlApp.Worksheets(3).Select
xlApp.DisplayAlerts = False
xlWbk1.Worksheets(1).Delete
xlApp.DisplayAlerts = True
xlWbk1.Close savechanges:=True
xlWbk2.Close savechanges:=True
Set xlApp = Nothing
Set xlWbk1 = Nothing
Set xlWbk2 = Nothing
Err_exit:
MsgBox "Fehler: " & CStr(Err.Number) & vbLf & Err.Description, 16, "Fehler"
If Not xlApp Is Nothing Then xlApp.Visible = True
End Sub

Anzeige
AW: Tabellenblatt unter VB ansprechen
05.05.2005 08:22:00
Nepumuk
Hallo Frank,
du hast das Prinzip noch nicht begriffen. Dein Code:
***************************************************************************
Set xlWbk1 = xlApp.Worksheets(1)
Ich habe doch geschrieben, wenn du eine Application anlegst, dann ist die leer. Ohne Mappe ohne Tabellen. Wenn du eine neue Mappe anlegen willst, dann so:
Set xlWbk1 = xlApp.Workbooks.add
***************************************************************************
xlApp.Worksheets(1).Select
Ich habe doch geschrieben, das Select und Activate völlig unnötig sind.
***************************************************************************
xlApp.Worksheets(1).Copy Before:=Workbooks("Kim_1.xls").Worksheets(1)
Wozu machst du erst eine Objektvariable um das 1. Das aktive Tabellenblatt welches leer ist mit einer VBA - Anweisung zu kopieren?
Wenn dann so:
xlWbk1.worksheets(1).copy Before:=xlWbk2.worksheets(1)
***************************************************************************
Application.Run "Kim_1.xls!transpons"
Glaubst du wirklich, VB weiß was Application ist? Die Application die du angelegt hast heißt xlApp. Also:
xlApp.Run "Kim_1.xls!transpons"
***************************************************************************
xlApp.Worksheets(1).Select
Und schon wieder ein Select
***************************************************************************
ActiveWindow.SelectedSheets.Delete
Application.DisplayAlerts = False
Application.ScreenUpdating = False
Lauter VBA - Anweisungen !!!
***************************************************************************
Fassen wir mal die zwei Anweisungen zusammen.
xlApp.Worksheets(1).Select
ActiveWindow.SelectedSheets.Delete
Das kannst du doch ganz einfach so schreiben:
xlWbk1.worksheets(1).delete
***************************************************************************
xlApp.Worksheets(3).Select
Sage ich jetzt nichts, denn es kann ja sein, dass du beim Anzeigen der Mappe die 3. Tabelle vorgewählt haben willst.
Aber die Application ist immer noch unsichtbar, da die Visible - Eigenschaft auf False steht. Wenn du die Mappe sehen willst, dann:
xlApp.visible=True
Es ist auch völlig unklar, was in dem Makro eigentlich passieren soll. Ich habe mein Beispiel an deinen Code angelehnt, aber verstanden habe ich es nicht.
Gruß
Nepumuk
Anzeige
AW: Tabellenblatt unter VB ansprechen
05.05.2005 12:00:49
Frank
Hallo Nepumuk,
Danke, danke für Deine Ausdauer mit mir. Kann mich irgendwie nicht von VBA losreißen. Muß gleich auf Spätschicht - werde deswegen heute Abend erst weitermachen können.
Der Code macht folgendes (besser gesagt soll folgendes machen).
Ich habe eine geöffnete Arbeitsmappe mit nur einem Tabellenblatt(Name xyz). Dieses Blatt ist randvoll mit Daten aber "unsortiert". Ich selektiere dies und will es dann in die neue Arbeitsmappe "kim.xls" als erstes Tabellenblatt einfügen. Dort existieren Zwei Tabellenblätter (Radius und Tabelle1) Das "Durcheinander" wird über transponieren aufgearbeitet. Dieses aufgearbeitete Tabellenblatt wird wiederum selektiert und in Tabelle1 kopiert. (In Tabelle1 sind in einigen Zellen Formeln hinterlegt, die beim kopieren nicht überschrieben werden). Danach wird einfach das an 1. Stelle stehende Blatt gelöscht und das Blatt Tabelle1 (3)ausgewählt. Hoffe ich konnte mich verständlich ausdrücken.
Gruß Frank
Anzeige
AW: Tabellenblatt unter VB ansprechen
05.05.2005 14:28:59
Nepumuk
Hallo Frank,
das ist doch ganz einfach:


Option Explicit
Private Declare Function CreateToolhelp32Snapshot Lib "kernel32.dll" ( _
    ByVal dwFlags As Long, _
    ByVal th32ProcessID As LongAs Long
Private Declare Function Process32First Lib "kernel32.dll" ( _
    ByVal hSnapshot As Long, _
    ByRef lppe As PROCESSENTRY32) As Long
Private Declare Function Process32Next Lib "kernel32.dll" ( _
    ByVal hSnapshot As Long, _
    ByRef lppe As PROCESSENTRY32) As Long
Private Declare Function CloseHandle Lib "kernel32.dll" ( _
    ByVal hObject As LongAs Long
Private Const TH32CS_SNAPPROCESS = &H2
Private Const MAX_PATH = &H104
Private Type PROCESSENTRY32
    dwSize As Long
    cntUsage As Long
    th32ProcessID As Long
    th32DefaultHeapID As Long
    th32ModuleID As Long
    cntThreads As Long
    th32ParentProcessID As Long
    pcPriClassBase As Long
    dwFlags As Long
    szExeFile As String * MAX_PATH
End Type
Private Sub Main()
    Dim xlApp As Object, xlWbk As Object, xlWorksheet As Object
    On Error GoTo Err_exit
    If fncExcelRun Then
        Set xlApp = GetObject(, "excel.application")
        Set xlWorksheet = xlApp.activesheet
        xlApp.screenupdating = False
        Set xlWbk = xlApp.workbooks.open("I:\Excel\Kerstin\Kim\Kim_1.xls")
        xlWorksheet.Copy before:=xlWbk.worksheets(1)
        xlApp.Run "Kim_1.xls!transpons"
        xlApp.displayalerts = False
        xlWbk.worksheets(1).Delete
        xlWbk.Close savechanges:=True
        xlApp.displayalerts = True
        xlApp.screenupdating = True
        Set xlApp = Nothing
        Set xlWorksheet = Nothing
        Set xlWbk = Nothing
    Else
        MsgBox "Excel ist nicht gestartet.", 16, "Programmabbruch"
    End If
    Exit Sub
Err_exit:
    MsgBox "Fehler: " & CStr(Err.Number) & vbLf & vbLf & Err.Description, _
    16, "Fehlermeldung"
End Sub
Private Function fncExcelRun() As Boolean
    Dim Snap As Long, Process As PROCESSENTRY32, Result As Long
    Snap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
    If Snap <> -1 Then
        Process.dwSize = Len(Process)
        Result = Process32First(Snap, Process)
        Do Until Result = 0
            If InStr(1, UCase$(Process.szExeFile), "EXCEL.EXE") Then
                fncExcelRun = True
                Exit Function
            End If
            Result = Process32Next(Snap, Process)
        Loop
    End If
    CloseHandle Snap
End Function


Gruß
Nepumuk
Anzeige
AW: Tabellenblatt unter VB ansprechen
05.05.2005 14:48:51
Nepumuk
Hi Frank,
nachdem ich deine Antwort noch mal durchgelesen habe, bin ich mir nicht mehr sicher, ob das Programm genau das Richtige macht. Ich wollte den Beitrag aber nicht löschen. Denn, zu mindestens das Prinzip wird deutlich. Hoffe ich.
Gruß
Nepumuk
AW: Tabellenblatt unter VB ansprechen
05.05.2005 19:38:17
Frank
Hallo Nepumuk,
bin noch auf Arbeit - komme aber von meinem Problem irgendwie nicht los. Für mich ist es sehr wichtig, dass ich die Materie verstehe. Habe mir schon einen Ordner mit VB-Code angelegt, wo zu den einzelnen Befehlen ein Kommentar steht. Will ja das Haus vom Keller her bauen und nicht mit dem Dach anfangen. Mein Problem ist immer, dass ich Bereiche ansprechen will/muß welche keinen festen Namen/Bezug haben. Deswegen immer mein bestreben was zu selektieren. Wenn ich mir das in VB abgewöhnen kann ... ein Problemchen weniger. Muss hier noch bis 22:00Uhr arbeiten - 10min Wegezeit - und gleich den Code ausprobieren. Was macht eigentlich "Private Type PROCESSENTRY32"?
Frank
Anzeige
AW: Tabellenblatt unter VB ansprechen
05.05.2005 19:42:06
Nepumuk
Hallo Frank,
das ist ein benutzerdefinierter Datentyp.
Gruß
Nepumuk
AW: Tabellenblatt unter VB ansprechen
06.05.2005 11:10:07
Frank
Hi Nepumuk,
dass wird ja immer phantastischer - langsam komme ich dahinter was ihr immer meint mit objekten an VBA übergeben. Hatte mich gewundert, woher der Code wissen kann, dass er noch Tabellenblätter und Diagramme erstellen muß. Mit transpons wurde nach Kim.xls gewechselt wo ja der Code ursprünglich steht und unter VBA ausgeführt. Kein Umschreiben der Diagrammanweisúngen. Davor hatte es mir am meisten gegraut.
kann ich Dich trotzdem noch was fragen?
Die Kim.xls habe ich schreibgeschützt - wie kann ich es aber sicherstellen, dass das so bleibt. Den Haken bei Schreibschutz kann ja jeder rausmachen und wenn ich es mit einem namen schreibschütze kommt die Maske die mich fragt mit oder ohne Schreibschutz öffnen!
Ich möchte sie generell als schreibgeschützt deklarieren.
Zum anderen, ich kopiere doch am anfang das active sheet in die Kim.xls um es weiter zubearbeiten. Ich möchte diese Arbeitsmappe nach dem das sheet kopiert wurde ohne speichern auch beenden? Da ist wieder mein Problem, wie spreche ich was aktives(variables) an!!!!
schönen Tag noch Frank
Anzeige
AW: Tabellenblatt unter VB ansprechen
06.05.2005 15:17:32
Nepumuk
Hallo Frank,
1. Du hast doch gesehen, wie die aktive Tabelle als Objekt übernommen wird. Genauso machst du es mit der aktiven Mappe.
2. Vergib für die Mappe ein Schreib - Leseschutzkennwort und öffne sie über eine kleine VB - Routine schreibgeschützt.
Gruß
Nepumuk
AW: Tabellenblatt unter VB ansprechen
06.05.2005 19:14:11
Frank
Hallo Nepumuk,
habe mir jetzt mein VB Handbuch genommen und werde den Absatz Objekte/Klassen nochmal durcharbeiten.
Danke für Deine grandiose Hilfe.
Bis zum nächsten mal
Gruß Frank
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

Tabellenblatt mit VBA ansprechen


Schritt-für-Schritt-Anleitung

Um ein Tabellenblatt in Excel über VBA anzusprechen, kannst du die folgenden Schritte befolgen:

  1. Excel-Anwendung erstellen: Erstelle eine neue Instanz der Excel-Anwendung.

    Dim xlApp As Object
    Set xlApp = CreateObject("Excel.Application")
  2. Workbook öffnen: Öffne das gewünschte Workbook.

    Dim xlWbk As Object
    Set xlWbk = xlApp.Workbooks.Open("Pfad\zu\deiner\Datei.xlsx")
  3. Tabellenblatt ansprechen: Greife auf das gewünschte Tabellenblatt zu. Du kannst entweder nach Index oder Name darauf zugreifen.

    Dim xlSheet As Object
    Set xlSheet = xlWbk.Worksheets(1) ' Nach Index
    ' oder
    Set xlSheet = xlWbk.Worksheets("Tabellenblattname") ' Nach Namen
  4. Daten manipulieren: Jetzt kannst du Zellen ansprechen oder Daten kopieren.

    xlSheet.Range("A1").Value = "Neuer Wert"
  5. Workbook schließen: Schließe das Workbook und beende die Excel-Anwendung.

    xlWbk.Close SaveChanges:=True
    xlApp.Quit

Häufige Fehler und Lösungen

  • Fehler: Index außerhalb des gültigen Bereichs: Dies kann auftreten, wenn du versuchst, auf ein Tabellenblatt zuzugreifen, das nicht existiert. Stelle sicher, dass der Index oder der Name korrekt ist.

  • Fehler: Anwendung ist nicht sichtbar: Wenn du die Excel-Anwendung nicht sichtbar machst, kann es sein, dass du den Fortschritt deiner Makros nicht sehen kannst. Setze xlApp.Visible = True, um die Anwendung sichtbar zu machen.


Alternative Methoden

  • VBA Worksheet ansprechen ohne Namen: Du kannst auch mit xlWbk.Worksheets(1) das erste Tabellenblatt ansprechen, ohne den Namen zu verwenden.

  • VBA mehrere Worksheets ansprechen: Um auf mehrere Worksheets zuzugreifen, kannst du eine Schleife verwenden:

    Dim ws As Object
    For Each ws In xlWbk.Worksheets
       Debug.Print ws.Name
    Next ws

Praktische Beispiele

  1. Kopieren eines aktiven Tabellenblatts:

    xlApp.ActiveWorkbook.ActiveSheet.Copy Before:=xlWbk.Worksheets(1)
  2. Transponieren von Daten:

    xlSheet.Range("A1:Z10").Copy
    xlWbk.Worksheets(2).Range("A1").PasteSpecial Paste:=xlPasteAll, Transpose:=True
  3. Zelle in einem anderen Tabellenblatt ansprechen:

    Dim andereSheet As Object
    Set andereSheet = xlWbk.Worksheets("AnderesTabellenblatt")
    andereSheet.Range("A1").Value = "Wert"

Tipps für Profis

  • Vermeide Select und Activate: Diese Anweisungen machen deinen Code langsamer und anfälliger für Fehler. Arbeite direkt mit Objekten.

  • Fehlerbehandlung: Implementiere eine Fehlerbehandlung, um unerwartete Fehler abzufangen und zu behandeln.

    On Error GoTo Fehlerbehandlung
  • Verwendung von Variablen: Speichere häufig verwendete Objekte in Variablen, um den Code lesbarer und effizienter zu gestalten.


FAQ: Häufige Fragen

1. Wie spreche ich ein bestimmtes Tabellenblatt an? Du kannst ein Tabellenblatt entweder über seinen Namen oder seinen Index ansprechen:

Set xlSheet = xlWbk.Worksheets("MeinTabellenblatt")

2. Was ist der Unterschied zwischen Workbook und Worksheet in VBA? Workbook bezieht sich auf die gesamte Arbeitsmappe, während Worksheet ein einzelnes Tabellenblatt innerhalb dieser Arbeitsmappe darstellt.

3. Wie kann ich eine Zelle in einem anderen Tabellenblatt ansprechen? Verwende den Namen des Worksheets, gefolgt von der Zelle:

xlWbk.Worksheets("AnderesTabellenblatt").Range("A1").Value = "Neuer Wert"

Mit diesen Anleitungen und Tipps bist du bestens gerüstet, um in Excel VBA Tabellenblätter anzusprechen und effizient zu arbeiten.

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