Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
604to608
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
604to608
604to608
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
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

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
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

74 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige