[vba] range angabe zerlegen
#1
Guten Abend allerseits,

ich beschäftige mich in letzter Zeit recht intensiv mit vba.




Und komme wiedermal nicht weiter.

Wir produzieren an 2 Linien, 365 Tage im Jahr auf 3 Schichten.
Derzeit werden die Stückzahlen auf einen Schmierzettel (Kein Witz) aufgeschrieben.

Nun, ich bin soweit um die Stückzahlen zu erfassen und möchte diese nun zur weiteren Verarbeitung auf ein Tabellenblatt aufgelistet bekommen.


Aktuell habe ich eine Liste mit 365 Tagen, in 2x3 Spalten habe ich 2 Produktionslinien und 3 Schichten.
Mein Problem ist - ich weiss wie ich etwas in Zelle via vba eintrage, oder kopiere etc - ist auch nicht schwer.
Doch kann man nun eben die "Range" in row und column zerlegen?

So als Beispiel

Worksheets("LinieII").Range("e56") = sTxt

Nur soll es eben nicht in e56 sondern das entsprechende datum das in einer Zelle angezeigt wird, suchen und die passende Spalte dafür nehmen.
Für die meisten ist das vermutlich ein klacks  :22:
Top
#2
Hallo,

Code:
MsgBox Worksheets("LinieII").Range("E56").Row

für die Zeile.

Code:
MsgBox Worksheets("LinieII").Range("E56").Column

für die Spalte.

Und Suchen kannst Du mit der Find-Methode.

Beispiele:
https://www.clever-excel-forum.de/Thread...Find+Datum
https://www.clever-excel-forum.de/Thread...Find+Datum
https://www.clever-excel-forum.de/Thread...Find+Datum
https://www.clever-excel-forum.de/Thread...Find+Datum
Gruß Stefan
Win 10 / Office 2016
Top
#3
Hallo

Stefan hat schon gut erkalert wie man an Zeilen und Spalten herankommt. Ich empfehle den Suchlauf über Set zu machen. Dazu ein Codeschnippsel zum Verstaendnis wie das funktioniert. Mit Set MTG wurde das Sheet definiert. Der Suchlauf über Set gibt einen Wert zurück, wenn er erfolgreich war. Deshalb:
 İf Not mtFind is Nothing Then

Bei mtFind kann man mit mtFind.Row die gefundene Zeile ermitteln, und auch die Spalte über mtFind.Column.  Benutzt man zum Adressieren die Cells Methode, schreibt der Code unten das Ergebnis in die angegeben Spalte. z.B. "E". Die kann auch statt "E" als Zahl angegeben werden: Cells(mtFindRow, 5)  Ich hoffe es hilft weiter VBA im Detail zu verstehen. Auf Select von Sheets und Range sollte man bitte verzichten, ist nicht nötig!

mfg Gast 123


Code:
Sub test()
 Set MTG = Worksheets("Mitglieder")
 Datum = MTG.Range("B2").Value
 'Sucht in Mitglieder die richtige Zeile in Spalte B
 Set mtFind = MTG.Columns("B").Find(What:=Datum, After:=[b2], LookIn:= _
     xlFormulas, LookAt:=xlWhole, SearchDirection:=xlNext, MatchCase:=False)
 
 If Not mtFind Is Nothing Then
    MTG.Cells(mtFind.Row, "E") = sTxt
 End If
End Sub
Top
#4
Uffa - wird schon noch. 
Also finden scheint zu klappen.
Beim wert einfügen happert es noch.
Ist alles noch ziemlich Neuland für mich :)

Derzeit sieht es so aus.
Code:
Sub Dateneinfügen()
Dim zelleS As Range
Dim bereichS As Range
Dim datum As Date

datum = Range("n4")

Set bereichS = Sheets("Daten").Range("B:B")
Set zelleS = bereichS.Find(what:=Date, LookAt:=xlWhole, LookIn:=xlValues)
i = zelleS.Row
MsgBox "erfolg"
cells(i.3) = 2
End Sub


Hiermit versuche ich grade das datum zu suchen. Zeile sollte i sein und daneben einfach nur ne 2 reinschreiben.
Klappt jedoch nicht.

*update

Code:
Sub Dateneinfügen()
Dim zelleS As Range
Dim bereichS As Range
Dim datum As Date

datum = Range("n4")

Set bereichS = Sheets("Daten").Range("B:B")
Set zelleS = bereichS.Find(what:=Date, LookAt:=xlWhole, LookIn:=xlValues)
i = zelleS.Row
MsgBox "erfolg"
Sheets("Daten").Range("c" & i).Value = Range("l4")
End Sub

scheint zu tun, Datum macht er richtig, wie gehe ich nun mit der spalte vor?  :100:
dafür müsste ich ja das "c" ersetzen.
Top
#5
Hallo

Wenn die Zieladresse direkt daneben ist bietet sich die Offset Methode an. Offset(0, 1) setzt den Wert von der gefundenen Zeile aus um eine Spalte nach rechts.  Offset(0, 2) um zwei Spalten nach rechts. Für Zeilen Offset(1, 0) um eine Zeile nach unten, usw.  Offset(1, 1) ist Diagonal. Bei Minus Zahl Spalte nach Links Zeile nach Oben. Hat man die Methode verstanden ist es sehr einfach Werte in andere Zellen zu laden.. 
zelle5.Offset(0, 1).Value = sTxt 

mfg Gast 123
Top
#6
Hallo,

(26.11.2019, 21:59)r4mun schrieb: *update

Code:
Sub Dateneinfügen()
Dim zelleS As Range
Dim bereichS As Range
Dim datum As Date

datum = Range("n4")

Set bereichS = Sheets("Daten").Range("B:B")
Set zelleS = bereichS.Find(what:=Date, LookAt:=xlWhole, LookIn:=xlValues)
i = zelleS.Row
MsgBox "erfolg"
Sheets("Daten").Range("c" & i).Value = Range("l4")
End Sub

scheint zu tun, Datum macht er richtig, wie gehe ich nun mit der spalte vor?  :100:
dafür müsste ich ja das "c" ersetzen.

wenn das Datum nicht gefunden wird, gibt es bei deinem Code Fehler. Dafür benötigst Du das von Gast 123 erwähnte If Not
Gruß Stefan
Win 10 / Office 2016
Top
#7
Hallo,

(26.11.2019, 21:59)r4mun schrieb: scheint zu tun, Datum macht er richtig, wie gehe ich nun mit der spalte vor?  :100:
dafür müsste ich ja das "c" ersetzen.

vielleicht so mit einer Abfrage nach der Spalte?
Code:
Sub Dateneinf?gen()
  Dim zelleS As Range
  Dim bereichS As Range
  Dim datum As Date
  Dim i As Long
  Dim strSpalte As String
 
  datum = Range("n4")
 
  Set bereichS = Sheets("Daten").Range("B:B")
  Set zelleS = bereichS.Find(what:=Date, LookAt:=xlWhole, LookIn:=xlValues)
  If Not zelleS Is Nothing Then
     i = zelleS.Row
     MsgBox "erfolg"
     strSpalte = Application.InputBox("In welcher Spalte soll der wert eingetragen werden?", "Spaltenauswahl", "C", Type:=2)
     If strSpalte <> "Falsch" Then Sheets("Daten").Range(strSpalte & i).Value = Range("l4").Value
  End If
End Sub
Gruß Stefan
Win 10 / Office 2016
Top
#8
Code:
Sub Dateneinfügen1()
Dim zelleS As Range
Dim bereichS As Range
Dim datum As Date

datum = Range("n4")

Set bereichS = Sheets("Daten").Range("B:B")
Set zelleS = bereichS.Find(what:=Date, LookAt:=xlWhole, LookIn:=xlValues)
i = zelleS.Row
a = Range("l8")
MsgBox "gut"
Sheets("Daten").Range(a & i).Value = Range("l4")
Call Dateneinfügen2
End Sub

Wo liegt hier der Fehler?
Bleibt bei Sheets("Daten").Range(a & i).Value = Range("l4") stehen.  Huh
die msgbox dient nur zur diagnose
Top
#9
Hallo,

was enthält die Variable a? Und ich würde dem Range I4 bzw I8 jeweils noch ein Value anhängen.
Gruß Stefan
Win 10 / Office 2016
Top
#10
Zudem fehlt für i und a der Dim

Lg
Marcus

Wissen ist Macht - es ist aber nicht schlimm nicht alles zu wissen.
Man muss nicht alles wissen - man muss nur wissen wo es steht, oder wo man Hilfe bekommt.
Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste