Anzeige
Archiv - Navigation
968to972
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
968to972
968to972
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Werte aus Nachbarzelle einfügen

Werte aus Nachbarzelle einfügen
13.04.2008 01:03:00
Axel
Hallo ihr hilfreichen Helfer,
ich möchte mittels VBA in meiner Tabelle die Werte aus Zelle D hinter den Wert in Zelle C der gleichen Reihe anfügen. Zwischen den beiden Werten soll außerdem noch ein "x" eingefügt werden.
Das Ganze soll dann in jeder Reihe ausgeführt werden, sofern Werte in Zelle C & D vorhanden sind.
Beispiel:
in Zelle C1 steht "100" in Zelle D1 steht "200"
in Zelle C1 soll am Ende "100x200" stehen.
in Zelle C2 steht "555" in Zelle D2 steht "666"
in Zelle C2 soll am Ende "555x666" stehen.
usw.
für eine Lösunfg wäre ich sehr dankbar.
Gruß Axel

19
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
hier ein Beispiel als Schleife
13.04.2008 07:21:55
Matthias
Hallo Axel
Beispiel für den Bereich C1:D20 (mußt Du noch anpassen).
Code in ein Modul

Option Explicit
Sub schleife()
Dim Wert As String, x As Byte (x As Byte reicht bis 254, sonst x As Long)
Tabelle1.Activate 'Tabelle anpassen
For x = 1 To 20  'für 20 Zeilen (anpassen)
Wert = Cells(x, 3)
Cells(x, 3) = Wert & "x" & Cells(x, 4)
Next
End Sub


Gruß Matthias

AW: Zeilennummern: Long
13.04.2008 10:30:00
Erich
Hi Matthias,
zu "Dim x as Byte" hier ein kleiner Hinweis auf ein "Wort zum Sonntag" von Nepumuk):
https://www.herber.de/forum/archiv/952to956/t954760.htm
Grüße von Erich aus Kamp-Lintfort

Anzeige
@Erich oder @Nepumuk
13.04.2008 11:53:10
Tino
Hallo Erich,
diesen Beitrag hatte ich leider nicht gelesen, daher mal noch eine Frage dazu.
@Axel verzeihe mir da es ja eigentlich nicht zum Beitrag gehört.
Wie sieht es aus bei anderen Sachen mal ein Beispiel.

Sub TestStringByte()
Dim a As Byte
For a = 1 To 10
Debug.Print "Test" & a
Next a
End Sub


Wird jetzt die Variable a in dieser Schleife zuerst in einen String Konvertiert weil,
"Test" ein String ist oder sollte man besser CStr (a) schreiben oder was wäre hier empfehlenswert?
Oder spielt es nur im Bezug auf Zellen und Spalten usw. eine Rolle?
Danke und Gruß
Tino

Anzeige
AW: @Erich oder @Nepumuk
13.04.2008 12:16:00
Renee
Hi Tino,
Wird jetzt die Variable a in dieser Schleife zuerst in einen String Konvertiert weil...
Die Variable als solche bleibt unberührt (d.h. wandelt ihren Typ nicht). Hingegegen wird sie beim Befehl
Debug.Print "Test" & a in einen String konvertiert, egal ob da ein "Test" & davor steht oder nicht, weil ein Output immer ein String ist!
Oder spielt es nur im Bezug auf Zellen und Spalten usw. eine Rolle? Nicht unbedingt auf Zellen und Spalten, sondern überall dort wo Funktionen eine Variable von einem bestimmten Typ verlangen und bei Range-Koordinaten sind das nun mal Long-Werte.
GreetZ Renée

Anzeige
AW: @Erich oder @Nepumuk
13.04.2008 12:30:00
Tino
HalloRenée,
danke, glaube jetzt ist der Groschen gefallen.
Also müsste es in diesen, auch wen vielleicht dummen Beispiel so Korrekt sein
Debug.Print CStr("Test" & a)
Mal sehen ob ich in Zukunft auch daran denke.
Wünsche noch einen schönen Sonntag
Gruß
Tino

ist doch alles korrekt ...
13.04.2008 12:27:28
Matthias
Hallo Erich
Grundsätzlich habe ich nichts gegen Hinweise, die auch mir helfen besser zu werden
(das ist ja Sinn und Zweck eines Forum's)
und ich kenne auch die Unterschiede zwischen den Typen Long und Byte, aber ...
... ich verstehe nicht was Du mir sagen willst.
Dim X as Byte reicht doch für mein gepostetes Beispiel
und nur darauf beziehe ich mich!
anders im Beitrag von Tino. Dort muß zwingend als Long deklariert werden (das ist auch mir klar!)
außerdem habe ich doch dazugeschrieben ab 255 als Long deklarieren.
was bitte ist denn daran falsch ?
Ok, ok ich bin kein Profi,
wenn ich aber gleich als Long deklariert hätte, wäre doch garantiert ein Beitrag gekommen das
beim Wert von max. 20 für die Variable X, der Datentyp Byte reicht.
Aber, man kann es sowieso nie allen recht machen.
und nun nochmal zum Beitrag:
Ich würde noch eine Abfrage einbauen, ob der Wert auch eine Zahl ist:
Userbild
und nun noch einen schönen Sonntag an alle
ich geh jetzt auf ne Geburtstagsparty, Prost ;o)
Userbild

