Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

For Next Zellwerte kopieren und einfügen
#1
Moin, liebes Excel-Forum!

Ich habe da ein kleines Problem - wie sollte es auch anders sein *lol

Also...
Ich habe ein Tabellenblatt A.
In diesem Tabellenblatt A sind in Spalte 25 insgesamt 56 Daten drin.
Diese möchte ich auf Tabellenblatt B in eine Zeile (somit 230 Spalten) einfügen.

Bisher habe ich das mit einfachem Auslesen und Speichern in einer Variablen gemacht (z.B. AB1 = Range("Y2"))
Allerdings ist die Datensatz-Menge jetzt ziemlich angestiegen, sodass ich einen einfacheren Weg suche. ). Hier im Beispiel-Code habe ich das auf gesamt 10 reduziert, der einfachheit halber)
Aus Basic-Zeiten kenne ich ja noch die For-Next-Schleife.

Meine Idee war folgende:

Code:
DIM Zahler as Integer, i as integer, a as string

Worksheets("B").Activate
Zahler = Range("AC1")
Zahler = Zahler + 1

For i = 1 To 10
Worksheets("A").Activate
a = Cells(i + 1, 25).Copy
Worksheets("B").Activate
Cells(Zahler, i).Activate

ActiveCell.Value = a

Next i

Worksheets("A").Activate
Cells.Activate
Cells.EntireRow.RowHeight = 18
Cells(1, 1).Select

MsgBox ("Daten gespeichert!")

Worksheets("A").Activate

Vom Ablauf :
Zunächst leseich die bereits vorhandene Menge an Datensätzen in Tabelle "B" aus und speichere den Wert in der Variablen "Zahler"
und erhöhe den Wert um 1.
-> Ich möchte, dass jeder neue Datensatz in eine neue Zeile kopiert wird. 

Dann beginnt die For Next Schleife.
  1. Jetzt wird Tabellenblatt "A" aktiviert.
  2. Zellwert aus Spalte 25, Zeile i+1 wird kopiert und der Variablen "a" zugewiesen.
  3. Danach wird das Tabellenblatt "B" aktiviert und die erste Zelle der nächsten freien Zeile ausgewählt (Variable Zahler)
  4. Nun wird der aktuelle Wert der Variablen "a" dort hineingeschrieben.
  5. Danach beginnt das Ganze von Vorn.

Der Rest ist lediglich dass anschließend alle Zellen die gleiche Größe erhalten, eine Erfolgsmeldung ausgegeben wird und das Tabellenblatt "A"
als Standardblatt angezeigt wird.

Soweit funktioniert das auch schon ABER...
In jeder kopierten Zelle steht nur "WAHR" drin...

Warum? Was mache ich verkehrt?
Antworten Top
#2
Hi,

Zitat:Diese möchte ich auf Tabellenblatt B in eine Zeile (somit 230 Spalten) einfügen.

wieso ergeben 56 Zeilen dann 230 Spalten?

Mit diesem Code:

Code:
With Sheets("B")
.Range("B5:B17").Copy
Sheets("A").Range("B7").PasteSpecial Transpose:=True
End With


werden alle Inhalte des Bereichs B5:B17 aus dem Blatt B nach A kopiert.

In Deiner Anfrag ist eine Menge Text, aber nur wenig nachvollziehbarer Inhalt. Stelle mal die Datei mit Spieldaten ein, damit man das nachvollziehen kann.
Gruß

Edgar

Meine Antworten sind freiwillig und ohne Gewähr!
Über Rückmeldungen würde ich mich freuen.
Antworten Top
#3
Moin,

k.a ob ich es richtig verstanden habe aber hier 
.xlsm   Lösungsvorschlag.xlsm (Größe: 20,44 KB / Downloads: 5) einmal eine Beispieldatei ?  Huh
Antworten Top
#4
Hallo

der Code von Edgar war im Prinzip schon richtig, du konntest ihn nur nicht auf deinen Range anpassen.

In deinem Beispiel fielen mir irreführende Variable Deklarationen auf.  Die solltest du bitte vermeiden.
Set ws = Worksheets("Tabellenblatt A")           Waerum nicht wsa für Sheet A, wsb für Sheet B ???
Set wsa = Worksheets("Tabellenblatt B")

y=1   entspricht NICHT deinen Vorgaben.  Du willst doch die neuen Daten in der nächsten freien Spalte anhängen.
Dann musst du auch zuerst die nächste freie Spalte ermitteln.  
LastRow = Cells(1, 25).End(xlDown).Row   Wenn die erste Zelle leer ist geht dein LastRox bis zum Blattende!
Ich verwende lieber:  LastRow = Cells(Rows.Count, 25).End(xlUp).Row   Da kann der Effekt nicht passieren.

mfg Gast 123

Code:
Sub Transpose_kopieren()
Dim TB As Worksheet, LastRow As Long, LastSpa
Set TB = Sheets("Tabellenblatt B")
With Sheets("Tabellenblatt A")
     LastSpa = TB.Cells(1, Columns.Count).End(xlToLeft).Column + 1
     LastRow = .Cells(Rows.Count, 25).End(xlUp).Row
     .Range("Y1:Y" & LastRow).Copy
     TB.Cells(1, LastSpa).PasteSpecial Transpose:=True
     Application.ScreenUpdating = False
End With
End Sub
Antworten Top
#5
@Gast 123

bei deinem Code

Code:
Dim TB As Worksheet, LastRow As Long, LastSpa

ist nur LastRow vom Typ Long, Last Spa ist vom Typ Variant
Gruß Stefan
Win 10 / Office 2016
Antworten Top
#6
Hallo

stimmt, habe As Integer vergessen, funktioniert aber auch mit Variant.

mfg Gast 123
Antworten Top
#7
Moin, off topic und lediglich grundsätzlich:
Der Speicherplatz einer Variablen mag auf den Rechnern von Apollo 11 eine Rolle gespielt haben.
[quasi also der direkten Vorgänger-Version von @Gast 123}
Und ja!
Ich kenne auf DOS-Systemen noch die Verrenkungen mit Autoexec.bat und Config.sys, um den erweiterten Speicher (oberhalb von 640 kB) zu optimieren.
Mag mir jemand mal ein Makro schreiben, welches den Nachteil des Variant nachvollziehbar beweist?

Gruß Ralf
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
Antworten Top
#8
Off-Topic weiter: Geht jetzt aber nicht um das Thema Typsicherheit o.ä., nur Speicherplatz oder Performance. Denn ich würde jetzt nicht empfehlen, immer den Datentyp Variant zu nehmen

Beispiel

Code:
Option Explicit

Sub Vergleich()

    Const anzahl = 10000000

    Dim start As Double, i As Long
    Dim ende As Double
    Dim resultV As Double
    Dim resultL As Double
   
    start = Timer
    ' Test mit Variante
    Dim v As Variant
    Dim v1 As Variant: v1 = 5
    Dim v2 As Variant: v2 = 25
    For i = 1 To anzahl
        v = v1 * v2
    Next i
   
    ende = Timer
    ' Zeit für Variantenoperationen anzeigen
    resultV = ende - start
    Debug.Print "Zeit für Variant: " & resultV & " Sekunden"

    start = Timer
    ' Test mit Integer
    Dim k As Long
    Dim k1 As Long: k1 = 5
    Dim k2 As Long: k2 = 25
   
    For i = 1 To anzahl
        k = k1 * k2
    Next i
       
    ende = Timer
    ' Zeit für Integeroperationen anzeigen
    resultL = ende - start
    Debug.Print "Zeit für Integer: " & resultL & " Sekunden"
   
    Debug.Print "Variant benötigt " & resultV - resultL & " Sekunden länger als Long"
End Sub

https://stackoverflow.com/a/27940670/6600940

Zitat:Avoid Using The Variant Data Type

Most of the time, you should declare your variables with specific data types, such as StringLong, or Double. VBA supports the Variant data type that can hold any type of data. If you omit the As Type clause in a variable declaration, Variant is the default type. While this may seem useful, it increases processing time when encountered in code because behind the scenes, the compiler has added no small amount of code to test what type of data is actually stored in the variable. Moreover, using a Variant can mask possible Type Mismatch errors that should be caught during testing. Instead of using a Variant type, declare the variable with a specific data type.
This is not to say that Variant types are always undesirable. The can and do serve a purpose. As an example, consider the return type of the Application.GetSaveAsFilename method. If the user cancels out of the dialog, the method returns a Boolean type with a value of False. If the MultiSelect parameter is False, the method returns a String. If the MultiSelect parameter is True, the method returns an array of String variables. By returning a Variant whose type can be tested, the GetSaveAsFilename can be quite flexible, as shown in the following code:
Dim V As Variant
Dim N As Long
 
V = Application.GetOpenFilename(MultiSelect:=True)
If IsArray(V) = True Then
    For N = LBound(V) To UBound(V)
        Debug.Print "Files selected: (" & CStr(N) & ")"
        Debug.Print "File: " & CStr(N), V(N)
    Next N
Else
    If V = False Then
        Debug.Print "No file name selected."
    Else
        Debug.Print "One file selected: " & V
    End If
End If
 

   
[-] Folgende(r) 1 Nutzer sagt Danke an Warkings für diesen Beitrag:
  • EarlFred
Antworten Top
#9
Moin, Edgar!

Und ich hatte gedacht, dass ich es so gut wie möglich beschrieben hatte...
Danke für Deinen Code, ich werde den am Wochenende einmal ausprobieren! 19

... und natürlich ergeben 56 Zeilen auch 56 Spalten... - Sorry dafür. 20

Beispiel-Datei folgt dann auch am WE!

So, das hat mir ja keine Ruhe gelassen 19 

Mein Resultat, was für mich perfekt und auch schnell funktioniert:
Code:
Sub Transpose_kopieren()
Dim TB As Worksheet, LastRow As Long, LastRowtb As Long, LastSpa
Set TB = Sheets("Tabellenblatt B")

Worksheets("Tabellenblatt B").Activate
LastRowtb = Range("A1") 'A1 =Anzahl2(A2:A75000)+2

With Sheets("Tabellenblatt A")
     LastSpa = TB.Cells(1, Columns.Count).End(xlToLeft).Column + 1
     LastRow = .Cells(Rows.Count, 25).End(xlUp).Row
     .Range("Y1:Y" & LastRow).Copy
     TB.Cells(LastRowtb, 1).PasteSpecial Transpose:=True
     Application.ScreenUpdating = False
End With
End Sub

Dieses Makro nimmt alle 56 auf Tabellenblatt A markierten Zellen in Spalte 25 und kopiert sie unter die letzte Zeile in Tabellenblatt B.

GENAU SO habe ich mir das vorgestellt!
Vielen, vielen herzlichen Dank an Edgar und Gast123 - ihr habt mir wirklich SEHR geholfen!
23 23 

An die Off-Topic-Schreiber: Dodgy  Macht doch bitte einfach nächstes Mal ein Kaffeekränzchen an Eurem eigenen Themen-Tischchen... denn Eure Diskussion hat mich echt ziemlich verwirrt... und ehrlich gesagt, ging es in meinem Thema um MEIN Problem und nicht um irgendwelche Konventionen, oder sowas... Vielen Dank für Euer Verständnis! Blush 19
Antworten Top
#10
(09.04.2024, 21:07)Agriebl schrieb: An die Off-Topic-Schreiber: Dodgy  Macht doch bitte einfach nächstes Mal ein Kaffeekränzchen an Eurem eigenen Themen-Tischchen... denn Eure Diskussion hat mich echt ziemlich verwirrt... und ehrlich gesagt, ging es in meinem Thema um MEIN Problem und nicht um irgendwelche Konventionen, oder sowas... Vielen Dank für Euer Verständnis! Blush 
An den Fragesteller:
Ein Forum dient(e) vornehmlich dem Austausch unter Gleichgesinnten auf Augenhöhe und ist kein Dienstleister, Chatbot, Codeautomat und keine Hotline. Leider hat sich das in den letzten Jahren immer mehr zu letzterem gewandelt und den fachlichen Diskurs damit fast gänzlich unterbunden, weil jeder nur SEIN Problem maßgeschneidert gelöst haben will, die Lösung abgreift und sich dann wieder verdrückt, ohne der Community etwas zurückzugeben. 

Es ist also genau das Gegenteil wünschenswert: Mehr solcher Diskussionen auch innerhalb anderer Themen, denn das hält die Helfer bei Laune, die, die mehr wollen, als sich als Codelieferant zu fühlen, die, die hinter die Dinge schauen wollen. Wenn du damit nichts anfangen kannst: ignoriere es einfach. Wenn du lernen willst: lies mit, hör zu, verstehe.

Den anderen das „Maul“ zu verbieten ist auf gar keinen Fall etwas, was du tun solltest, denn du landest damit bei vielen in einer Schublade, in die du nicht willst: Ignorant, desinteressiert, „Codeabgreifer“ ohne jeden Willen, etwas über den eigenen Horizont hinaus lernen zu wollen; kurz: Ignoreliste. Daran ändern auch die „lustigen“ Smileys nichts.

(01.04.2024, 18:50)Warkings schrieb: Beispiel...
[...]
https://stackoverflow.com/a/27940670/6600940
Anschauliches Beispiel und guter Link, da ist viel zusammengefasst. 

Ergänzung zum Thema: Variant nehme ich grundsätzlich für das Auslesen von Zellinhalten (nicht nur beim Bereichsauszug in ein Array) - damit sind auch Fehlerwerte behandelbar:
Code:
Dim vRet As Variant

vRet = ActiveCell.Value

If IsError(vRet) Then
   Select Case vRet
      Case CVErr(xlErrDiv0)
         '...
      Case CVErr(xlErrNA)
         '...
      'usw
   End Select
End If
Hat Dir mein Beitrag geholfen? Dann hilf auch Du - mit einer Spende an Wikipediadie Tafeln oder aktion-deutschland-hilft.de
[-] Folgende(r) 1 Nutzer sagt Danke an EarlFred für diesen Beitrag:
  • Kl@us-M.
Antworten Top


Gehe zu:


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