Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1308to1312
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
VBA-Code Tabelle kopieren, ...
17.04.2013 09:11:00
Martin
Hallo VBA-Profis,
ich möchte ein Makro mit folgenden Bedingungen erstellen:

'BESCHREIBUNG:
'1. Prüfung, ob Werte in Spieler!D2:D15 stehen.
'    a. wenn ja: GoTo 2.
'    b. wenn nein: MessageBox: "Keine Spieler ausgewählt!"; Zelle Spieler!D2 markieren; GoTo  _
Ende
'2. Prüfung, ob Tabellenblatt mit Name aus Spieler!G2 schon vorhanden ist.
'    a. wenn ja: Frage, ob Tabellenblatt überschrieben oder Makro abgebrochen werden soll.
'        a. wenn überschrieben: Tabellenblatt mit Name aus Spieler!G2 löschen; GoTo 3.
'        b. wenn Makro abbrechen: Tabellenblatt mit Name aus Spieler!G2 markieren; GoTo Ende.
'    b. wenn nein: GoTo 3.
'ok3. (Ausgeblendetes) Tabellenblatt Dummy! kopieren, Kopie ans Ende stellen.
'4. Spalten löschen; Berechnung Range: Spieler!F1; Bereich: C:SPALTE(3+(10-Spieler!F1))
'5. Namen Spieler aus Tabellenblatt Spieler! (Range = Wert aus F1) in neues Tabellenblatt einfü _
gen (Einfügen= Werte, Transponieren)
'ok6. Namen der Spieler aus Tabellenblatt Spieler! löschen
'ok7. Neu erstelltes Tabellenblatt Zelle B3 markieren
'ok8. Tabellenblattname durch Wert in Spieler!G2 ersetzen.

Nachdem ich ein wenig im Internet geforscht habe konnte ich die Punkte, die mit 'OK' _ gekennzeichnet sind, bereits lösen. Könnt Ihr mir bei den restlichen Punkten helfen? Folgenden Code habe ich bislang "erbastelt":

Sub Blattneu()
' Blattneu Makro
' Neues Tabellenblatt für neuen Spieltag
' Tastenkombination: Strg+b
'3. (Ausgeblendetes) Tabellenblatt Dummy! kopieren, Kopie ans Ende stellen.
With Worksheets("Dummy")
.Visible = xlSheetVisible
.Copy After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
.Visible = xlSheetVeryHidden
End With
'4. Spalten löschen; Berechnung Range: Spieler!F1; Bereich: C:SPALTE(3+(10-Spieler!F1))
' Folgender Code wurde im Internet gefunden zur Löschung leerer Spalten
'    leere_Spalten_löschen()
'    Dim lng As Long
'    With ActiveSheet
'        For lng = .UsedRange.SpecialCells(xlCellTypeLastCell).Column To 1 Step -1
'            If .Columns(lng).Find("*", , xlFormulas, , xlByColumns, xlPrevious) Is Nothing   _
Then .Columns(lng).Delete
'        Next lng
'    End With
'5. Namen Spieler aus Tabellenblatt Spieler! (Range = Wert aus F1) in neues Tabellenblatt einfü _
gen (Einfügen= Werte, Transponieren)
Sheets("Dummy").Range("D2:?").Copy
' ? wird die Range sein. Zum Beispiel steht dort "5", wodurch der Bereich D2:D6 kopiert werden  _
soll
Sheets("Dummy(2)").Range("B1").PasteSpecial Transpose:=True
'6. Namen der Spieler aus Tabellenblatt Spieler! löschen
Worksheets("Dummy").Range("D2:D15").ClearContents
'7. Neu erstelltes Tabellenblatt Zelle B3 markieren
Sheets("Dummy(2)").Range("B3").Select
'8. Tabellenblattname durch Wert in Spieler!G2 ersetzen.
ActiveSheet.Name = Worksheets("Spieler").Range("G2")
End Sub

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA-Code Tabelle kopieren, ...
17.04.2013 11:01:25
Klaus
Hallo Martin,
Ohne Beispieltabelle ist Pseudocode-zu-Code natürlich sehr müßig, da man nix testen kann! Soweit komme ich ohne Musterblatt:
Sub MarkoEins()
'BESCHREIBUNG:
'x1. Prüfung, ob Werte in Spieler!D2:D15 stehen.
'x    a. wenn ja: GoTo 2.
'x    b. wenn nein: MessageBox: "Keine Spieler ausgewählt!"; Zelle Spieler!D2 markieren; GoTo _
Ende
'x2. Prüfung, ob Tabellenblatt mit Name aus Spieler!G2 schon vorhanden ist.
'x    a. wenn ja: Frage, ob Tabellenblatt überschrieben oder Makro abgebrochen werden soll.
'x        a. wenn überschrieben: Tabellenblatt mit Name aus Spieler!G2 löschen; GoTo 3.
'x        b. wenn Makro abbrechen: Tabellenblatt mit Name aus Spieler!G2 markieren; GoTo Ende.
'x    b. wenn nein: GoTo 3.
'xok3. (Ausgeblendetes) Tabellenblatt Dummy! kopieren, Kopie ans Ende stellen.
'4. Spalten löschen; Berechnung Range: Spieler!F1; Bereich: C:SPALTE(3+(10-Spieler!F1))
'5. Namen Spieler aus Tabellenblatt Spieler! (Range = Wert aus F1) in neues Tabellenblatt einfü  _
_
gen (Einfügen= Werte, Transponieren)
'ok6. Namen der Spieler aus Tabellenblatt Spieler! löschen
'ok7. Neu erstelltes Tabellenblatt Zelle B3 markieren
'xok8. Tabellenblattname durch Wert in Spieler!G2 ersetzen.
'1. Prüfung, ob Werte in Spieler!D2:D15 stehen.
Dim r As Range
Dim bSpieler As Boolean
bSpieler = False
For Each r In Sheets("Spieler").Range("D2:D15")
If r.Value = "" Then
Else
bSpieler = True
End If
Next r
'    a. wenn ja: GoTo 2.
If bSpieler Then
Call SpielerTabelleKopieren
Else
'    b. wenn nein: MessageBox: "Keine Spieler ausgewählt!"; Zelle Spieler!D2 markieren; GoTo  _
Ende
MsgBox ("Keine Spieler ausgewählt!")
Sheets("Spieler").Activate
Range("D2").Select
End If
End Sub
Sub SpielerTabelleKopieren()
Dim rSpieler As Range
'hier kannst du einfach ändern, wenn du einen anderen Spieler als den aus G2 haben willst.
Set rSpieler = Sheets("Spieler").Range("G2")
'2. Prüfung, ob Tabellenblatt mit Name aus Spieler!G2 schon vorhanden ist.
If WksExists(rSpieler.Value) Then
'    a. wenn ja: Frage, ob Tabellenblatt überschrieben oder Makro abgebrochen werden soll.
If MsgBox("Überschreiben oder abbrechen?", vbYesNo) = 6 Then
'        a. wenn überschrieben: Tabellenblatt mit Name aus Spieler!G2 löschen; GoTo 3.
Application.DisplayAlerts = False
Sheets(rSpieler.Value).Delete
Application.DisplayAlerts = True
Else
'        b. wenn Makro abbrechen: Tabellenblatt mit Name aus Spieler!G2 markieren; GoTo Ende.
Sheets(rSpieler.Value).Activate
End Sub
End If
Else
'    b. wenn nein: GoTo 3.
End If
'ok3. (Ausgeblendetes) Tabellenblatt Dummy! kopieren, Kopie ans Ende stellen.
With Sheets("Dummy")
.Visible = xlSheetVisible
.Copy After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
.Visible = xlSheetVeryHidden
End With
'ok8. Tabellenblattname durch Wert in Spieler!G2 ersetzen.
ActiveSheet.Name = rSpieler.Value
'4. Spalten löschen; Berechnung Range: Spieler!F1; Bereich: C:SPALTE(3+(10-Spieler!F1))
'5. Namen Spieler aus Tabellenblatt Spieler! (Range = Wert aus F1) in neues Tabellenblatt einfü _
gen (Einfügen= Werte, Transponieren)
'Die Berechnung kapier ich nicht. dazu bitte eine Beispieldatei!
'ok6. Namen der Spieler aus Tabellenblatt Spieler! löschen
rSpieler.ClearContents
'ok7. Neu erstelltes Tabellenblatt Zelle B3 markieren
ActiveSheet.Range("B3").Select
End Sub
Private Function WksExists(sSheet As String) As Boolean
'FUNKTION prüft, ob es ein Sheet bereits gibt
Dim wks As Object
On Error Resume Next
Set wks = Sheets(sSheet)
If Not wks Is Nothing Then
WksExists = True
End If
On Error GoTo 0
End Function

Anzeige
AW: VBA-Code Tabelle kopieren, ...
17.04.2013 11:29:27
Martin
Hallo Klaus,
danke dür den Code. Ich hatte gehofft, dass meine Erklärungen auch ohne Beispieldatei keine fragen offen lassen.
Hier die Beispieldatei (Deinen Code habe ich noch nicht eingebaut):

Die Datei https://www.herber.de/bbs/user/84912.xlsm wurde aus Datenschutzgründen gelöscht


Wenn ich Dich richtig verstehe ist Dir Punkt 4 und 5 unklar: Zur Erläuterung: In meiner Beispieldatei siehst Du in Spieler!D2:D15 ein hervorgehobenes Feld, in das man bis zu 14 Namen eintragen kann. Diese Namen sollen transponiert in Zeile 1 (ab Spalte B) des neuen Tabellenblattes übertragen werden. Da im Dummy-Blatt fix 10 Felder vorhanden sind sollen vorher die überflüssigen Spalten gelöscht werden.
Im Beispiel sind 5 Namen eingegeben. Daher sollen 5 überflüssige Spalten aus der Mitte heraus gelöscht werden und anschließend die 5 Namen in Zeile 1 eingefügt werden

Anzeige
AW: VBA-Code Tabelle kopieren, ...
17.04.2013 12:55:25
Klaus
Hi,
hier meine Lösung:
https://www.herber.de/bbs/user/84917.xlsm
Ein paar Sachen habe ich etwas anders gemacht als du es im Pseudocode ausgedrückt hast.
Auf "GoTo" habe ich verzichtet und stattdessen Wächter-Variablen eingesetzt. GoTo macht immer so einen Spagetticode.
Deine Dummy-Tabelle habe ich auf zwei (Spieler)-Spalten reduziert und füge nach der Kopie Spalten ein, so viele ich brauche.
Deinen Ansatz, 10 Spalten für 4-15 Spieler vorrätig zu halten und dann anzupassen, fand ich unbrauchbar.
Die Formeln in der Dummy-Tabelle schreibe ich per VBA direkt in die Kopie. Ausnahme: Deine Monsterformel, wer grad Geber ist. Die passt sich aber beim Spalten-Einfügen von selbst an (bitte ausführlich testen!).
Im Code ist sehr viel auf absolute Zellen referenziert, du darfst in deiner Tabelle keine Spalten oder Zeilen einfügen oder löschen :-)
In dem Sinne: Viel Spaß beim Karten kloppen!
Grüße,
Klaus M.vdT.

S1: Karo-10, anfrage
S2: Kreuz-D, geklärt!
S3: Dulle, überstochen
S4: Fuchs, geeeeesichert!
Doko ist SOO viel geiler als Skat!

Anzeige
AW: VBA-Code Tabelle kopieren, ...
17.04.2013 13:45:29
Martin
Hi Klaus,
danke schon mal. Ich werde die Tabelle die nächsten Tage ausführlich testen (bin ja von berufs wegen Software Tester ;-) ).
Zum Spalten löschen bzw. hinzufügen: Für mich als VBA-Laie war es zunächst dasselbe, bestehende Spalten zu löschen oder Spalten neu hinzufügen. Programmtechnisch mag es einen Unterschied geben... :-)
Eine Frage noch zu den Bezügen: Kann ich die harten Bezüge durch Variablen ersetzen, also z.B.
  • Sheets("Spieler")

  • in
  • Sheets.Tabelle2

  • Und so weiter. Geht das so?
    Danke & Grüße
    Martin
    Bzgl. Deiner Fußnote habe ich auch eine nette Anekdote: Der Abend, an dem meine Freundin und ich DoKo beigebracht bekamen von zwei sehr versierten Spielern:
    S1: Karo As, Anfrage von mir als Unerfahrenen (Re-Partei)
    S2: Herz Dulle, Antwort meiner Freundin, die unbedingt rauskommen wollte (Kontra-Partei)
    S3: Herz-Dulle, Übernahme des erfahrenen Re-Partners
    S4: Karo As, Annahme der Sicherung des Fuchses, da S4 davon ausging, S3 wäre Kontra

    Resultat: 3 Sonderpunkte in einem Stich :-D

    Anzeige
    AW: VBA-Code Tabelle kopieren, ...
    17.04.2013 14:00:46
    Klaus
    Hallo Martin,
    Sheets("Spieler")
    in
    Sheets.Tabelle2
    Und so weiter. Geht das so?

    klar geht das, dann muss es aber immer "Tabelle2" sein. Und wenn sich die ändert?
    Ob du nun überall im Code "sheets("Spieler")." oder "Tabelle2." anpasst, tut sich doch nichts.
    Doch, der Code wird immun dagegen, dass jemand das Tabellenblatt umbenennt! Mach es, hat nur Vorteile.
    Wenn du es flexibel halten möchtes, mach es gleich richtig:
    irgenwo weit Oben:
    dim wksSpieler as worksheet
    set wksSpieler = Tabelle2
    

    Und dann im Code jeweils statt
    Sheets("Spieler").Value
    tauschen gegen
    wksSpieler.Value
    wenn sich das Tabellenblatt mal ändern sollte, musst du die dazugehörige Variable nur einmalig im Code anpassen.
    Dann sei aber gleich so konsequent, und erstetze auch sheets("Dummy") gegen eine variable. Wenn, dann richtig!
    Offtopic:
    S3: Herz-Dulle, Übernahme des erfahrenen Re-Partners
    "Zweite Dulle hoch" spielen wir auch. Ich werd nie verstehen, warum die DDV-Turnierregeln das nicht vorsehen.
    Eine Anekdote hab ich dann auch noch:
    S1: Ich komm dann raus
    S2: Warte, Vorbehalt! Ich spiele die Hochzeit [*geht bei uns mit dem ersten Stich mit]
    S1: Sehr gut! Dann komm ich mit dem Fuchs raus, ist ja egal wer ihn bekommt!
    S3, S4 gleichzeitig: Ja, DU dann nicht mehr!
    Grüße,
    Klaus M.vdT.

    Anzeige
    Nachtrag: Die komplizierte Formel...
    17.04.2013 14:04:47
    Martin
    berechnet den Geber der Runde. Die Formel ist so kompliziert, weil es einen Unterschied macht, ob es ein Solo gab oder wie viele Mitspieler vorhanden sind (ab 5 Mitspieler haben wir einmal beschlossen, dass trotz Solo der nächste gibt, damit jeder dran kommt). Dann kommt es vor, dass der ein oder andere Mitspieler später kommt. Daher wird zunächst ohne ihn (also evtl. nur zu viert) gespielt.
    Und die ganze Folge ("der Nächste bitte") muss nach Ankommen des letzten Spielers in der Runde wieder von vorne losgehen...

    warum offen?
    17.04.2013 14:15:40
    Klaus
    Hallo Martin,
    sowas dachte ich mir schon, ich hab aber nicht den Nerv gehabt die Formel komplett auseinander zu nehmen. Ich muss ja auch nichts reparieren, was bereits funktioniert :-)
    Warum hast du den Beitrag auf "offen" gestellt?
    Grüße,
    Klaus M.vdT.

    Anzeige
    AW: warum offen?
    18.04.2013 08:18:10
    Martin
    Meine gestern geschriebene Antwort hierzu kann ich heute nicht mehr sehen, daher: Ich hatte den Beitrag weiter auf "offen" gestellt, um mit meiner Erklärung den Status der Frage nicht zu wechseln. Während ich den Beitrag schrieb hast Du jedoch meine Frage beantwortet, was ich nicht gesehen habe.

    Danke für die RÜ!
    18.04.2013 09:05:19
    Klaus
    Ah, verstehe :-)
    Dann bleibt nur noch zu sagen: Danke für die Rückmeldung!

    311 Forumthreads zu ähnlichen Themen

    Anzeige
    Anzeige
    Anzeige

    Links zu Excel-Dialogen

    Beliebteste Forumthreads (12 Monate)

    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Anzeige