Anzeige
AW: ist doch alles korrekt ...
13.04.2008 12:35:00
Tino
Hallo,
was es eigentlich heißen soll.
Mit Byte verbrauchst du mehr wie mit Long und die zusätzliche Konvertierung kostet
Zusätzlich Zeit.
Habe es aber auch nicht gewusst.
Gruß
Tino

AW: ist doch alles korrekt ... JA!
13.04.2008 13:09:08
Erich
Hi Matthias,
an deinem Code ist nichts falsch. Mir war halt nur aufgefallen, dass du dir Gedanken über den Datentyp
der Schleifenvariablen gemacht und (bis 255) mit Byte "gespart" hast. (Dann ginge auch noch Integer...)
Es war ja auch nur ein "kleiner Hinweis", den ich da losgelassen habe.
In seinem Wort zum Sonntag hat Nepumuk erklärt, dass man dadurch fast nichts spart,
dafür aber wegen der nötigen Konvertierungen Mehraufwand verursacht.
Mein Tipp sollte sein:
Es ist besser, sich bei Zeilennummern keine Gedanken zu machen und einfach immer Long zu verwenden.
"wenn ich aber gleich als Long deklariert hätte, wäre doch garantiert ein Beitrag gekommen
das beim Wert von max. 20 für die Variable X, der Datentyp Byte reicht."
Das glaube ich weniger - und wenn, dann würden wir den Schreiber auf Nepumuks WzS hinweisen...
Grüße von Erich aus Kamp-Lintfort und: Schönen Sonntag noch!

Anzeige
AW: Werte aus Nachbarzelle einfügen
13.04.2008 07:52:00
Tino
Hallo,
hier eine Möglichkeit für alle Zellen im Bereich C:D,
sofern Daten in beiden Zellen vorhanden sind.

Option Explicit
Sub ZellenZusammenFühren()
Dim a As Long
Application.ScreenUpdating = False
For a = 1 To Cells(Rows.Count, 4).End(xlUp).Row
If Cells(a, 3) > "" And Cells(a, 4) > "" Then
Cells(a, 3).Value = Cells(a, 3).Value & "x" & Cells(a, 4).Value
End If
Next a
Application.ScreenUpdating = True
End Sub


Gruß
Tino

AW:@ Tino
13.04.2008 14:52:16
Uwe
Hi Tino,
Dein Code ist, denke ich - prinzipiell - die richtige Lösung für das beschriebene Problem. Aber da hier gerade schon eine kleine Diskussion über Variablen gelaufen ist möchte ich hier mal einen Hinweis einfügen, den ich mal von einem Prifo bekommen habe, nachdem ich eine ähnliche Schleife geschrieben hatte:
Es ist besser die Schleife so zu schreiben:

Sub ZellenZusammenFühren()
Dim a As Long
Dim lngEnde As Long
lngEnde = Cells(Rows.Count, 4).End(xlUp).Row
Application.ScreenUpdating = False
For a = 1 To lngEnde
If Cells(a, 3) > "" And Cells(a, 4) > "" Then
Cells(a, 3).Value = Cells(a, 3).Value & "x" & Cells(a, 4).Value
End If
Next a
Application.ScreenUpdating = True
End Sub


... das heißt, den TO-Wert immer außerhalb der Schleife in eine Variable zu schreiben (natürlich nur sofern er sich innerhalb der Schleife nicht ändert, was hier aber nicht der Fall sein kann), und dann in der Schleife die Variable zu benutzen, WEIL sonst der Wert bei jedem Schleifendurchgang immer wieder neu ermittelt werden muss, und das kann doch schon eineges an Zeit und Rechnerleistung kosten, je nachdem wie oft die Schleife durchlaufen wird.
Gruß
Uwe
(:o)

Anzeige
AW: AW:@ Tino
13.04.2008 14:57:59
Tino
Hallo,
danke, man lernt eben nie aus.
Gruß
Tino

AW: AW:@ Tino
13.04.2008 15:47:00
Renee
Hi Uwe,
Dein VBA- oder Was-Auch-Immer Profi hat dir einen absoluten Unsinn erzählt.
Natürlich optimiert der Compiler die Grenzvariable für einen For Loop dahingehend, dass sie nur einmal ausgeerechnet wird. Wo kämen wir den da hin, wenn das so wäre wie dieser Profi dir erzählt hat.
Das kannst du einfach mit einem Timer Prüfen (3 Varianten):

Private Sub testFix()
Dim t As Single
t = Timer
Dim vArray(1 To 1000000) As Variant
Dim lIndex As Long
For lIndex = 1 To 1000000
vArray(lIndex) = lIndex
Next
Debug.Print Timer - t
End Sub
Private Sub testVar()
Dim t As Single
Dim lX As Long
t = Timer
Dim vArray(1 To 1000000) As Variant
Dim lIndex As Long
lX = 1000000
For lIndex = 1 To lX
vArray(lIndex) = lIndex
Next
Debug.Print Timer - t
End Sub
Private Sub testGerechnet()
Dim t As Single
t = Timer
Dim vArray(1 To 1000000) As Variant
Dim lIndex As Long
For lIndex = 1 To ActiveSheet.Range("A" & Sheet1.Rows.Count).End(xlUp).Row * 1000000
vArray(lIndex) = lIndex
Next
Debug.Print Timer - t
End Sub


GreetZ Renée

Anzeige
AW: Timer-Korrektur...
13.04.2008 15:54:40
Renee
Kleine Korrektur für die letzte Routine (die, die soviel Overhead verursachen sollte ;-)

Private Sub testGerechnet()
Dim t As Single
t = Timer
Dim vArray(1 To 1000000) As Variant
Dim lIndex As Long
For lIndex = 1 To ActiveSheet.Range("A" & ActiveSheet.Rows.Count).End(xlUp).Row * 1000000
vArray(lIndex) = lIndex
Next
Debug.Print Timer - t
End Sub


Natürlich sollte das aktive Blatt für diese Routine leer sein, damit die Schleife ebenfalls 1 Mio durchlaufen wird.
GreetZ Renèe

AW: Timer-Korrektur...
13.04.2008 16:08:00
Tino
Hallo Renèe,
danke dir, war schon fast dabei meine ganzen Programme umzubauen ;-)
@ Uwe
Sorry, musste ich einfach loswerten, ist nicht persönlich gemeint.
Wünsche noch einen schönen Sonntag.
Gruß
Tino

Anzeige
AW: Timer-Korrektur...
13.04.2008 17:12:26
Gerd
Hallo zusammen,
der Schleifenkopf der For..Next-Schleife wird nur einmal durchlaufen.
Die Ermittlung eines Zählerwertes mit ... End(xlup) ist
geringfügig schneller als das Einlesen eines Variablenwertes.
Gruß Gerd

AW: Timer-Korrektur...
13.04.2008 19:09:00
Uwe
Hi Renée,
ich habe Deinen Test gemacht, obwohl ich Dir natürlcih auch so geglaubt habe. Danke.
Hi Tino,
sorry für den falschen Tip. Ich hoffe Du verzeihst mir. (Ich habe übrigens daraufhin ein paar von meinen Programmen umgebaut (:-| ). Aber Renée hat ja das schlimmste verhindert.
Hi Gerd,
... stimmt, mit Renées Test konnte ich auch feststellen, dass die dritte Version sogar schneller ist.
Hi ALLE,
den Tippen hatte ich nicht hier aus dem Forum sondern von einem Arbeitskollegen, der bei uns als Programmierer arbeitet (ich bin zwar auch in der IT-Abteilung aber nur Hobbyprogrammierer). Dem werde ich morgen erst mal was erzählen !!!!!! (;-). Er kommt allerdings aus der C#-Programmierung, aber ich kann mir nicht vorstellen, dass das da schlechter ist als in VBA.
Nochmal SORRY und DANKE
Gruß
Uwe
(:o)

Anzeige
AW: Timer-Korrektur...
13.04.2008 19:14:10
Uwe
Hi Renée,
das hatte ich schon durch:
For lIndex = 1 To ActiveSheet.Range("A" & Tabelle1.Rows.Count).End(xlUp).Row * 1000000
korrigiert. Nicht dass Du denkst ich hätte gemogelt als ich geschrieben habe (vor Deine Korrektur), dass ich es getestet habe. Nochmal Danke.
Gruß
Uwe
(:o)

AW: Timer-Korrektur...
13.04.2008 19:55:04
Tino
Hallo Uwe,
dass war nur ein Scherz von mir!
Ich bin viel zu schreibfaul um meine Programme, die für meine Bedürfnisse optimal laufen
umzuschreiben.
Wahrscheinlich bei den nächsten wäre ich auch zu faul, dafür extra eine Variable noch anzulegen.
Soll aber nicht heißen, dass ich den ganzen Tag auf der Coutsch liege. ;-)
Gruß
Tino

AW: Werte aus Nachbarzelle einfügen
13.04.2008 19:39:00
Axel
vielen Dank für die vielen Vorschläge ich habe mich für die Methode von Tino entschieden, die klappt soweit sehr gut bei mir
Gruß Axel

302 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige