Supportnet Computer
Planet of Tech

Supportnet / Forum / Tabellenkalkulation

Makro-- Zellenauslesen, die Position verändern





Frage

Hallo zusammen . Vorweg mal: Ich hab nicht wirklich Ahnung von Makros und verwende sie erst seit kurzem. . Nun mein Problem: Ich habe eine Excelblatt, in dem Messdatenstehen. (Spalte C --- Zeilen 15 bis 22) Das zweite Excelblatt ist eine Formvorlage wie das Auswerteblatt aussehen soll. . Nun zum Makro: Mittels Makro soll nun die Formvorlage kopiert und als 3tes Blatt eingefügt werden. Dann sollen die Messwerte aus oben genanntem Bereich in das 3te Blatt eingefügt werden. (in D21 bis D29) Das ist alles kein Problem bisher, aber nun kommt der Schwierigkeitsgrad für mich: . Bei manchen Messdaten, die in Blatt 1 kopiert werden, sind in den oberen Zeilen mehr Hinweise oder Zusatzwerte; Dadurch werden meine Messergebnisse, die ich mit Makro auslese natürlich nach unten verschoben.Folglich stehen dann im generiertem 3ten Blatt Werte die dort nicht hingehören. . Gibt es eine Möglichkeit, wie ich diesem Problem Herr werde? Ich könnte die auszulesenden Messergebnisse auch farblich darstellen, falls sie mit einer Makrofunktion dann gesucht werden können. (zB Makro sucht nach blauen Werten) THX für eure Hilfe Liebe Grüße Marius . Hier noch mein bisheriger Makro source code [code] Sub CopyTest() ' ' CopyTest Macro ' Macro recorded 19/11/2004 by MAN SchobesbergerP ' ' Keyboard Shortcut: Ctrl+t ' Sheets("Sheet1").Select Sheets("Sheet1").Copy After:=Sheets(5) Range("D21").Select ActiveCell.FormulaR1C1 = "='Template '!R[-6]C[-1]" Range("D21").Select Selection.AutoFill Destination:=Range("D21:D29"), Type:=xlFillDefault Range("D21:D29").Select End Sub [/code]

Antwort 1 von schnallgonz

Salve Whiteberg

wenn ich Dein Problem richtig verstanden habe, müßte es reichen, wenn Du den auszulesenden Zellen einen Namen gibst und diese als eindeutigen Bezug im Makrocode verwendest.
In meinem Beispiel gehst Du also in die Tabelle, in der sich die Messwerte befinden und setzt den Cursor auf den ersten Messwert (die weiteren Messwerte befinden sich darunter!?). Dann startest Du folgendes Makro:


Sub Kopinski()
'Beispieldatei mit 3 Blättern, hinter Blatt 3 wird neues Blatt eingefügt
'zum Start in Tabelle3 erste auszulesende Zelle markieren!
Dim i As Integer
Dim j As Integer
Sheets("Tabelle3").Activate
    'Namen wex1 bis wex9 für 9 Zellen vergeben ab markierter Zelle
    For i = 1 To 9
        ActiveWorkbook.Names.Add Name:="wex" & i, RefersTo:=Selection
        ActiveCell.Offset(1, 0).Activate
    Next i
'Blatt1 hinter Blatt3 kopieren
Sheets("Tabelle1").Select
Sheets("Tabelle1").Copy After:=Sheets(3)
'mit Namen belegte Zellen holen, in D21 anfangen
    Range("D21").Select
    For j = 1 To 9
        ActiveCell.FormulaR1C1 = "=Tabelle3!wex" & j
        ActiveCell.Offset(rowOffset:=1, columnOffset:=0).Activate
    Next j
Range("D21:D29").Select
End Sub


OK oder habe ich was nicht verstanden?
mfg
schnallgonz

Antwort 2 von Whiteberg

Hallo schnallgonz
.
Da ich mich mit Makros nicht so gut auskenne, muss ich erst mal dein Makro verstehen *g*
Dann werde ich es ins englische übersetzen, damit es mein PC hier in Manchester auch versteht.
.
Ich hoffe ich schaffe im Laufe des Tages noch eine Rückmeldung, ob es funzt oder nicht.
.
Jedenfalls schon mal herzlichen Dank für deine Antwort.
.
liebe Grüße
Marius

Antwort 3 von schnallgonz

Moin Marius,

also für mich sieht das Makro schon ziemlich englisch aus. Leider habe ich vergessen, den Code genau an Deine Vorgabe anzupassen.

Und da ist ein Widerspruch zwischen Deiner Beschreibung und Deinem Code.

Ich habe mir Deine Frage nochmal durchgelesen.
Da soll das Blatt 2 als Formatvorlage als Blatt 3 kopiert werden, in Deinem Code steht: kopiere Sheet1 hinter Sheet5.
"Sheet1" kann natürlich der Name für ein Blatt sein, dass an 2. Stelle steht. Du mußt also nur darauf achten, den richtigen Blattnamen anzugeben.

Ich habe den Code so angepaßt, dass "Sheet2" (=Name des Blattes, nicht die Position!) als Formatvorlage immer an das Ende der Mappe kopiert und als "Kopinskiergebnis" benannt wird.
"Sheet1" soll der Name des Blattes sein, aus dem die Messdaten ausgelesen werden sollen.
Vor Makroaufruf einfach den Mauszeiger in die erste auszulesende Messzelle stellen, dafür habe ich noch eine Sicherheitsabfrage eingebaut.


Sub Kopinski2()
'Annahme1: "Sheet1"=Blatt mit Messwerten, 9 untereinander liegende Werte werden ausgelesen
'Annahme2: "Sheet2"=Formatvorlage
'zum Start in "Sheet1" erste auszulesende Zelle markieren!
Dim k As Integer
Dim i As Integer
Dim c As Integer
Dim j As Integer
k = MsgBox("Steht der Cursor auf dem ersten auszulesenden Meßwert?", 1 + vbQuestion, "Markierenabfrage")
If k = 2 Then Exit Sub
'Namen wex1 bis wex9 für 9 Zellen vergeben ab markierter Zelle = Zellen mit den 9 Messwerten Namen geben
    For i = 1 To 9
        ActiveWorkbook.Names.Add Name:="wex" & i, RefersTo:=Selection
        ActiveCell.Offset(1, 0).Activate
    Next i
'Blätter zählen
c = Sheets.Count
'Sheet2 hinter das letzte Blatt kopieren
Sheets("Sheet2").Copy After:=Sheets(c)
'kopiertes Blatt in KopinskiErgebnis umbenennen, Anweisung nicht zwingend
ActiveSheet.Name = "KopinskiErgebnis"
'in kopinskiErgebnis "D21" als erste Zielzelle wählen und Messwerte holen
    Range("D21").Select
    For j = 1 To 9
        ActiveCell.FormulaR1C1 = "=Sheet1!wex" & j
        ActiveCell.Offset(rowOffset:=1, columnOffset:=0).Activate
    Next j
'Bereich mit eingefügten Formeln auswählen, kann man auch weglassen
Range("D21:D29").Select
End Sub


So, ich hoffe, jetzt ist es verständlicher.

Mfg
schnallgonz

Antwort 4 von Whiteberg

THX für deine überarbeitung. Hab es mir nun genauer angesehen und verstehe es sogar einigermassen. (Endlich weiß ich wozu das Semester C++ gut war *g*)
.
Dein Programm funktioniert ganz gut, allerding hat es einen kleinen Hacken:
.
Man muss mittels makieren immer den Bereich ab dem die Daten entnommen werden vorgeben.
.
Gibt es eine Möglichkeit, dass die Makros diesen Bereich selbst erkennen? Denn wenn der Nutzer nur zB Ctrk "t" eingeben muss, wird die Fehleranfälligkeit geringer, als wenn er auch noch einen Bereich anwählen muss.
.
Kann man das lösen, in dem man den Wert der Zelle, die jetzt in deinem Makro makiert wird, zB in blauer Schrift darstellt und dann ein Makro nach der Schriftfarbe suchen lässt?
(Ist nur eine Frage, ich habe keine Ahnung, wie bzw ob man das umsetzen kann)
.
THX für deine Hilfe.
lg
Marius

Antwort 5 von schnallgonz

Klar kann man das.
Ich verstehe aber nicht, wo der Unterschied ist.
Du hast geschrieben, dass sich der Bereich mit den Messwerten lfd. verschiebt.
Also muss der User diesen Bereich irgendwie kennzeichnen.
Ob das mit einer Namenszuweisung passiert oder einer Farbe, es muss insoweit immer der User tätig werden.

In meinem letzten Vorschlag ist das so gedacht, dass der Mauszeiger im ersten Messwert steht und dann das Makro startet.
An diese "Markierung" erinnert eine MsgBox.
Dein Wunsch wäre, Mauszeiger auf ersten Messwert, dann einfärben und dann Makro starten?
Ist ein Klick mehr und dasselbe Risiko, oder?
Mauszeiger auf falscher Zelle = falsche Werte
falsche Zelle gefärbt = falsche Werte

Vielleicht reden wir auch aneinander vorbei und ich habe die Ausgangssituation immer noch nicht verstanden.
Gibt es für die Position des ersten Messwerts irgendeine Bezugsgröße?

MfG
schnallgonz

Antwort 6 von Whiteberg

Nein du bist schon auf einer Linie mit mir:
Und ich bin nach nochmaligem Nachdenken zu der Meinung gekommen, dass du mein Problem besser kennst als ich, sonst wäre es mir selbst aufgefallen, dass ich die Zelle sowieso jedes Mal neu einfärben muss. *g*
.
Wie stellst du dir das mit einer Msg-Box vor?
Wo würdest du die einbauen? Die müßte ja vor ausführung des Makros kommen!
Oder kann man die mitten im Makros einbauen, das man zum Makieren aufgefordert wird und dann erst der Programmablauf weiter geht?
.
Das wird ja schon fast ein eigenes Betriebssystem *sfg*
.
lg und danke für dein Mitdenken
Marius

Antwort 7 von schnallgonz

Ich bin's nochmal.

wie wär's mit benennen u n d einfärben?
Dann muß die erste Schleife so aussehen:


    'Namen wex1 bis wex9 für 9 Zellen vergeben ab markierter Zelle, zugleich grün färben
    For i = 1 To 9
        ActiveWorkbook.Names.Add Name:="wex" & i, RefersTo:=Selection
        With Selection.Interior
            .ColorIndex = 4
            .Pattern = xlSolid
        End With
        ActiveCell.Offset(1, 0).Activate
    Next i


Mfg
schnallgonz

Antwort 8 von schnallgonz

Oh, gar nicht gesehen, dass Du noch da bist.
MsgBox ist schon im Listing drin, allerdings nicht in Englisch.


k = MsgBox("Steht der Cursor auf dem ersten auszulesenden Meßwert?", 1 + vbQuestion, "Markierenabfrage")
If k = 2 Then Exit Sub


Ist mit "OK" und "Abbrechen".
"OK" = Makro läuft
"Abbrechen" = Makro wird nicht ausgeführt.

Ende gut, alles gut?

mfg
schnallgonz

Antwort 9 von Whiteberg

Hallo schnallgonz
.
Danke schon mal für deine wunderbaren VBA Lösungen! Das ist echt viel mehr, als ich mir eigentlich erwartet hatte, als ich diese Anfrage ins Forum gestellt habe. *both thumbs up*
.
Ich habe aber immer einen Fehler beim Ablauf des Programmes und ich sehe aber keinen Fehler, an der Stelle an die mich der Debbuger verweist.
.
Sub Kopinski2()
'Annahme1: "Sheet1"=Blatt mit Messwerten, 9 untereinander liegende Werte werden ausgelesen
'Annahme2: "Sheet2"=Formatvorlage
'zum Start in "Sheet1" erste auszulesende Zelle markieren!
Dim k As Integer
Dim i As Integer
Dim c As Integer
Dim j As Integer
k = MsgBox("Steht der Cursor auf dem ersten auszulesenden Meßwert?", 1 + vbQuestion, "Markierenabfrage")
If k = 2 Then Exit Sub
  'Namen wex1 bis wex9 für 9 Zellen vergeben ab markierter Zelle, zugleich grün färben
    For i = 1 To 9
        ActiveWorkbook.Names.Add Name:="wex" & i, RefersTo:=Selection
        With Selection.Interior
            .ColorIndex = 4
            .Pattern = xlSolid
        End With
        ActiveCell.Offset(1, 0).Activate
    Next i

'Blätter zählen
c = Sheets.Count
'Sheet2 hinter das letzte Blatt kopieren
Sheets("Sheet2").Copy After:=Sheets(c)
'kopiertes Blatt in KopinskiErgebnis umbenennen, Anweisung nicht zwingend
ActiveSheet.Name = "KopinskiErgebnis"
'in kopinskiErgebnis "D21" als erste Zielzelle wählen und Messwerte holen
    Range("D21").Select
    For j = 1 To 9
        ActiveCell.FormulaR1C1 = "=Sheet1!wex" & j
        ActiveCell.Offset(rowOffset:=1, columnOffset:=0).Activate
    Next j
'Bereich mit eingefügten Formeln auswählen, kann man auch weglassen
Range("D21:D29").Select
End Sub



Der Fehler tritt immer auf bei :
Sheets("Sheet2").Copy After:=Sheets(c)
Meiner Meinung nach ist dass aber korrekt.
Kannst du hier einen Fehler erkennen, oder weißt du einen Grund für diese Fehlermeldung?
.
Ein tief in deier Schuld stehender
Marius

Antwort 10 von schnallgonz

Moin Marius,

gibt's das "Sheet2" in Deiner Tabelle vielleicht nicht?
In Deinem ersten Posting hast Du nämlich
"Sheet1" kopiert,
also wäre "Sheet1" Deine Formatvorlage und nicht "Sheet2" wie in meinem Beispiel (siehe Zeile3 im blauen Kasten).

"Sheet1" "Sheet2" usw. sind nur Namen, keine Reihenfolge der Blätter. Genausogut könnten die "gonzo1" und "gonzo2" heissen und an 8.Stelle und 6. Stelle liegen.
Man kann auch auf eine bestimmte Reihenfolge der Blätter setzen, müßte man den Code aber ändern.
Am Sichersten wäre es vielleicht, wenn Du Deinem Formatvorlageblatt einen entsprechenden Namen geben würdest, meinetwegen "Vorlage" und den im Code eingibst, also

Sheets("Vorlage").Copy After:=Sheets(c)

Ich hoffe, danach klappt's, sonst bitte nochmal melden.

MfG
schnallgonz

Antwort 11 von Whiteberg

Genau das war das Problem;
Namen sind halt nicht nur aus Spass angelegt. *g*
.
Jetzt hab ich nur noch eine Frage und dann ist das Programm perfekt.
Ich möchte dem neu erstelltem Blatt einen Namen geben, der in einer Zelle vom sheet1 steht.
.
ALso zB:
Sheet1--> Wert in Zelle20 , SpalteD das soll der Name für den neu erstellten Sheet werden.
.
Wie muss ich dann diesen Befahl abändern?
ActiveSheet.Name = "KopinskiErgebnis"

.
Das wars dann aber wirklich und ich kann dir gar nicht sagen, wie dankbar ich dir für deine kompetente Hilfe bin.
Durch dich habe ich Lust auf Mehr bekommen und ich werde mich nun in Zukunft doch ausführlicher mit der Makroprogrammierung beschäftigen.
Kennst du gute Bücher, mit denen du dir Teile deines Wissens angeeignet hast?
.
liebe Grüße
Marius

Antwort 12 von schnallgonz

Also,
mein erster Vorschlag dazu:
zuerst die Tabelle aktivieren, den Zelleninhalt auslesen und in eine Variable speichern,
sieht so aus:
Dim n As String
Sheets("Sheet1").Activate
n = Range("D20").Value

(diesen Teil unter das letzte "Dim" im Listing kopieren, dann ersetzt Du

ActiveSheet.Name = "KopinskiErgebnis"

mit
ActiveSheet.Name = n

Wenn der zukünftige Name sich aber immer aus der Zelle über den 9 Messwerten ergibt, würde ich das anders machen:
In der Tabelle mit den Messwerten 10 Zellen benennen, also erst den zukünftigen Namen und dann die 9 Messwerte. Dabei dann den Mauszeiger nicht auf den ersten Messwert, sondern die Zelle darüber setzen. Dann sollte die Formulierung in der MsgBox geändert werden.
Fertig sieht diese Variante so aus:

Sub Kopinski3()
'Annahme1: "Sheet1"=Blatt mit Messwerten, 9 untereinander liegende Werte werden ausgelesen
'Annahme2: "Sheet2"=Formatvorlage
'zum Start in "Sheet1" erste auszulesende Zelle markieren!
Dim i As Integer
Dim j As Integer
Dim c As Integer
Dim k As Integer
Dim n As String
k = MsgBox("Haben Sie die erste Zelle über den 9 Messwerten markiert?", _
1 + vbQuestion, "Markierenabfrage")
If k = 2 Then Exit Sub
    'Namen wex1 bis wex10 für 10 Zellen vergeben ab markierter Zelle
    For i = 1 To 10
        ActiveWorkbook.Names.Add Name:="wex" & i, RefersTo:=Selection
        ActiveCell.Offset(1, 0).Activate
    Next i
'zukünftigen TabNamen in "n" einlesen
n = Range("wex1").Value
'Blätter zählen
c = Sheets.Count
'Blatt "Vorlage" hinter das letzte Blatt kopieren
Sheets("Vorlage").Copy After:=Sheets(c)
'kopiertes Blatt in Namen aus "n" umbenennen
ActiveSheet.Name = n
'D 21 als erste Zielzelle wählen und mit Namen belegte Bereiche holen
    Range("D21").Select
    For j = 2 To 10
        ActiveCell.FormulaR1C1 = "=Tabelle3!wex" & j
        ActiveCell.Offset(rowOffset:=1, columnOffset:=0).Activate
    Next j
'Bereich mit eingefügten Formeln auswählen, kann man auch weglassen
Range("D21:D29").Select
End Sub


Fertig.

Lust auf mehr VBA ist schön, eine super Hilfe ist natürlich Supportnet und die Seite
http://www.excelbeispiele.de
von coros.
Weitere zahlreiche Foren zum Thema Excel, m.E. aber keins so übersichtlich wie SN, einfach mal googeln.

Mit Buchtipps weiß ich im Moment nicht, ob ich damit gegen irgendeine Regelung verstoße, aufgrund derer Abzockeranwälte Abmahnungen verschicken oder anderes.
Ist zwar traurig, aber in der heutigen Zeit muss man ja ganz genau aufpassen, was man in's Web setzt. Überleg ich mal mit unserem Hausjuristen, ob das OK ist oder besser per mail.

MfG
schnallgonz

P.S.: Danke für die netten Rückmeldungen

Antwort 13 von Whiteberg

Hallo schnallgonz
.
THX für deine Hilfe und die Lösung meines Problemes.
Du warst mir eine wirklich große Hilfe und ich bin dir sehr dankbar dafür.
Hoffentlich stellst du auch einmal eine Frage, die ich beantworten und mich somit irgendwie revanchieren kann.*g*
.
Wünsche dir noch einen schönen Arbeitstag
liebe Grüße
Marius
.
PS:
THX für deine private Nachricht.

Ich möchte kostenlos eine Frage an die Mitglieder stellen:


Ähnliche Themen:


Suche in allen vorhandenen Beiträgen: