Anzeige
Archiv - Navigation
1404to1408
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
Inhaltsverzeichnis

Zugriff auf neu erstellte Instanz

Zugriff auf neu erstellte Instanz
05.02.2015 10:21:03
Henning
Hallo zusammen,
ich wende mich in größter Verzweiflung an euch:
Seit 2 Tagen versuche ich in einer Arbeitsmappe eine neue Instanz zu öffnen (das klappt) und in dieser dann ein paar Befehle auszuführen ( das klappt überhaupt nicht).
Ich habe nun mehrere Möglichkeiten ausgetüftelt, jedoch ohne Erfolg.
In Kurzfassung sieht der Code zur Zeit so aus:
Private Sub instanz ()
Dim sdApp As New Excel.Application
kunde = ComboBox36.text             'Kunde
With sdApp
.Workbooks.Open "Y:\Angebote\Stammdaten.xlsx"
.Visible = True
' .Selection = True                                     -> funktioniert nicht, schreibt in   _
_
bestehende Instanz
' .ActiveSheet "Kundenstammdaten"                       -> Unzulässige Verwendung einer  _
Eigenschaft
' .Worksheets(1).Activat ' "Kundenstammdaten"           -> Objekt unterstützt diese  _
Eigenschaft oder Methode nicht
' ActiveWorkbook.Sheets(1), Excel.Worksheet).Select()   -> ist nur ein Ansatz, weiß nicht   _
_
wie es weiter gehen soll
End With
'sdApp.Worksheets(1).Select                                 -> funktioniert nicht, schreibt in   _
_
bestehende Instanz
Rows(3).Insert
Cells(3, 1).Value = kunde              'Kunde
For i = 1 To 500
Cells(i + 1, 20).Value = i   'lfd Nummer
Next i
sdApp.Workbooks.Close 'SaveChanges:=True
sdApp.Quit
End Sub

Könnt ihr mir helfen?
Vielen lieben Dank schon einmal!
Viele Grüße
Henning

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Zugriff auf neu erstellte Instanz
05.02.2015 11:26:54
EtoPHG
Hallo Henning,
1. Das Selektieren (.Select, .Activate etc) ist in VBA zu 99.9% überflüssig und kontraproduktiv!
2. Was du überhaupt machen willst (sprich, welche Aktionen in der Arbeitsmappe auf welchem Tabellenblatt in welchen Bereichen auszuführen sind) beschreibst du leider nicht.
3. Wieso überhaupt eine eigene Excel-Instanz für dein Vorhaben nötig sein soll, erschliesst sich nicht aus deiner Problembeschreibung. Um nur ein paar Zellen in einer anderen Arbeitsmappe anzupassen, ist das sicher nicht nötig.
4. Ein Option Explicit gehört zwingend als 1 Codezeile in ein Klassenmodul um zu verhindern, dass undeklarierte Variablen und andere Fehler schon vor dem Ausführen durch den Compiler aufgedeckt werden. Dies insbesondere für VBA-Beginners.
5. Das es keine Methode wie erkennst du schon beim Erstellen eines Codes, da die IntelliSense-Hilfe keine solche Methode für ein Arbeitsblatt zur Verfügung stellt!
=> Beschreib was die Voraussetzung/Gegebenheiten und das Endresultat deines Vorhaben sind!
Gruess Hansueli

Anzeige
Korr: Pkt. 4 verhindern => forcieren!! (owT)
05.02.2015 11:32:32
EtoPHG

AW: Korr: Pkt. 4 verhindern => forcieren!! (owT)
05.02.2015 12:43:59
Henning
Hallo Hansueli,
danke schon einmal für deinen Einsatz.
Zu deinen Punkten:
1. Danke für den Hinweis - habe mir alles in Excel/VBA selbst beigebracht, daher bin ich nie mit "Struktur" an die Sache rangegangen. Du hast schon Recht, i.d.R. habe ich es nie gebraucht, da es hier ohne jedoch nicht funktioniert hat, habe ich es halt versucht ^^
2. Ich habe eine Excel die zur Kalkulation von Angeboten dient. Für jedes Angebot wird diese Datei neu gespeichert, damit auch später der Preis nachvollziehbar bleibt oder geändert werden kann. Jedoch gibt es einige "Stammdaten" die ich in eine externe Excel schreiben möchte, da diese auch für das nächste Angebot gelten...
Im Grunde wäre das dieser Code
Rows(3).Insert
Cells(3, 1).Value = kunde 'Kunde
For i = 1 To 500
Cells(i + 1, 20).Value = i 'lfd Nummer
Next i
sdApp.Workbooks.Close 'SaveChanges:=True
Natürlich werden ein paar mehr Variablen geschrieben, jedoch wäre das ja dann immer wieder der gleiche Vorgang...
3. ... Das geht grundsätzlich einfacher, auch da hast du wieder Recht, und ich hatte es sogar schon am Laufen. Jedoch bleibt die Exceltabelle "Stammdaten.xlsx" danach schreibgeschützt. Erst wenn der "Excel.exe *32"-Prozess im Tankmanager beendet wird, wird sie zur Bearbeitung wieder freigegeben. Daher war meine Hoffnung, wenn ich es in einer neuen Instanz öffne und diese dann vollständig schließe, wird die Datei beim nächsten Schreibversuch wieder Bearbeiter sein... (!?)
4. Damit werde ich mich mal befassen - da ich nur im Ansatz verstehe was du mir damit sagen willst ;-)
5. Wie gesagt, ich habe alles was ich in diversen Foren gefunden habe, versucht einzubringen...
Hast du jetzt ein besseres Bild?
Sonst helfe ich gerne weiter!
Vielen Dank noch einmal!

Anzeige
Die Voraussetzungen fehlen immer noch...
05.02.2015 13:22:17
EtoPHG
Henning,
Welche Aktion oder welches Ereignis soll den Code auslösen, damit etwas in die Arbeitsmappe 'Stammdaten.xlsx' geschrieben werden soll?
Soll eine neue Zeile 3 eingefügt werden, und anschliessend der Inhalt von ComboBox36 in die Spalte A dieser (neuen) Zeile geschrieben werden?
Was der unsinnige Code der For-Schleife für eine Bedeutung haben soll, entzieht sich meiner Vorstellung. Unsinnig erscheint er mir darum, da du immer wieder die Zahlen 1-500 in die Zellen T2:T501 schreibst.
Beantworte die Fragen und dir wird geholfen.
Gruess Hansueli

AW: Die Voraussetzungen fehlen immer noch...
05.02.2015 15:25:49
Henning
Ein Button in einem Formular löst den Code aus.
Das Schreiben der Variable in A3 hast du richtig erkannt, es würden dann noch weitere Variablen für B3, C3, ... folgen
Es wird also ein "neuer Kunde" angelegt.
Dieser Code hier hat bisher recht gut funktioniert:
For i = 1 To 500
Cells(i + 1, 20).Value = i 'lfd Nummer
Next i
Es geht mir darum, dass die Einträge von Zeile 2 bis 501 eine eindeutige laufende Nummer haben.
(Diese wird je Zelle doch nur 1x geschrieben, oder habe ich einen Denkfehler?)
Sinn macht das, wenn kein neuer Kunde angelegt wird, sondern die Daten eines bestehenden überschrieben werden sollen, dann kann ich nämlich anhand der laufenden Nummer, die korrekte Zeile finden, in der die bisherigen Daten stehen...
Vielleicht nicht elegant, aber effektiv ^^
Hilf dir das weiter?
Wie gesagt. wichtiger ist mir die Tatsache, dass die Stammdaten in einer eigenen Instanz geöffnet werden, damit diese sauber und absolut geschlossen wird und so beim nächsten Öffnen nicht schreibgeschützt ist.
Ich kann mich immer wieder nur für deinen Einsatz bedanken!

Anzeige
mal ein Vorschlag,
05.02.2015 16:19:26
EtoPHG
Henning,
Bei mir würde der Code so aussehen:
Option Explicit
Private Sub NeuerKundeEintragen()
Const cWBSD As String = "Stammdaten.xlsx"
Dim wbSD As Workbook
Application.ScreenUpdating = False
On Error Resume Next
' Stammdaten WB öffnen und Kundeneintrag schreiben
Set wbSD = Workbooks.Open(ThisWorkbook.Path & "\" & cWBSD)
On Error GoTo 0
If wbSD Is Nothing Then
MsgBox "Die Arbeitsmappe " & cWBSD & vbCrLf & _
"wurde auf dem Verzeichnis" & vbCrLf & _
ThisWorkbook.Path & vbCrLf & _
"NICHT gefunden!", vbCritical, "Keine Stammdaten"
Else
With wbSD
' Tabellenblatt "Kundenstammdaten" für (neue) Kundedaten
With .Worksheets("Kundenstammdaten")
' Neue Zeile für Kunde einfügen
.Rows(3).Insert
.Cells(3, 20).Formula = "=Row()-1"
.Cells(3, 1) = ComboBox36.Text      ' A3
'.Cells(3, 2) = ...                  ' B3 ....weitere Spalten
End With
' Workbook schliessen
.Close SaveChanges:=True
MsgBox "Die Kundendaten für " & ComboBox36 & " wurden gespeichert!", _
vbInformation, "Kundendaten gespeichert"
End With
End If
Application.ScreenUpdating = True
End Sub
Allerdings sehe ich denn Sinn der For-Schleife immer noch nicht, obwohl ich ihn auch eingebaut habe. Etwas anders zwar, aber das Resultat läuft auf das Gleiche raus und entspricht der Zeilenummer -1. Voraussetzungen sind: Die Stammdaten-Datei ist auf dem gleichen Verzeichnis gespeichert, wie die Mappe in welcher der Code abläuft. Sie enthält ein Tabellenblatt mit dem Namen 'Kundenstammdaten'.
Gruess Hansueli

Anzeige
AW: mal ein Vorschlag,
05.02.2015 16:32:12
Henning
Ich teste es heute Abend mal!
An der For-Schleife halte ich fest, da ich in der "Ursprungsexcel" nach der Eingabe des Kundennamens per SVERWEIS alle dazugehörigen Daten abrufe - unter anderem die "laufende Nummer".
Beim Schreiben der Daten kann ich dann darauf wieder zugreifen... (weil wie sollte ich per SVERWEIS die Zeilennummer herausfinden...?)
Wie gesagt, sicher nicht super-elegant aber bis auf das bisherige Problem (was du jetzt sicherlich gelöst hast) hat es immer gut funktioniert ^^
Vielen lieben Dank nochmal!
Feedback folgt!

AW: mal ein Vorschlag,
06.02.2015 16:32:11
Henning
Hallo Hansueli,
ich habe es nun mal getestet.
Dein Code tut absolut seine Arbeit...
Nur leider besteht hier bereits bei dem Speichern das Problem, dass die "Stammdaten.xlsx" "schreibgeschützt" ist (wenn ich sie per Mausklick öffne, ist sie es nicht!) und wird nicht einfach gespeichert, sondern es öffnet sich ein "Speichern-Dialog" wo mir angeboten wird die Datei als "Kopie von Stammdaten.xlsx" zu speichern...
Wenn ich die "Stammdaten.xlsx" nach dem gescheiterten Versuch per Mausklick öffne ist sie auch wieder "durch einen anderen Benutzer gesperrt"...
Ich bin echt am verzweifeln, es muss doch gehen, in eine andere Exceldatei so oft man will (also auch wiederholt) etwas zu schreiben...
Hast du noch eine Idee?

Anzeige
AW: mal ein Vorschlag,
06.02.2015 16:53:42
EtoPHG
Hallo Henning,
Du kannst also Stammdaten.xlsx via Explorer in Excel öffnen und auch speichern ohne irgendwelchen Meldungen?
Liegt noch andere VBA-Code irgendwo rum?
Welcher Benutzername wird angegeben, wenn die Gesperrt Meldung kommt?
Gibt es Schreibrestriktionen auf dem Verzeichnis?
Laufen noch andere XL-Instanzen?
Füge diese Zeilen in den Code ab With wbSD
        With wbSD
If .ReadOnly Then
MsgBox cWBSD & " ist gesperrt!", vbCritical, "No Way!"
.Close savechanges:=False
Exit Sub
End If
' Tabellenblatt "Kundenstammdaten" für (neue) Kundedaten
damit wird geprüft ob die Datei anderweitig geöffnet ist und es wird nichts in die Datei geschrieben!
Leider kann ich nicht mehr sagen.
Gruess Hansueli

Anzeige
AW: mal ein Vorschlag,
06.02.2015 17:40:27
Henning
Also da liegt noch jede Menge VBA-Code rum, aber das sprengt echt den Rahmen:
Habe um die 20 Module mit oftmals mehreren Sub's, ca. 10 Formulare und auch in dem Tabellenstart einiges an Code...
Es wird kein Benutzername angegeben nur
"'Stammdaten.xlsx' ist zum Bearbeiten
durch 'einen anderen Benutzer' gesperrt.
…"
Buttons: "Schreibgeschützt" / "Benachrichtigen" / "Abbrechen"
Die Excel liegt auf unserem Server, dort habe ich aber alle Rechte...
Außer der Excel-Instanz aus der dein Code gestartet wird, läuft keine.
Deinen Code habe ich eingefügt.
Das Kuriose ist: selbst wenn ich alles schließe, mich abmelde und wieder anmelde (an Windows) - Der Code blockt es sofort... (es ist also schreibgeschützt...
Wenn ich nun alle Excel-Dateien schließe und öffne die 'Stammdaten.xlsx' pr Mausklick: kann ich ändern, speichern usw...
:-/
Kann das doch am vorangehenden Code liegen?
Vielen Dank noch einmal!

Anzeige
Eingrenzung des Fehlers
06.02.2015 20:26:34
Henning
Hallo Hansueli,
ich habe die ganze Konstellation jetzt mal lokal gespeichert - hier funktioniert alles wie am Schnürchen...
Sogar wenn die "Stammdaten.xlsx" geöffnet ist!
Es scheint also tatsächlich mit der Tatsache zusammenzuhängen, dass die Stammdaten-Excel auf dem Server liegt.
Tja nun weiß ich auch nicht weiter... Tatsache ist, dass wir zu viert mit dem Tool arbeiten müssen - da fällt mir zZ keine andere Lösung ein.
Ich danke dir trotzdem vielmals! Ich habe viel dazu gelernt und ein sehr schönes Programm an der Hand!
Ein schönes Wochenende wünsche ich dir!

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige