PDA

Vollständige Version anzeigen : VBA Text in ZELLE anderen Inhalt in anderes Tabellenblatt


FtPorter
08.07.2014, 16:29
Hallo zusammen,

erst mal dickes LOB an alle hier, die sich so aktiv einbinden.

So nun mal zu meinem Problem: ich komme hier gerade, trotz mehrerer Kannen Kaffee und Sauerstoffpausen an meiner Aufgabenstellung nicht weiter.

Ich habe ein Excel-Eingabeblatt (Tabelle 1), hier werden über sverweise nach Hinterlegung einer Nummer die Restdaten aus einer Masterdatei geholt und eingefügt. Das funktioniert auch alles einwandfrei.

Jetzt ist die Schwierigkeit, durch den Sverweis ein Merkmal z.B. KO / HW / EP / HF mitgezogen und angezeigt wird. Soweit so gut (das ist auch gewollt)!

Dieses Merkmal in z.B. Zelle C19 soll nun für den VBA-Code der Indikator sein, dass z.B. wenn in C19 KO / HW steht die Zellen C6-13 und C15-20 in Tabelle 3 an Stelle C6-13 / C15-20, oder an eine andere von mir zu hinterlegende Stelle kopiert werden sollen.

Sollte dieses Merkmal in Zelle C19 nun aber EP / HF sein, sollen die Zellen C6-13 und C15-20 in Tabelle 2 an Stelle C6-13 / C15-20 oder an eine andere von mir zu hinterlegende Stelle kopiert werden.
*sofern nur Werte kopiert werden, wäre dies wunderbar:grins:

Das ganze möchte ich dann über einen CommandButton anstoßen, der dann nach Erfolgreicher Transaktion des vorherigen Codes, in das entsprechende Zieltabellenblatt springt und eine etwaige weitere Bearbeitung meinerseits zulässt.

Ich hoffe ich habe mich halbwegs verständlich ausgedrückt... und bitte zu berücksichtigen, dass nach 12h Excel mein Hirn leergemartert ist.

Bei Fragen bitte fragen, ansonsten sage ich schon mal DANKEEEEEEE und freue mich auf entsprechende Lösungsansätze / Vorschläge, oder gar nen ganzen code :rolleyes:

Wünsch euch noch nen schönen Fußballabend, oder bei was auch immer ihr entspannen könnt :mrcool:

Gruß
FtPorter

Mc Santa
08.07.2014, 16:54
Hallo,

etwa so?
Sub datenKopieren()
Dim wsSrc As Worksheet, wsTar As Worksheet

Set wsSrc = ThisWorkbook.Worksheets("Tabelle1")
Select Case wsSrc.Cells(19, 3).Value
Case "EP / HF"
Set wsTar = ThisWorkbook.Worksheets("Tabelle2")
Case "KO / HW"
Set wsTar = ThisWorkbook.Worksheets("Tabelle3")
End Select

If Not wsTar Is Nothing Then
wsTar.Range(wsTar.Cells(6, 3), wsTar.Cells(13, 3)).Value = wsSrc.Range(wsSrc.Cells(6, 3), wsSrc.Cells(13, 3)).Value
wsTar.Range(wsTar.Cells(15, 3), wsTar.Cells(20, 3)).Value = wsSrc.Range(wsSrc.Cells(15, 3), wsSrc.Cells(20, 3)).Value
Application.Goto wsTar.Cells(1, 1)
End If
End Sub

Fragen dazu gerne :)
VG

FtPorter
09.07.2014, 08:28
Perfetto!!!!

Mille gracie! :top: Oleee... läuft wie ein Länderspiel :dance:

ggf. komme ich später nochmals wegen der ein oder anderen LOOP Geschichte zurück. Aber erst mal wusel ich mich da mal selber rein. :) :laugh:

Also nochmals vielen herzlichen Dank!

Christian (FtPorter)

FtPorter
09.07.2014, 09:57
hmmm jetzt hänge ich mal wieder mit ner MSGbox...

so schaut mein Code aus:

Private Sub Worksheet_Calculate_1()
Dim rngZelle As Range
If range ("C18") = "240", "300", "310" Then
MsgBox "Phase out process is in progress!", vbCritical
End If
End Sub

könnte aber auch heißen:

Private Sub Worksheet_Calculate_1()
Dim rngZelle As Range
If cells(18, 3) = "240", "300", "310" Then
MsgBox "Phase out process is in progress!", vbCritical
End If
End Sub

Problem ist, dass die Mehrfachprüfung von 240 - 310 immer die gleiche MSGbox auslösen soll... wie bekomme ich dieses Selektionskriterium denn hin?

Gruß & Danke :(
Chrstian

Mc Santa
09.07.2014, 10:08
Hallo

Zunächst zwei Dinge vorab: Wenn in deiner Zelle eine Zahl steht, musst du die Anführungszeichen weglassen. "300" (Text) ist etwas anderes als 300 (Zahl)
MsgBox "300" = 300 'ergibt FALSCH
Und du solltest die Range über .Value ansprechen, auch wenn das der Standardwert ist.

Bei der Abfrage selbst hast du zwei Möglichkeiten:
If braucht mehrere Vergleiche
Private Sub Worksheet_Calculate_1()
Dim rngZelle As Range
If Cells(18, 3).Value = "240" Or Cells(18, 3).Value = "300" _
Or Cells(18, 3).Value = "310" Then
MsgBox "Phase out process is in progress!", vbCritical
End If
End Sub

Besser ist jedoch Select Case, denn auf die Range wird nur einmal zugegriffen!
Private Sub Worksheet_Calculate_1()
Dim rngZelle As Range
Select Case Cells(18, 3).Value
Case "240", "300", "310":
MsgBox "Phase out process is in progress!", vbCritical
End Select
End Sub

Hilft dir das weiter?
VG

FtPorter
09.07.2014, 10:28
Hi Mc Santa,

Danke für den Tipp und Deine Hilfe.

Das Problem ist, dass 240 - 310 eine Zahl ist, die aber über einen Verweis aus einer anderen Tabelle geholt wird.

Jetzt starte ich im VBA-Editor über F5 das Makro, da funktioniert es mit "" und ohne... aber im richtigen Sheet startet es leider nicht automatisch.

:confused: :confused: Woran kann das liegen? Das hatte ich bisher noch nicht.

Im übrigen Sorry für die zum Teil sicherlich lächerlichen Fragen, betrete aber mit VBA Neuland und versuche durch logisches Denken usw... mich da rein zu fuchsen.
Deshalb auch vielen lieben Dank für die Erklärung und Zusammenhänge. Das kann ich mir dann gleich über mein HIF (Human InterFace) LOL auf meiner Festplatte abspeichern.

Gruß Christian

FtPorter
09.07.2014, 10:37
Liegt es ggf. an der MSGbox, die im gleichen Workseet vorher eine andere Abfrage fährt?

Also insgs. habe ich 2 MSGboxen im WS... der Code schaut so aus:

Private Sub Worksheet_Calculate()
Dim rngZelle As Range
If Cells(7, 3) = "No" Then
MsgBox "Customer is inactive! Use an acitive one!!!", vbCritical
End If
End Sub
--------------------------------------------------------------------------
Private Sub Worksheet_Calculate_1()
Dim rngZelle As Range
If Cells(18, 3).Value = 240 Or Cells(18, 3).Value = 300 _
Or Cells(18, 3).Value = 310 Then
MsgBox "Phase out process is in progress!", vbCritical
End If
End Sub

Könnte mir u.U. vorstellen, das da VBA möchte, dass ich beide Abfragen in einem String (oder so) zusammenfasse?!?

Gruß

Christian

Mc Santa
09.07.2014, 10:39
Hallo,

das wird am falschen Namen der Funktion liegen ;)
Private Sub Worksheet_Calculate_1

Aber du solltest dich auch fragen, ob es wirklich bei jeder Rechnung ausgeführt werden muss.

VG

Mc Santa
09.07.2014, 10:42
So geht es:
Private Sub Worksheet_Calculate()

Select Case Cells(7, 3).Value
Case "No":
MsgBox "Phase out process is in progress!", vbCritical
End Select

Select Case Cells(18, 3).Value
Case 240, 300, 310:
MsgBox "Phase out process is in progress!", vbCritical
End Select
End Sub

Bitte nutze in solchen Situationen immer Select-Case. Das ist übersichtlicher und spart dir Laufzeit.

VG

FtPorter
09.07.2014, 10:45
Mache ich das mit dem _1 nicht, erhalte ich folgende Fehlermeldung:

"Fehler beim Kompilieren ---> Mehrdeutiger Name: Worksheet_Calculate"

Deshalb denke ich Excel möchte, dass ich beide Abfragen in eine Packe... :)

Die Abfrage soll immer wieder laufen, da

1. dies ein Master - Formular zur Produktauslaufsteuerung werden soll und immer wieder bei jedem Teil, das auf Auslauf definiert wird neu ausgefüllt werden soll.

2. der Bearbeiter, durch die Box dazu angeregt werden soll korrekte Daten zu hinterlegen, aber ohne den Vorgang in gänze zu blockieren :)

Ich hoffe ich habe das ein wenig verständlich ausgedrückt :)

Grüße
Christian

Mc Santa
09.07.2014, 10:48
Deshalb denke ich Excel möchte, dass ich beide Abfragen in eine Packe... :)

Siehe Antwort #9 :)
VG

FtPorter
09.07.2014, 10:48
Perfekt!!! Merci Mc Santa.

Sobald ich einen vertretbaren Release Stand habe... kann ich die Datei mal posten... natürlich mit veränderten Datensätzen, da vertraulich! :)

Christian

FtPorter
09.07.2014, 11:01
So lesson learned und adaptiert / erweitert.

Vollständiger Code sieht nun so aus:

Private Sub Worksheet_Calculate()

Select Case Cells(7, 3).Value
Case "No":
MsgBox "Customer is inactive! Use an acitive one!", vbCritical
End Select

Select Case Cells(7, 3).Value
Case "Customer does not exist":
MsgBox "Use an existing Customer!", vbCritical
End Select

Select Case Cells(18, 3).Value
Case 240, 300, 310:
MsgBox "Phase out process is in progress!", vbCritical
End Select

Select Case Cells(18, 3).Value
Case "Item does not exist":
MsgBox "Use an existing ITEM!", vbCritical
End Select
End Sub

Und funktioniert wunderbar, so wie es soll :)

Nur zur Info.

Christian

Mc Santa
09.07.2014, 11:21
Es müsste aber so aussehen ;)

Private Sub Worksheet_Calculate()

Select Case Cells(7, 3).Value
Case "No":
MsgBox "Customer is inactive! Use an acitive one!", vbCritical

Case "Customer does not exist":
MsgBox "Use an existing Customer!", vbCritical

End Select

Select Case Cells(18, 3).Value
Case 240, 300, 310:
MsgBox "Phase out process is in progress!", vbCritical

Case "Item does not exist":
MsgBox "Use an existing ITEM!", vbCritical

End Select
End Sub

FtPorter
09.07.2014, 11:50
Einverstanden :)

Bissel schlanker und erfüllt den Zweck 1:1 wie zuvor :)

Vielen lieben Dank!!!

Christian

FtPorter
09.07.2014, 11:58
Hi Mc Santa,

wo darf ich hier die Zielzellen definieren?

Die werden jetzt anders lauten als die Ursprungszellen.

Sub datenKopieren()
Dim wsSrc As Worksheet, wsTar As Worksheet

Set wsSrc = ThisWorkbook.Worksheets("Tabelle1")
Select Case wsSrc.Cells(19, 3).Value
Case "EP / HF"
Set wsTar = ThisWorkbook.Worksheets("Tabelle2")
Case "KO / HW"
Set wsTar = ThisWorkbook.Worksheets("Tabelle3")
End Select

If Not wsTar Is Nothing Then
wsTar.Range(wsTar.Cells(6, 3), wsTar.Cells(13, 3)).Value = wsSrc.Range(wsSrc.Cells(6, 3), wsSrc.Cells(13, 3)).Value
wsTar.Range(wsTar.Cells(15, 3), wsTar.Cells(20, 3)).Value = wsSrc.Range(wsSrc.Cells(15, 3), wsSrc.Cells(20, 3)).Value
Application.Goto wsTar.Cells(1, 1)
End If
End Sub

Bedeutet meinetwegen... Nimm dir den Datensatz aus C16 (Tabelle1) und kopiere deren Inhalt nach C2 (Tabelle2) usw.

Vielen Dank nochmal

Christian

Mc Santa
09.07.2014, 13:04
Hallo,

die blaue Angabe ist das Ziel und die violette Angabe ist der Ursprung.
Daher auch die Namen Src für Source (Quelle) und Tar für Target (Ziel)

VG

Sub datenKopieren()
Dim wsSrc As Worksheet, wsTar As Worksheet

Set wsSrc = ThisWorkbook.Worksheets("Tabelle1")
Select Case wsSrc.Cells(19, 3).Value
Case "EP / HF"
Set wsTar = ThisWorkbook.Worksheets("Tabelle2")
Case "KO / HW"
Set wsTar = ThisWorkbook.Worksheets("Tabelle3")
End Select

If Not wsTar Is Nothing Then
wsTar.Range(wsTar.Cells(6, 3), wsTar.Cells(13, 3)).Value = _
wsSrc.Range(wsSrc.Cells(6, 3), wsSrc.Cells(13, 3)).Value
wsTar.Range(wsTar.Cells(15, 3), wsTar.Cells(20, 3)).Value = _
wsSrc.Range(wsSrc.Cells(15, 3), wsSrc.Cells(20, 3)).Value
Application.Goto wsTar.Cells(1, 1)
End If
End Sub

FtPorter
09.07.2014, 13:54
hmmmm danke mal,

also ich habe die SRC (Zelle, Spalte) im bereich der Zelle angepasst auf die neue zielsource, aber er macht was er will... lol...

If Not wsTar Is Nothing Then
wsTar.Range(wsTar.Cells(3, 3), wsTar.Cells(4, 3)).Value = _
wsSrc.Range(wsSrc.Cells(3, 3), wsSrc.Cells(4, 3)).Value
wsTar.Range(wsTar.Cells(8, 3), wsTar.Cells(9, 3)).Value = _
wsSrc.Range(wsSrc.Cells(6, 3), wsSrc.Cells(8, 3)).Value
Application.Goto wsTar.Cells(1, 1)

die Daten holt er sich aber nachweislich aus Tabelle1 wsSrc.Cells(6, 3), wsSrcCells(7, 3)).value Statt (8, 3))...

kannst du das mir erklären warum das so ist? wäre unheimlich nett.

Vielen Dank im Voraus

Christian

Ergänzung...

Ich vermute es liegt an dem String "..Range..". oder?

Zenario sieht wie folgt aus:

Source (Zeile / Spalte) --> Target (Zeile / Spalte)

(3, 3) --> (3, 3)
(4, 3) --> (4, 3)
(6, 3) --> (8, 3)
(8, 3) --> (9, 3)
(15, 3) --> (13, 3)
(16, 3) --> (14, 3)
(17, 3) --> (15, 3)
(18, 3) --> (16, 3)
(19, 3) --> (17, 3)
(20, 3) --> (19, 3)
(21, 3) --> (18, 3)

