Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1572to1576
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
Inhaltsverzeichnis

Hilfe mit VBA Code

Hilfe mit VBA Code
02.08.2017 21:20:31
Heiko
Hallo liebe Community,
vor nicht langer Zeit, habe ich erst mit VBA begonnen und stehe nun beim Code schreiben jetzt täglich vor großen Herausforderungen... Ich möchte mich unbedingt verbessern...
Dafür brauche ich eure Hilfe und sehr dankbar für jeglichen Rat und Hilfe :-)
So jetzt eine kurze Beschreibung der Aufgabenstellung:
wb Master Data enthält ab Spalte J2 bis zu dem untersten Eintrag (J1000+) "ListingDates" vom (Datums-)Format: 01/05/2010
von denen mich nur die Einträge vom aktuellen Monat und Jahr interessieren
wird zutreffendes Datum wie heute 02/08/2017 in bspw. Zelle J200 gefunden, so muss aber in Spalte C in gleicher Zeile (C200)
geprüft werden ob ein übereinstimmendes Ergebnis mit den Markmalen "Ware A" oder "Ware B" (String Variable) vorliegt.
Ist dies der Fall werden mehrere Einträge in Variablen eingespeichert (Name, Nummer, etc.)
wb Master In wb Master wird dann für je "Treffer", die Werte (Name, Nummer, etc.) in einer neuen Zeile 2,3,4, usw. eingefügt
Abschließend müssen in der gesamten Spalte D, in der jeder Zelle wo das Wort "Gewinn"
erscheint/ auftaucht durch das Wort "Umsatz" ersetzt werden (komplette Zelle umgeschrieben werden)
Zu meinen Fragen/Problemen:
der Code läuft nicht, größtes Problem ist der Datumabgleich >> If ListingDate = " Beliebiger Tag & /" & AktMonat & "/ & AktJahr" Then
zudem fehlt die 2 Abfragebedingung nach Spalte C in wb Master Data + Ersetzung der Werte in Spalte D in wb Master
zudem interessiert mich sehr wie ich den Code und evtl die Schleife eleganter gestalten kann,
bspw. dass ich die jeweilige Spalte nicht mit "Name = ActiveCell.Offset(0, -6).Value" sondern durch einen eingespeicherten Namen (erste Zeile/Header)
im Namensmanager ansprechen kann.
So hier der Code:
Option Explicit

Sub MasterUpdate1()
Dim Master, MasterData As Workbook
Dim dat1, dat2, AktJahr, AktMonat As String
Dim ListingDate As Date
Dim i, k As Integer
i = 1
k = 2
Dim Name, Nummer As String
dat1 = Format(DateSerial(Year(Now), Month(Now()), 1), "YYYY-MM")
dat2 = Format(DateSerial(Year(Now), Month(Now()), 1), "YYYY")
AktJahr = Format(CDate(DateSerial(Year(Now()), 1, 1)), "YYYY")
AktMonat = Format(CDate(DateSerial(1, Month(Now()), 1)), "MM")
Set Master = Workbooks.Open(Filename:="C:\Desktop\Datei\" & dat2 & "\Master.xlsx")
Set MasterData = Workbooks.Open(Filename:="C:\Dekstop\MasterData\" & dat1 & " _ Master Data. _
xlsx")
MasterData.Worksheets("Handel").Activate
Range("J2").Select
Do Until ActiveCell.Value = ""
ListingDate = ActiveCell.Value
If ListingDate = " Beliebiger Tag & /" & AktMonat & "/ & AktJahr" Then
Name = ActiveCell.Offset(0, -6).Value
Nummer = ActiveCell.Offset(0, -4).Value
Master.Worksheets("Instrument").Activate
i = i + 1
Rows(i).Insert Shift:=xlShiftDown
Cells(i, 1).Value = Name
Cells(i, 2).Value = Nummer
End If
MasterData.Worksheets("Handel").Activate
k = k + 1
Range("J" & k).Select
Loop
'Master.SaveAs
End Sub

3
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Hilfe mit VBA Code
03.08.2017 01:39:48
Piet
Hallo Heşke,
ich gebe mal einen Code zurück mit dem ich bei mir ein Beispiel ans Laufen bachte.
Den musst du noch auf deine Datei anpassen. Den Rest musst du dir selbst ausdenken.
Etwas grundsaetzliches in Vba: - wir benutzen Select nicht, auch nicht um Mappen zu selektieren!
Das bewirkt unnötiges Geflackere auf dem Bildschirm. Wesentlich eleganter sind With Klammern.
Der Punkt vor .Cells oder .Offset besagt das sich diese Aktion auf die With Klammer bezieht!
Damit erklaeren wir die Arbeitsmappe zum Object und benutzen den Punkt zum deklarieren!
Die 2. With Klammer ist völlig separat von der ersten!!Beachte die Details zum lernen!
Name = Offset() ist als Variable verboten, gibt Aerger, weil Name ein VBA Schlüsselwort ist! - PName ist z.B Okay
Die Zelle als Name im NamensManager festlegen ist nur sinnvoll wenn die Adresse konstant ist, als Bezugsadresse.
Für die Monat Jahr Auswertung benötigst du einwandfreie Variable, keinen selbstgestrickten Text.
Ich habe dir für Monate/Jahr und Auswertung "Ware A/B" mehrere Varianten gezeigt wie du es schreiben kannst. Zum Lernen!!
Du kannst über Offset gehen, oder die Cells() Methode, wenn du für Cells vorher z = AktiveRow ladest! Bei Cells kannst du die Spalte als Zahl oder als Text angeben! .Cells(z, "C") oder Cells(z, 3)
Bei Range("J2") gehe ich auch über Offset(k,0) nach unten, anstatt Selekt!
So zu programmiern, ohne Select, ist gewöhnungsbedürtig, aber wenn du es begriffen hast - machst du es nur noch so!
mfg Piet

Sub test()
Dim k As Long, i As Long, z As Long
MasterData.Worksheets("Handel").Activate
'With vereinfacht die .Offset() Methode
With ActiveSheet.Range("J2")
Do Until .Offset(k, 0).Value = ""
z = .Offset(k, 0).Row  'akt. Zeile
Listingdate = .Offset(k, 0).Value
Jahr = Year(Listingdate)
Monat = Month(Listingdate)
AktJahr = Year(Now)         'Akt als Variable
AktMonat = Month(Now)       'oder direkt über (Now)
If Monat = AktMonat And Jahr = AktJahr Then         '2 Vatianen zum lernen, eine 

Anzeige
AW: Hilfe mit VBA Code
03.08.2017 01:48:37
Piet
Sorry der Code wurde unvollstendig kopiert

Sub test()
Dim k As Long, i As Long, z As Long
MasterData.Worksheets("Handel").Activate
'With vereinfacht die .Offset() Methode
With ActiveSheet.Range("J2")
Do Until .Offset(k, 0).Value = ""
z = .Offset(k, 0).Row  'akt. Zeile
Listingdate = .Offset(k, 0).Value
Jahr = Year(Listingdate)
Monat = Month(Listingdate)
AktJahr = Year(Now)         'Akt als Variable
AktMonat = Month(Now)       'oder direkt über (Now)
If Monat = AktMonat And Jahr = AktJahr Then    '2 Vatianen zum lernen, eine auswaehlen
'If Monat = Month(Now) And Jahr = Year(Now) Then
If .Offset(k, -7) = "Ware A" Or .Offset(k, -7) = "Ware B" Then   '3 Varianten zum Lernen
'If .Cells(z, "C") = "Ware A" Or .Cells(z, "C") = "Ware B" Then   'für eine Entscheiden!!
'If .Cells(z, 3) = "Ware A" Or .Cells(z, 3) = "Ware B" Then
PName = .Offset(k, -6).Value
Nummer = .Offset(k, -4).Value
'2. With nur für dieses Blatt !!
'PName % Nummer vorher laden !!
With Master.Worksheets("Instrument")
i = i + 1
.Rows(i).Insert Shift:=xlShiftDown
.Cells(i, 1).Value = PName
.Cells(i, 2).Value = Nummer
End With
End If
End If
k = k + 1
Loop
End With
'ganze Spalte umchreiben über Replace = Ersetzen
MasterData.Worksheets("Handel").Columns(4).Replace "Gewinn", "Umsatz"
'Master.SaveAs
End Sub

Anzeige
AW: Hilfe mit VBA Code
07.08.2017 00:11:35
Heiko
Der Code klappt:-) Habe allein durch dieses eine Beispiel schon unglaublich viel gelernt
Danke für die Antwort und deine Zeit, Piet!

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige