PDA

Vollständige Version anzeigen : Meldungsfenster vor Makro-Ausführung


Nymphie
28.02.2008, 20:36
Guten Abend,

ich bräuchte Hilfe zu folgender Aufgabenstellung:
(MSO 2003)

Beim Anklicken einer Schaltfläche soll ein Makro ausgeführt werden. Das Makro ist bereits fertig: es kopiert einen Bereich aus einem Vorlagenblatt an die aktuelle Cursorposition.

Allerdings ist es so: falls man versäumt hat, den Cursor an die richtige Stelle zu setzen ist der Vorgang nicht mehr rückgängig zu machen.

Daher würde ich gern nach dem Anklicken der Schaltfläche ein Meldungsfenster erscheinen lassen mit "bitte Cursor an die Einfügestelle positionieren".
Es sollte eine Abbruch-Möglichkeit geben und eine Möglichkeit, den Cursor zu positionieren um dann das Makro fortzusetzen.

Hat mir jemand einen Tipp dazu? Wär' super :-) !

Danke
Angie

pefeu
28.02.2008, 20:43
Hallo Angie,

mit einem Meldungsfenster, einer MsgBox wirst du keinen Erfolg haben, denn neben der kannst du keinen Cursor mehr positionieren, sondern nur die Buttons der MsgBox bedienen.
Du musst dir wohl ein UserForm(ular) bauen das du mit ShowModal = False ausstatten musst, um daneben noch deinen Cursor zu positionieren.

Gruß Peter

Sebastian Schulz
28.02.2008, 21:00
Hallo Angie, hallo peter,

du könntest mit Application.InputBox(type:=8) arbeiten.

Nymphie
28.02.2008, 22:18
Hallo Sebastian und Peter,

vielen Dank für Eure schnellen Antworten.

Leider bin ich nicht fit in VB und muss mir das mühsam zusammenstupfeln.

An welcher Stelle müsste ich den Code denn eingeben? Gleich zu Beginn des Makros? Ich werde erst morgen Abend dazu kommen, das auszuprobieren. Falls Ihr noch einen Tipp für mich hättet, wie ich das verwende, könnte ich das dann gleich mit einbauen.

Für heute wünsche ich erst mal einen schönen Abend!

Viele Grüße
Angie

mumpel
29.02.2008, 03:40
Hallo!

Das geht damit:

Sub Test()
ThisWorkbook.Sheets("Vorlage").Range("A1").Copy _
Application.InputBox("In welcher Zelle soll eingefügt werden?", Type:=8)
End Sub


Im ersten Teil (ThisWorkbook.Sheets("Vorlage").Range("A1").Copy) gibst Du an, woher die Daten kommen, der zweite Teil öffnet eine Inputbox, in der Du die Zielzelle(n) eingibst.

Gruß, Rene

jinx
29.02.2008, 05:19
<font size="2" face="Century Gothic">Moin, Rene,

das Wählen von Abbrechen führt zu einem Laufzeitfehler:

Sub Test()
On Error Resume Next
ThisWorkbook.Sheets("Vorlage").Range("A1").Copy _
Application.InputBox("In welche Zelle soll eingefügt werden?", Type:=8)
End Sub
<hr>
Sub Test2()
Dim rngCopyTo As Range
On Error Resume Next
Set rngCopyTo = Application.InputBox("In welche Zelle soll eingefügt werden?", Type:=8)
If Not rngCopyTo Is Nothing Then
rngCopyTo = ThisWorkbook.Sheets("Vorlage").Range("A1").Value
End If
Set rngCopyTo = Nothing
End Sub</font>

Nymphie
09.03.2008, 02:51
Hallo Ihr Beiden,

ich muss mich erst mal für meine verspätete Antwort entschuldigen... ich bin leider erst heute dazu gekommen, mich wieder mit meinem Problem(chen) zu beschäftigen (und wie Ihr an der Uhrzeit seht schlage ich mir damit schon wieder die halbe Nacht um die Ohren).

Vielen Dank jedenfalls für Eure Hilfe... ich nähere mich der Lösung an.

Das mit der Box an sich ist schonmal klasse!

Allerdings:
es tut noch nicht.
(Wenn ich das richtig verstanden habe, würde mir Test2 reichen?)

Bei mir sieht das jetzt so aus:


Public Sub Kopieren()
Dim rngCopyTo As Range
'On Error Resume Next - habe ich mal deaktiviert in der Hoffnung, herauszufinden, warum es nicht tut
Set rngCopyTo = Application.InputBox("In welche Zelle soll eingefügt werden? Bitte in der richtigen Zeile in Spalte A klicken", Type:=8)
If Not rngCopyTo Is Nothing Then
rngCopyTo = ThisWorkbook.Sheets("Vorlage").Range("T_Vorlage").Value
End If
Set rngCopyTo = Nothing
ActiveWindow.SelectedSheets.HPageBreaks.Add Before:=rngCopyTo 'Seitenumbruch vor neuem Protokoll einfügen
Worksheets("Vorlage").Range("T_Vorlage").Copy Destination:=rngCopyTo
ActiveWorkbook.Names("T_Vorlage").Delete 'Löschen des mitkopierten Bereichsnamens
End Sub

Zur Ergänzung: ich habe ein Blatt "Vorlage" mit einem Bereich "T_Vorlage"
T_Vorlage soll in ein anderes Arbeitsblatt eingefügt werden, das schon eine ganze Reihe an Zeilen hat. Der einzukopierende Bereich muss zwingend direkt unter den bereits vorhandenen Bereich angefügt werden, da sonst der Autofilter nicht mehr funktioniert.

Geht noch folgendes:
anstatt immer aufpassen zu müssen, dass jemand tatsächlich in die erste Spalte klickt würde ich gern eine beliebige Spaltenposition zulassen und Excel ergänzt von sich aus auf A+Reihennr.
Das wäre einfach nochmal ein Stückchen Komfort.

Jetzt gehe ich erst mal schlafen - denn im Moment komme ich eh nicht weiter ;-)

Gute Nacht
Angie

jinx
09.03.2008, 07:58
<font size="2" face="Century Gothic">Moin, Angie,

da die Mappe fehlt, bin ich auf Spekulationen angewiesen. Aus dem ermittelten rngCopyTo benötigt man nur den Namen der Tabelle, die erste freie Zeile in Spalte A kann festgelegt werden, rngCopyTo vor dem Kopieren freizusetzen macht IMHO keinen Sinn, denn dann fehlt die Angabe, wohin kopiert werden soll, ich würde nur die Werte kopieren, nicht den Bereich (also keine Formate)...</font>

Nymphie
09.03.2008, 12:36
Hi jinx,

meinst Du den Namen der Datei?
Die Datei heißt "Beschluesse" (es geht um die vom Gesetzgeber seit einiger Zeit geforderte Beschluss-Sammlung für Hausverwalter, die zusätzlich zu den Sitzungsprotokollen geführt werden muss, dabei überlappen sich die Inhalte weitgehend).

Vielleicht fasse ich nochmal kurz zusammen:
Die Datei hat ca. 100 Tabellenblätter die vom Aufbau her gleich sind.
Jedes Blatt muss in Hochformat und in Querformat gedruckt werden. Dabei findet jeweils eine Auswahl nach bestimmten Kriterien statt.

Im Lauf eines Jahres kommen weitere Tabellenblätter hinzu.
Hierfür wird das Blatt "Vorlage" kopiert und umbenannt.

Das Blatt Vorlage enthält einen allgemeinen (Adress-)Teil und einen speziellen Teil (für's jeweilige Protokoll)

Auf jedem Blatt kommt jedes Jahr ein weiteres Protokoll hinzu.
Also hole ich mir vom Blatt Vorlage den Bereich T_Vorlage über ein Makro. Dabei muss natürlich die Formatierung mitkopiert werden.

Das funktioniert auch schon alles.

Jetzt wollte ich nur noch dafür sorgen, dass T_Vorlage nicht aus Versehen an eine falsche Position kopiert werden kann, da dieser Vorgang nicht mehr rückgängig gemacht werden kann.

Deswegen wollte ich über eine Meldung sicherstellen, dass der Cursor genau dort steht, wo T_Vorlage einkopiert werden soll.

Ich dachte, dass das für jemanden, der VBA kann, eine Kleinigkeit wäre. Für mich ist es mühsam, mir das, was ich brauche, von anderen Beispielen abzuleiten.

Vielleicht wird damit etwas verständlicher, was ich brauche.

Vielen Dank und einen lieben Gruß
Angie

jinx
09.03.2008, 13:33
<font size="2" face="Century Gothic">Moin, Angie,

in jede Tabelle kopieren oder nur in eine bestimmte oder nur in welche, die in einer Liste stehen oder nur in solche, die nicht ausgeschlossen werden (außer der Vorlage)?</font>

Nymphie
09.03.2008, 13:55
Hi jinx,

wenn eine neue Versammlung stattgefunden hat muss ein neues Protokoll erstellt werden. Also geht man in das Blatt der entsprechenden Wohnanlage (z.B. WA123)

Dort soll der Bereich T_Vorlage - der eine Vorlage für das neue Protokoll enthält - unter das letzte Protokoll (im allgemeinen aus dem Vorjahr) kopiert werden.

Wenn dann nächste Woche eine Versammlung für WA234 stattfindet, mache ich nächste Woche das gleiche auf Blat WA234.

Mir ist es halt schon passiert, dass ich nicht aufgepasst habe und dann das neue Protokoll mitten in einem anderen platziert habe (weil das Makro den zu kopierenden Bereich unterhalb der aktuellen Cursor-Position einfügt).

Viele Grüße
Angie

jinx
09.03.2008, 16:34
<font size="2" face="Century Gothic">Moin, Angie,

vielleicht so:

Public Sub Kopieren_mod()
Dim rngCopyTo As Range
Dim strSheet As String
Dim ws As Worksheet
Dim blnValue As Boolean

On Error Resume Next
strSheet = InputBox("Geben Sie bitte den Namen der Wohnanlage an", "Name")
If IsEmpty(strSheet) Then Exit Sub
On Error GoTo 0
For Each ws In Worksheets
If ws.Name = strSheet Then
blnValue = True
Exit For
End If
Next ws
If blnValue Then
Sheets(strSheet).Activate
Set rngCopyTo = Range("A" & Cells(Rows.Count, 1).End(xlUp).Row + 1)
ActiveWindow.SelectedSheets.HPageBreaks.Add Before:=rngCopyTo
Range("T_Vorlage").Copy Destination:=rngCopyTo
Set rngCopyTo = Nothing
Else
MsgBox "Tabellenname leider falsch"
End If
End Sub
Einzig die Eingabe der Tabelle bzw. Wohnanlage wird abgefragt... ;)</font>

Nymphie
10.03.2008, 12:08
Danke jinx,

leider funktioniert das Reinkopieren des Bereiches damit nicht.

ich glaube, ich werde die Idee mit der Box aufgeben müssen.

Die Eingabe der WA ist nicht nötig denn man steht ja bereits im richtigen Blatt.

Ich hatte gehofft, dass es möglich ist, vor dem endgültigen Ausführen des Makros nochmal die Cursorposition zu korrigieren.

Viele Grüße
Angie

Nymphie
10.03.2008, 17:25
Hi jinx,

jetzt habe ich doch nochmal einen Versuch unternommen, nachdem ich herausgefunden habe, dass mir ein Fehler unterlaufen ist, weswegen das Kopieren nicht mehr funktioniert hat.

Ich habe das Makro etwas abgespeckt und nun funktioniert es. Deine Idee, direkt an den Schluss der jeweiligen Tabelle zu springen, gefällt mir recht gut. Allerdings zieht er den Fensterausschnitt nicht nach.

So sieht das also nun aus bei mir:


Public Sub Kopieren()
Dim rngCopyTo As Range
On Error Resume Next
Set rngCopyTo = Range("A" & Cells(Rows.Count, 1).End(xlUp).Row + 1)
ActiveWindow.SelectedSheets.HPageBreaks.Add Before:=rngCopyTo
Range("T_Vorlage").Copy Destination:=rngCopyTo
Set rngCopyTo = Nothing
MsgBox "Neues Protokoll eingefügt"
End Sub


Derzeit bin ich noch am Rätseln, warum das Marko in einem Blatt funktioniert und im nächsten nicht...


Viele Grüße
Angie

jinx
10.03.2008, 19:15
<font size="2" face="Century Gothic">Moin, Angie,

wenn Du einen Bildlauf meinst, nach dem die Zelle zum Einfügen als linke obere Zelle sichtbar ist, kannst Du dies mit Application.GoTo Reference:=rngCopyTo, Scroll:=True umsetzen...</font>

Nymphie
10.03.2008, 22:18
Hi jinx,

bingo! Es funktioniert. Das ist klasse!

Ich bin total begeistert. Das war jetzt noch das Tüpfelchen auf dem i.

Herzlichen Dank & gut's Nächtle

Angie

Nymphie
13.03.2008, 17:13
Hallo jinx,

vielleicht interessiert Dich, was daraus geworden ist?
So sieht mein Makro inzwischen aus:

Public Sub Kopieren() 'von jinx - neues Protokoll wird an's Ende gehängt - modifiziert
Dim rngCopyTo As Range 'Variablendefinition
Dim Abfrage% 'Variablendefinition
On Error Resume Next
' Hier wird die letzte Zelle der Tabelle gesucht
Set rngCopyTo = Range("A" & Cells(Rows.Count, 1).End(xlUp).Row + 1)
Application.GoTo Reference:=rngCopyTo, Scroll:=True 'die Einfügeposition wird angezeigt
Abfrage = MsgBox("Cursor steht in " & ActiveCell.Address & Chr(13) & "Status sollte 'offen' sein! " & Chr(13) & "? - Fortsetzen - ? ", 33, "Einfügeposition prüfen") '33 ist ok
If Abfrage = 2 Then Exit Sub '2 bedeutet wohl "Abbrechen"
If Abfrage = 7 Then '7 ist noch unklar (weiter oder nein)
End If
rngCopyTo = ThisWorkbook.Sheets("T_Vorlage").Range("A1").Value
ActiveWindow.SelectedSheets.HPageBreaks.Add Before:=rngCopyTo
Range("T_Vorlage").Copy Destination:=rngCopyTo
Set rngCopyTo = Nothing
MsgBox "Neues Protokoll eingefügt" 'Auf Msg kann später mal verzichtet werden.
End Sub


Viele Grüße
Angie

jinx
13.03.2008, 17:26
<font size="2" face="Century Gothic">Moin, Angie,

MsgBox-Rückgabewerte

Konstante Wert Beschreibung
vbOK 1 Schaltfläche OK gedrückt
vbCancel 2 Schaltfläche Abbrechen gedrückt
vbAbort 3 Schaltfläche Abbruch gedrückt
vbRetry 4 Schaltfläche Wiederholen gedrückt
vbIgnore 5 Schaltfläche Ignorieren gedrückt
vbYes 6 Schaltfläche Ja gedrückt
vbNo 7 Schaltfläche Nein gedrückt</font>