Ich weis es ist ein bissel durcheinander, aber auf Grund der Eingabemaske und der weiteren Tabelle, leider so gegeben.

Hoffe ich konnte bissel weiteren Input liefern.

Gruß
Christian

FtPorter
10.07.2014, 08:05
Noch eine Idee als Lösungsansatz?

Gruß

Christian

Mc Santa
10.07.2014, 09:43
Hallo,

Wenn du meine Methode mit dem = (Istgleich) einsetzt musst du die Logik umdrehen. Der Code wird von rechts nach links gelesen:Range("Zieladress").Value = Range("Quelladresse").Value
' VBA wertet die Quelladresse aus und schreibt das Ergebnis in die Zieladresse
' Das ganze funktioniert auch ohne .Value, da dies der Standard ist,
' aber ich empfehle eine Schreibweise MIT .Value

Einzelne Zellen kannst du also so übertragen:wsTar.Cells(3, 3).Value = wsSrc.Cells(3, 3).Value
' bitte beachte, dass du bei Cells(Row, Column)
' zuerst die Zeile und dann die Spalte angibst
' (Bei der Adresse "A1" ist die anders herum)

Zusammenhängende Bereiche kannst du dann folgendermaßen übertragen:wsTar.Range(wsTar.Cells(13, 3), wsTar.Cells(17, 3)).Value = _
wsSrc.Range(wsSrc.Cells(15, 3), wsSrc.Cells(19, 3)).Value


Hilft dir das so weiter und kannst du es für deinen Code anwende?
VG

FtPorter
10.07.2014, 10:26
Ja das war eine super Hilfe!!!

Vielen lieben Dank dafür!

Der Code sieht nun wie folgt aus:
Private Sub CommandButton1_Click()
Dim wsSrc As Worksheet, wsTar As Worksheet
Set wsSrc = ThisWorkbook.Worksheets("MASTER DATA input")
Select Case wsSrc.Cells(19, 3).Value
Case "FG", "SA1", "SA2", "SV2", "SV3"
Set wsTar = ThisWorkbook.Worksheets("NIR_FG-SA-SV")
Case "TP", "CO", "MRO", "NV"
Set wsTar = ThisWorkbook.Worksheets("NIR_CO-TP")
End Select
If Not wsTar Is Nothing Then
wsTar.Range(wsTar.Cells(3, 3), wsTar.Cells(4, 3)).Value = _
wsSrc.Range(wsSrc.Cells(3, 3), wsSrc.Cells(4, 3)).Value
wsTar.Cells(8, 3).Value = wsSrc.Cells(6, 3).Value
wsTar.Cells(9, 3).Value = wsSrc.Cells(8, 3).Value
wsTar.Range(wsTar.Cells(13, 3), wsTar.Cells(19, 3)).Value = _
wsSrc.Range(wsSrc.Cells(15, 3), wsSrc.Cells(21, 3)).Value
Application.Goto wsTar.Cells(1, 1)
End If
End Sub

Und er macht was er soll :)

Dankeeeeeeeeeeeee Christian

Mc Santa
10.07.2014, 10:35
Hallo,

sehr gerne, der Code ist jetzt auch schön übersichtlich. Jetzt stell dir einmal vor, du hättest alles mit If-Angaben gelöst ;)

Eins ist mir noch aufgefallen:
In #18 hast du gesagt es soll folgendermaßen übertragen werden
[...]
(19, 3) --> (17, 3)
(20, 3) --> (19, 3)
(21, 3) --> (18, 3)
[...]

In deinem Makro überträgst du jetzt anders.
Was davon richtig ist, musst du selbst entscheiden :)

VG

FtPorter
10.07.2014, 10:59
Ja finde ich auch :)

Habe das Ursprungsformular umgestellt um mit der Range arbeiten zu können.
Deswegen ist die ursprüngliche Anforderung ungleich zum Code und somit der Code im Moment der korrekte ;)

Danke für den Hinweis ;)

Grüße
Christian