Registriert seit: 23.08.2020
Version(en): 2007
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.
- Jetzt wird Tabellenblatt "A" aktiviert.
- Zellwert aus Spalte 25, Zeile i+1 wird kopiert und der Variablen "a" zugewiesen.
- Danach wird das Tabellenblatt "B" aktiviert und die erste Zelle der nächsten freien Zeile ausgewählt (Variable Zahler)
- Nun wird der aktuelle Wert der Variablen "a" dort hineingeschrieben.
- 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?
Registriert seit: 13.04.2014
Version(en): 365, 2019
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.
Registriert seit: 29.01.2020
Version(en): DB Office 365 Basic
Moin,
k.a ob ich es richtig verstanden habe aber hier
Lösungsvorschlag.xlsm (Größe: 20,44 KB / Downloads: 6)
einmal eine Beispieldatei ?
Registriert seit: 12.03.2016
Version(en): Excel 2003
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
Registriert seit: 11.04.2014
Version(en): Office 2007
@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
Registriert seit: 12.03.2016
Version(en): Excel 2003
Hallo
stimmt, habe As Integer vergessen, funktioniert aber auch mit Variant.
mfg Gast 123
Registriert seit: 12.10.2014
Version(en): 365 Insider (32 Bit)
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)
Registriert seit: 18.10.2020
Version(en): 365
01.04.2024, 18:50
(Dieser Beitrag wurde zuletzt bearbeitet: 01.04.2024, 19:12 von Warkings.)
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 String, Long, 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:1 Nutzer sagt Danke an Warkings für diesen Beitrag 28
•
Registriert seit: 23.08.2020
Version(en): 2007
09.04.2024, 21:07
(Dieser Beitrag wurde zuletzt bearbeitet: 09.04.2024, 21:07 von Agriebl.)
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!
... und natürlich ergeben 56 Zeilen auch 56 Spalten... - Sorry dafür.
Beispiel-Datei folgt dann auch am WE!
So, das hat mir ja keine Ruhe gelassen
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!
An die Off-Topic-Schreiber: ![Dodgy Dodgy](https://www.clever-excel-forum.de/images/smilies/dodgy.gif) 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!
26865
Nicht registrierter Gast
(09.04.2024, 21:07)Agriebl schrieb: An die Off-Topic-Schreiber: 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! 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
Folgende(r) 1 Nutzer sagt Danke an Gast für diesen Beitrag:1 Nutzer sagt Danke an Gast für diesen Beitrag 28
• Kl@us-M.
|