Zellinhalt per VBA kopieren

Hallo zusammen,

im Tabellenblatt „Pflegeplanung“ werden per WennDann unterschiedliche Zellen „gefüllt“, je nachdem, welche ich aus einem anderen Tabellenblatt ausgesucht habe (Listenfeld).
Im Bereich C6:C600 können somit also an unterschiedlichen Orten/Zellen Einträge stehen.

Ich wünschte mir jetzt, dass ich 2 Einträge aussuchen / markieren könnte und ins Tabellenblatt „Kardex“ kopieren könnte (wahrscheinlich wohl nur als Wert-einfügen), den ersten nach C16, den zweiten nach C17.

Mein Problem ist also, dass ich nie weiß, ob in „Pflegeplanung“ C29, C175 oder C599 (könnten auch noch mehr sein) gefüllt ist.
Wichtig ist vielleicht auch, dass ich in „Pflegeplanung“ aussuche / entscheide, welcher Eintrag nach „Kardex“ kopiert werden soll.

Habt hr da eine Idee?

Freundliche Grüße

Jorge

Hallo!

Ich wünschte mir jetzt, dass ich 2 Einträge aussuchen /
markieren könnte und ins Tabellenblatt „Kardex“ kopieren
könnte (wahrscheinlich wohl nur als Wert-einfügen), den ersten
nach C16, den zweiten nach C17.

Dazu verweise ich grundsätzlich auf diesen Artikel:
http://www.wer-weiss-was.de/app/service/board_navi?G…

Mein Problem ist also, dass ich nie weiß, ob in
„Pflegeplanung“ C29, C175 oder C599 (könnten auch noch mehr
sein) gefüllt ist.
Wichtig ist vielleicht auch, dass ich in „Pflegeplanung“
aussuche / entscheide, welcher Eintrag nach „Kardex“ kopiert
werden soll.

Wenn der Zellbereich „löchrig“ ist und Performance keine Rolle spielt, kann ja eine For-Schleife durchlaufen bis zu letzten Zeile, alles aufsammeln und im anderen Tabellenblatt Leerzellen-frei ausgeben.

Vll gibts auch ne Funktion, die den letzten Wert samt Position einer Spalte ermittelt… das würde es vereinfachen, aber weiß leider nichts genaueres.

Gruß, Leebo

Danke für die Antwort, Leebo

aber dieser Link

http://www.wer-weiss-was.de/app/service/board_navi?G…

führt bei mir ins Leere

Wenn der Zellbereich „löchrig“ ist und Performance keine Rolle
spielt, kann ja eine For-Schleife durchlaufen bis zu letzten
Zeile, alles aufsammeln und im anderen Tabellenblatt
Leerzellen-frei ausgeben.

Ich habs grad mit Gültigkeit-Liste ausprobiert, aber Excel listet mir auch alle Leerzeilen auf, so dass man sich die Finger wund scrollt, bis man am richtigen Eintrag angekommen ist. Das ist es irgendwie auch nicht…

Der „range“-Befehl müsste sich irgendwie auf keine bestimmte Zelle beziehen, sondern auf die gerade markierte. Oder die gefüllten Zellen werden anders zusammengefasst, so dass die Gültigkeit-Liste ohne Leerzeilen erscheint.

Aber ich wüsste nicht, wie.

Freundlicher Gruß

Jorge

Guten Morgen!

aber dieser Link

http://www.wer-weiss-was.de/app/service/board_navi?G…

führt bei mir ins Leere

Sorry :smile: Der sollte gehn:

/t/vba-excel-zellen-inhalt-in-ein-neues-sheet-kopier…

Wenn der Zellbereich „löchrig“ ist und Performance keine Rolle
spielt, kann ja eine For-Schleife durchlaufen bis zu letzten
Zeile, alles aufsammeln und im anderen Tabellenblatt
Leerzellen-frei ausgeben.

Ich habs grad mit Gültigkeit-Liste ausprobiert, aber Excel
listet mir auch alle Leerzeilen auf, so dass man sich die
Finger wund scrollt, bis man am richtigen Eintrag angekommen
ist. Das ist es irgendwie auch nicht…

Der „range“-Befehl müsste sich irgendwie auf keine bestimmte
Zelle beziehen, sondern auf die gerade markierte. Oder die
gefüllten Zellen werden anders zusammengefasst, so dass die
Gültigkeit-Liste ohne Leerzeilen erscheint.

Mit Gültigkeitslisten hab ich leider keine Efahrung… Aber ich löse sowas i.d.R. mit While und Cells. Ich habe sowas ähnliches in dem obigen Thread (Link) gepostet; es sind aber auch andere Lösungen zu finden.

Statt bis zur letzten Excel-Zelle zu laufen kannst du vll auch einen „maximalen Leerbereich“ festlegen. Also bspw. behaupten, mehr als 10 Leerzellen gibt es nicht, also ist danach die letzte Wert-Zelle erreicht. Spart sich Excel zumindest bisschen Rechenarbeit; aber kommt eben drauf an, ob sich so ein max. Bereich definieren lässt…

Wenn ja, dann vll so:

Sub test()

maxL = 10
cl = 0
j = 1
i = 1

While cl „“ Then
Worksheets(„Tabelle2“).Cells(j, 1) = a
cl = 0
j = j + 1

End If

a = Worksheets(„Tabelle1“).Cells(i, 1)
If a = „“ Then cl = cl + 1
i = i + 1

Wend

End Sub

Gruß, Leebo

Mein Problem ist also, dass ich nie weiß, ob in
„Pflegeplanung“ C29, C175 oder C599 (könnten auch noch mehr
sein) gefüllt ist.
Wichtig ist vielleicht auch, dass ich in „Pflegeplanung“
aussuche / entscheide, welcher Eintrag nach „Kardex“ kopiert
werden soll.

Hallo Jorge,

erstell dir in Pflegeplanung aus Steuerelementtoolbox ein Listenfeld.
Dann Rechtsklick darauf, Eigenschaften, dort bei MultiSelect: fmMultiSelectMulti auswählen. Eigenschaftsfenster schließen, Entwurfsmodus beenden.

Du hast gesagt, in C6:C600 stehen Formeln. In meinem Code gehe ch davon aus daß dieses Formeln sich auf A beziehen, deshalb wird Spalte A auf Änderungen überwacht.

Ändere bei dir diese Zeile:
Set Target = Intersect(Target, Range(„A:A“))
auf den Bereich ab, wo Werte manuell geändert werden die dann die Egenisse in C beeinflußen.

in Modul Pflegeplanung:

Option Explicit
'
Private Sub Worksheet\_Change(ByVal Target As Range)
Set Target = Intersect(Target, Range("A:A"))
If Target Is Nothing Then Exit Sub
Call Auswahl
End Sub
'
Private Sub ListBox1\_Change()
Dim N As Integer, Anz As Integer, Wert(100) As Variant
For N = 0 To ListBox1.ListCount - 1
 If ListBox1.Selected(N) Then
 Wert(Anz) = ListBox1.List(N)
 Anz = Anz + 1
 End If
Next N
With Worksheets("Kardex")
 .Range("C16:C17").ClearContents
 If Anz \>= 1 Then .Range("C16") = Wert(0)
 If Anz \>= 2 Then .Range("C17") = Wert(1)
End With
End Sub

in Modul1:

Option Explicit
'
Sub Auswahl()
Dim Zei As Long
With Worksheets("Pflegeplanung")
 .ListBox1.Clear
 For Zei = 6 To .Cells(Rows.Count, 3).End(xlUp).Row
 If .Cells(Zei, 3) "" Then .ListBox1.AddItem Cells(Zei, 3)
 Next Zei
End With
End Sub

Gruß
Reinhard

Sorry :smile: Der sollte gehn:

/t/vba-excel-zellen-inhalt-in-ein-neues-sheet-kopier…

Hallo Leebo,

ich nehme an du willst diesen Link zeigen:

/t/vba-excel-zellen-inhalt-in-ein-neues-sheet-kopier…

Gruß
Reinhard

Hallo Reinhard,

danke, den meinte ich.

Gruß, Leebo

danke, den meinte ich.

Hallo Leebo,

das Zauberwort ist „fester Link“, rechts in der Liste der Möglichkeiten, Rechtsklck darauf, Linkadresse kopieren.

Gruß
Reinhard

Hallo Reinhard,

ich hab deinen Vorschlag in einer eigenen Datei geprüft und das funktioniert auch einwandfrei.

Du hast gesagt, in C6:C600 stehen Formeln. In meinem Code gehe
ch davon aus daß dieses Formeln sich auf A beziehen, deshalb
wird Spalte A auf Änderungen überwacht.

Das ist leider viel komplizierter. Die Formeln in „Pflegeplanung“ beziehen sich auf 13 Tabellenblätter und dort die Bereiche B98:B103, Fdito, Jdito, N, R, V, Z, AD, AH immer 98:103.
Wenn nötig, werden die 6 Zellen mit Hilfe von Gültigkeit-Liste gefüllt und in „Pflegeplanung“ eingefügt.

Das Set Target hab ich versucht, wenigstens mal für einen kleinen Bereich zu ändern, bin aber (natürlich) kläglich gescheitert:

Set Target = Intersect(Target, Sheets(„1 Gesundheitsförderung“).Select.Range(„B:B“))

Scheitert mein Anliegen aufgrund der Vielfältigkeit der Quellzellen?

Gruß

Manfred

Hallo Manfred,

Das ist leider viel komplizierter. Die Formeln in
„Pflegeplanung“ beziehen sich auf 13 Tabellenblätter und dort
die Bereiche B98:B103, Fdito, Jdito, N, R, V, Z, AD, AH immer
98:103.
Wenn nötig, werden die 6 Zellen mit Hilfe von Gültigkeit-Liste
gefüllt und in „Pflegeplanung“ eingefügt.

Dann müssen diese 6 Zellen „überwacht“ werden, Gültigkeitsauswahl ist auch eine manuelle Zellwertänderung und startet den Change_Code.

Scheitert mein Anliegen aufgrund der Vielfältigkeit der
Quellzellen?

Nein, gibt da kein Vielfältigkeitslimit.

Du warst im falschen Modul. Du warst im Modul eines Blattes.
Soweit ich weiß kann man dort nur Änderungen in diesem Blatt überwachen.
Und ein anderes Formelergebnis wertet Vba nicht als Änderung, deshalb muß man ja die Zellen überwachen die durch ihre manuelle Änderung das Formelergebnis bestimmen.

Im Modul „Diese Arbeitsmappe“ wird aber mappenweit, also nicht nur Blattweit auf Änderungen reagiert.

Da ist dann

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
End Sub

das was du bislang im Modul eines Blattes als Worksheet_Change kennst.
Jetzt muß man halt erst Sh abprüfen ob es eins der Blätter ist die man überwachen will, dann wie gewohnt Target.

Ich bin aber heut müd, bastel dir das morgen (oder an Ostern *gg*), check ab ob ich alle Infos habe um genau die zu überprüfenden ellen zu kennen, also Tab1!f5:H9, Tab2!d9:e89, usw.

Gruß
Reinhard

Lieber Reinhard,

mir gehts wie dir, bin auch müde.
Leider kann ich die Datei nicht zur Verfügung stellen, weil sie zu groß ist; ohne dass jemand daran gearbeitet hat, ca. 2,4 MB, 25 Module vom Laien ( und von www-Fachleuten…).

Ich poste morgen alle Tabellenblätter mit den enstsprechenden Zellbereichen.
Ostern ist auch kein Problem…

Gruß

Manfred

PS: OT Gab grad einen schönen Beitrag über Konstanz im TV. Dein Internetcafé kam nicht drin vor…

Hallo Reinhard,

dies sind die Namen der Tabellenblätter, Spalten und Zeilen:

‚1 Gesundheitsförderung’
‚2 Ernährung’
‚3 Ausscheidung’
‚4 Aktivität Ruhe’
‚5 Perzeption Kognition’
‚6 Selbstwahrnehmung’
‚7 Rolle Beziehungen’
‚8 Sexualität’
‚9 Coping Stresstoleranz’
‚10 Lebensprinzipien’
‚11 Sicherheit Schutz’
‚12 Befinden’
‚13 Wachstum Entwicklung’

Jeweils die Spalten
B, F, J, N, R, V, Z, AD, AH, AL
immer die Zeilen 98:103.

98:103 sind Gültigkeit-Listenfelder, die gefüllt werden, wenn sie leer sind und geändert werden, wenn die Formulierungen nicht mehr passen, oder auch gelöscht werden. Die Liste umfasst immer die entsprechende Spalte, 3:90.

Die ausgewählten Formulierungen werden z. B. hiermit

WENN(‚1 Gesundheitsförderung‘!B98"";‚1 Gesundheitsförderung‘!B98;"")

nach Pflegeplanung übertragen und mit einem kleinen Makro wird nach Nicht-leeren Zellen gefiltert. Das staucht dann die mindestens 1 bis max. ca. 8 Formulierungen aus den ca. 600 Zeilen auf 1-2 ausdruckbaren Blättern zusammen.

Ich hoffe, ich hab dir jetzt alles mitgeteilt, was du wissen müsstest.

Freundliche Grüße von

Manfred

Dann müssen diese 6 Zellen „überwacht“ werden,
Gültigkeitsauswahl ist auch eine manuelle Zellwertänderung und
startet den Change_Code.

Scheitert mein Anliegen aufgrund der Vielfältigkeit der
Quellzellen?

Nein, gibt da kein Vielfältigkeitslimit.

Du warst im falschen Modul. Du warst im Modul eines Blattes.
Soweit ich weiß kann man dort nur Änderungen in diesem Blatt
überwachen.
Und ein anderes Formelergebnis wertet Vba nicht als Änderung,
deshalb muß man ja die Zellen überwachen die durch ihre
manuelle Änderung das Formelergebnis bestimmen.

Im Modul „Diese Arbeitsmappe“ wird aber mappenweit, also nicht
nur Blattweit auf Änderungen reagiert.

Da ist dann

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal
Target As Range)
End Sub

das was du bislang im Modul eines Blattes als Worksheet_Change
kennst.
Jetzt muß man halt erst Sh abprüfen ob es eins der Blätter ist
die man überwachen will, dann wie gewohnt Target.

Ich bin aber heut müd, bastel dir das morgen (oder an Ostern
*gg*), check ab ob ich alle Infos habe um genau die zu
überprüfenden ellen zu kennen, also Tab1!f5:H9, Tab2!d9:e89,
usw.

Gruß
Reinhard

Hallo Manfred,

in Modul: „Diese Arbeitspmappe“

Option Explicit
'
Private Sub Workbook\_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If Check(Sh, Target) = True Then Call Auswahl
End Sub

in Modul: „Pflegeplanung“

Option Explicit
'
Private Sub ListBox1\_Change()
Dim N As Integer, Anz As Integer, Wert(100) As Variant
For N = 0 To ListBox1.ListCount - 1
 If ListBox1.Selected(N) Then
 Wert(Anz) = ListBox1.List(N)
 Anz = Anz + 1
 End If
Next N
With Worksheets("Kardex")
 .Range("C16:C17").ClearContents
 If Anz \>= 1 Then .Range("C16") = Wert(0)
 If Anz \>= 2 Then .Range("C17") = Wert(1)
End With
End Sub

in Modul: „Modul1“

Option Explicit
'
Sub Auswahl()
Dim Zei As Long
With Worksheets("Pflegeplanung")
 .ListBox1.Clear
 For Zei = 6 To .Cells(Rows.Count, 3).End(xlUp).Row
 If .Cells(Zei, 3) "" Then .ListBox1.AddItem .Cells(Zei, 3)
 Next Zei
End With
End Sub
'
Function Check(Sh, Target)
Dim arrBlatt(), B As Integer, S As Integer
Dim arrSpa()
arrBlatt = Array("Gesundheitsförderung", "Ernährung", "Ausscheidung", \_
 "Aktivität Ruhe", "Perzeption Kognition", "Selbstwahrnehmung", \_
 "Rolle Beziehungen", "Sexualität", "Coping Stresstoleranz", \_
 "Lebensprinzipien", "Sicherheit Schutz", "Befinden", "Wachstum Entwicklung")
arrSpa = Array("B", "F", "J", "N", "R", "V", "Z", "AD", "AH", "AL")
For B = LBound(arrBlatt) To UBound(arrBlatt)
 If Sh.Name = arrBlatt(B) Then
 Check = True
 Exit For
 End If
Next B
If Check = False Then Exit Function
Check = False
For S = LBound(arrSpa) To UBound(arrSpa)
 If Target.Column = Range(arrSpa(S) & "1").Column Then
 Check = True
 Exit For
 End If
Next S
If Check = False Then Exit Function
Check = False
If Target.Row \>= 98 And Target.Row 

Gruß
Reinhard
1 Like

Hallo Reinhard,

ich hatte leider erst heute Zeit, deinen VBA auszuprobieren.

Funktioniert einwandfrei.

TD (Tausend Dank)

Ich wünsch dir schöne Ostern.

Manfred

Hallo manfred,

Funktioniert einwandfrei.

da mir die Funktion viel zu lang geraten ist fragte ich andernorts nach, da wo die wahren genialen Excelianer sind, ich bin da nur ein kleines Licht :smile:

Probiers mal mit dieser Check-Funktion:

Function Check(Sh As Worksheet, Target As Range) As Boolean
 Dim arrBlatt() As Variant
 arrBlatt = Array("Gesundheitsförderung", "Ernährung", "Ausscheidung", \_
 "Aktivität Ruhe", "Perzeption Kognition", "Selbstwahrnehmung", \_
 "Rolle Beziehungen", "Sexualität", "Coping Stresstoleranz", \_
 "Lebensprinzipien", "Sicherheit Schutz", "Befinden", "Wachstum Entwicklung")
 Check = IsNumeric(Application.Match(Sh.Name, arrBlatt, 0))
 If Check Then
 Select Case Target.Column
 Case 2, 6, 10, 14, 18, 22, 26, 30, 34, 38
 Case Else: Check = False
 End Select
 If Check Then
 Check = Target.Row \>= 98 And Target.Row 



> TD (Tausend Dank)


Wenn du mir einen Hunni schickst hab ich mehr von \*gg\*



> Ich wünsch dir schöne Ostern.


Dito.

Gruß
Reinhard

Hallo Reinhard

Funktioniert einwandfrei.

siehe Titel

da mir die Funktion viel zu lang geraten ist fragte ich
andernorts nach, da wo die wahren genialen Excelianer sind,
ich bin da nur ein kleines Licht :smile:

Da fallen mir die Worte Licht und Scheffel ein…:smile:

Folgendes passiert oder auch nicht:

1.) Ich suche aus „1 Gesundheitsförderung“ B98 aus - in der ListBox erscheint nichts. Wähle ich B99 dazu, erscheint B98, aber nicht B99. Also die aktuell ausgewählte Zelle erscheint erst nach der nächsten Auswahl.

2.) Die Blätter gehen ja von „1 Gesundheitsförderung“ bis „13 Wachstum Entwicklung“. Suche ich aus Blatt 5… was aus, erscheint der nächste Eintrag aus einem Blatt davor ( also 1-4)zwar, nicht aber aus einem Blatt danach (6-13).

Aber (heftiges auf die eigene Schulter klopfen…), ich habs gelöst. Hab mir ein Makro-Button eingefügt mit dem Titel „Liste aktualisieren“. Mit dem sind die Probleme gelöst.

TD (Tausend Dank)

Wenn du mir einen Hunni schickst hab ich mehr von *gg*

Wenn du hier deine echte Postadresse postest, frag ich mal meinen Chef…

Ich wünsch dir schöne Ostern.

Gruß

Manfred