PDA

Vollständige Version anzeigen : per VBA Werte aus anderen Tabellenblättern lesen


EasyD
29.06.2014, 14:33
Hallo zusammen,

ich habe mich nun schon durch diverse Foren gewühlt, und bisher nur halbgare Lösungen für mein Problem gefunden.

Mein Ziel:
Ich möchte aus 2 unterschiedlichen Tabellenblättern Zellen auslesen und in ein drittes Tabellenblatt in SpalteA wieder geben.
Leichtes Erschwernis, bei den Quell-Tabellenblättern muss gerechnet werden bevor die Werte in das dritte Blatt geschrieben werden.

1) Tabelle1 SpalteA minus SpalteB - dies für alle gefüllten Zeilen
2) Tabelle2 SpalteA minus SpalteB - dies für alle gefüllten Zeilen
(Tabelle1 und 2 sind von identischem Aufbau, mit untereinander aber unterschiedlicher und auch veränderlicher Zeilenanzahl)

3) Tabelle3 (Zieltabelle)
Ergebnis 1) in SpalteA
Ergebnis 2) in SpalteA unmittelbar darunter (Es sollen zunächst die Ergebnisse aus Tabelle1 in die Tabelle3 geschrieben werden, und anschliessend der identische Vorgang mit der Tabelle2 unmittelbar darunter)

ist wahrscheinlich recht simpel mit VBA, nur leider hört bei Schleifen mein selbst erarbeitetes "Fachwissen" auf...
Das eigentliche Problem ist nämlich, dass ich nicht bestimmen kann, wo in Tabelle3 die Ergebnisse aus Tabelle1 aufhören und entsprechend mit den Ergebnissen aus Tabelle2 angefangen werden muss.

Vielen Dank!

Hajo_Zi
29.06.2014, 14:48
Du hast Extra keine Datei verlinkt, da Du die Lösung selber an Deine Bedingungen anpassen wolltest. Viel Erfolg. Ich bin dann raus, da ich ja schon eine funktionierende Lösung erstellt habe.
Option Explicit

Sub Uebertrag()
Dim LoletzteA As Long
Dim LoletzteB As Long
Dim Loi As Long
Dim Lozeile As Long
With Worksheets("Tabelle1")
LoletzteA = IIf(IsEmpty(.Cells(Rows.Count, 1)), .Cells(.Rows.Count, 1).End(xlUp).Row, .Rows.Count)
LoletzteB = IIf(IsEmpty(.Cells(Rows.Count, 2)), .Cells(.Rows.Count, 2).End(xlUp).Row, .Rows.Count)
For Loi = 1 To Application.WorksheetFunction.Max(LoletzteA, LoletzteB)
If IsNumeric(.Cells(Loi, 1)) And IsNumeric(.Cells(Loi, 2)) Then
Worksheets("Tabelle3").Cells(Lozeile + 1, 1) = .Cells(Loi, 1) - .Cells(Loi, 2)
Else
Worksheets("Tabelle3").Cells(Lozeile + 1, 1) = .Cells(Loi, 1) & " " & .Cells(Loi, 2)
End If
Lozeile = Lozeile + 1
Next Loi
End With
With Worksheets("Tabelle2")
LoletzteA = IIf(IsEmpty(.Cells(Rows.Count, 1)), .Cells(.Rows.Count, 1).End(xlUp).Row, .Rows.Count)
LoletzteB = IIf(IsEmpty(.Cells(Rows.Count, 2)), .Cells(.Rows.Count, 2).End(xlUp).Row, .Rows.Count)
For Loi = 1 To Application.WorksheetFunction.Max(LoletzteA, LoletzteB)
If IsNumeric(.Cells(Loi, 1)) And IsNumeric(.Cells(Loi, 2)) Then
Worksheets("Tabelle3").Cells(Lozeile + 1, 1) = .Cells(Loi, 1) - .Cells(Loi, 2)
Else
Worksheets("Tabelle3").Cells(Lozeile + 1, 1) = .Cells(Loi, 1) & " " & .Cells(Loi, 2)
End If
Lozeile = Lozeile + 1
Next Loi
End With

End Sub


<img src="http://Hajo-Excel.de/images/grusz1.gif" align="middle" height="40" alt="Grußformel"><a href="http://Hajo-Excel.de/index.htm"><img border="0" src="http://Hajo-Excel.de/images/logo_hajo3.gif" align="middle" height="40" alt="Homepage"></a>

ransi
29.06.2014, 14:49
Hallo

Schau dir mal dies an:
<div style="background-color:#FFFFFF; border-width:2px; border-style: groove; border-color:#ff9966; padding:4px;"><nobr><span style="font-family:Courier New,Arial; font-size:9pt ;" ><span style="color:#000080"; >Option</span> <span style="color:#000080"; >Explicit</span><br /><br /><b><span style="color:#000080"; >Sub</span> machs()</b><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#000080"; >Dim</span> vntTabelle1 <span style="color:#000080"; >As</span> <span style="color:#000080"; >Variant</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#000080"; >Dim</span> vntTabelle2 <span style="color:#000080"; >As</span> <span style="color:#000080"; >Variant</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#000080"; >Dim</span> vntOut <span style="color:#000080"; >As</span> <span style="color:#000080"; >Variant</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#000080"; >Dim</span> lngIndex <span style="color:#000080"; >As</span> <span style="color:#000080"; >Long</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#000080"; >Dim</span> lngcount <span style="color:#000080"; >As</span> <span style="color:#000080"; >Long</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#000080"; >With</span> Sheets(<span style="color:#800000"; >"Tabelle1"</span>)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vntTabelle1 = Intersect(.Range(<span style="color:#800000"; >"a1"</span>).CurrentRegion, .Range(<span style="color:#800000"; >"A:B"</span>)) <span style="color:#008000"; >'alle gef&uuml;llten Zeilen</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#000080"; >End</span> <span style="color:#000080"; >With</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#000080"; >With</span> Sheets(<span style="color:#800000"; >"Tabelle2"</span>)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vntTabelle2 = Intersect(.Range(<span style="color:#800000"; >"a1"</span>).CurrentRegion, .Range(<span style="color:#800000"; >"A:B"</span>)) <span style="color:#008000"; >'alle gef&uuml;llten Zeilen</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#000080"; >End</span> <span style="color:#000080"; >With</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#008000"; >'Ausgabearray dimensionieren</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#000080"; >Redim</span> vntOut(1 <span style="color:#000080"; >To</span> <span style="color:#000080"; >UBound</span>(vntTabelle1) + <span style="color:#000080"; >UBound</span>(vntTabelle2), 1 <span style="color:#000080"; >To</span> 1)<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#000080"; >For</span> lngIndex = 1 <span style="color:#000080"; >To</span> <span style="color:#000080"; >UBound</span>(vntTabelle1)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lngcount = lngcount + 1 <span style="color:#008000"; >'Z&auml;hler im Ausgabearray um 1 hochz&auml;hlen</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vntOut(lngcount, 1) = vntTabelle1(lngIndex, 1) - vntTabelle1(lngIndex, 2) <span style="color:#008000"; >'Tabelle1 SpalteA minus SpalteB</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#000080"; >Next</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#000080"; >For</span> lngIndex = 1 <span style="color:#000080"; >To</span> <span style="color:#000080"; >UBound</span>(vntTabelle2)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lngcount = lngcount + 1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vntOut(lngcount, 1) = vntTabelle2(lngIndex, 1) - vntTabelle2(lngIndex, 2) <span style="color:#008000"; >'Tabelle2 SpalteA minus SpalteB</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#000080"; >Next</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#008000"; >'Ausgeben</span><br />&nbsp;&nbsp;&nbsp;&nbsp;Sheets(<span style="color:#800000"; >"Tabelle3"</span>).Range(<span style="color:#800000"; >"A1"</span>).Resize(<span style="color:#000080"; >UBound</span>(vntOut, 1)) = vntOut<br /><b><span style="color:#000080"; >End</span> <span style="color:#000080"; >Sub</span></b><br /><br /></span></nobr></div>

Hilft dir das weiter ?

ransi

EasyD
29.06.2014, 19:35
Wow

also das geht ja fix hier.
na dann werde ich mir eure Lösungen mal zu Gemüte führen, vielen Dank erstmal, ich werde Erfolge vermelden denke ich und ja - ich wollte die hier gefundene Lösung an mein Problem anpassen, ich denke das bekomme ich hin. Bin zwar nicht sonderlich mit VBA bewandert, aber lernfähig

:mrcool:

EasyD
29.06.2014, 20:24
Abgefahren! funzt wie Hexe!
Vielen vielen Dank Hajo_Zi!

habe deine "Else" noch mit dem Setzen des Namen's des Tabellenblattes ersetzt, weil ich deine &-Verkettung da drin nicht gebrauchen konnte. Dann habe ich zusätzlich noch einen weiteren Wert aus einer anderen Spalte dazu geschrieben - fertig.

@ansi:
deinen habe ich auch probiert, hatte aber einen Typenfehler
habe da nicht weiter rum probiert, da Hajo_Zi sein Code prima klappt.

Danke an alle!