Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Anzeige
Inhaltsverzeichnis

Spaltenversatz

Forumthread: Spaltenversatz

Spaltenversatz
21.12.2024 02:18:02
Klaus B aus D
Hallo,

kann mir bitte Jemand erklären, warum es zu einem Spaltenversatz kommt, wenn ich Werte aus einer UserForm in ein Tabellenblatt eintragen möchte?

Userbild
Erläuterung: "txt11" ist der Name des Formular-Textfeldes mit dem Label "NK 1.1".

Private Sub cmdPunkteUebertragen_Click()

' Alternative: Spaltenüberschriften verwenden
Dim wks As Worksheet
Dim rng As Range
Dim hl As String ' HeadLine
Dim nr As Variant

Set wks = Worksheets("Wertungspunkte")
' Ziel-Überschrift
hl = "NK 1.1" ' nur für einen Test

' Zeile mit der eingegebenen StartNr. bestimmen
Set rng = wks.Range("A2:A80").Find(what:=txtStartNr, LookAt:=xlWhole, LookIn:=xlValues)
If rng Is Nothing Then
MsgBox "Es wurde KEINE entsprechende Startnummer gefunden."
Exit Sub
End If

nr = Application.Match(hl, wks.Rows(1), 0) ' Überschriftenzeile durchsuchen ...
If Not IsNumeric(nr) Then
MsgBox "Spaltenüberschrift mit Suchtext nicht gefunden!", vbInformation
Exit Sub
Else
' ... und Ergebnis der Spaltennummer (numerischer Wert) ausgeben
'MsgBox "Für die StartNr. " & rng & " soll der Wert eingetragen werden."
MsgBox "Es wurde Spalte " & nr & " gefunden."

rng.Offset(0, nr - 1) = CLng(txt11) ' -1 ist erforderlich, um Spaltenversatz zu verhindern !?
End If
End Sub

Obwohl mir die Variable "nr" die richtige Spaltennummer (5) für die gesuchte Überschrift "NK 1.1" vorgibt, muss ich die Spaltennummer "nr" um 1 reduzieren, damit der Eintrag aus der UserForm1 im richtigen Tabellenfeld landet.
Wo ist mein Gedankenfehler in der "Offset" Funktion?

Gruß Klaus
Anzeige

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Spaltenversatz
21.12.2024 06:49:23
RPP63
Moin!
Um von Spalte A (=1) zu Spalte 5 zu gelangen, braucht man den Versatz (Offset) von 5-1=4 Spalten.
Wenn Du nr unbedingt direkt verwursten willst, dann so:
Range(rng.Row, nr) = CLng(txt11)

Gruß Ralf
AW: Spaltenversatz
21.12.2024 14:01:52
Klaus B aus D
Hallo Gerd, hallo Ralf,

eure Antworten ähneln irgendwie einem Tennis-Match und zeigen mir, dass es nicht nur DIE EINE Problemlösung gibt.
Die 1. Antwort von Ralf zeigt einen Laufzeitfehler ‚1004‘: „Die Methode ‚Range‘ für das Objekt ‚_Global‘ ist fehlgeschlagen.“
Das hat Gerd mit der Antwort #2 bereits gerade gerückt.
Die weiteren Vorschläge lösen das angefragte "Problem" in korrekter Weise. Einzig bei der kürzesten Zeile von Gerd
rng(1, nr) = CLng(txt11)
bleibe ich gedanklich stecken - doch sie funktioniert ja.
Danke an euch beiden.

Jetzt benötige ich noch eine Unterstützung für einen Schleifendurchlauf der Textfeldbezeichnungen im Formular als aufrufbare Sub-Routine mit Parameterübergabe. Zum Leeren von 9 x 4 Textfeldern habe ich bereits diesen Programmablauf "gebastelt":
Private Sub cmdFelderLeeren_Click()

' txt11 = ""
' txt12 = ""
' txt13 = ""
' txt14 = ""
' ...
' Alternative (um weniger Code schreiben zu müssen)
Dim z As Integer ' "Zehner"
Dim e As Integer ' "Einer"
For z = 1 To 9
For e = 1 To 4
UserForm1.Controls("txt" & z & e).Value = ""
Next e
Next z
End Sub

Um unnötige Programmzeilen zu vermeiden, würde ich denselben Schleifendurchlauf gerne nutzen, um nicht nur die Felder zu leeren, sondern auch um die modifizierten Inhalte in die zugehörige Tabelle zu übertragen (s. Ursprungscode dieses Threads). Für den 2. Fall muss ich dann noch den Zusammenhang von z. B. "txt32" zur Spalte mit der Überschrift "NK 3.2" herstellen.

Gruß Klaus
Anzeige
AW: Spaltenversatz
22.12.2024 12:14:23
Piet
Hallo Klaus

Gerd - Hut ab vor deiner Lösung, da wollte ich gerade auch eine ins Forum stellen, aber deine ist BESSER!

Die Function basiert offenbar auf dem Unterschied zwischen Cells(1, 1) und Offset(0, 0)!
rng.Cells(1, nr) = CLng(txt11) - müsste dasselbe Ergebnis wie bei Gerd bringen, seine Syntac ist aber kürzer!

Am Anfang tut man sich schwer den Unterschied zwischen Cells und Offset zu begreifen. Cells = Cells(z, s)
Ich verwende abwechselnd die eine eine oder andere Version, um das dumme -1 zu vermeiden!
Probiere es mit Range(xx).Offset(0, 1) und Range.Cells(1, 2) aus. So lernst du am schnellsten VBA.

mfg Piet

Frohe Weihnachten für alle Kollegen und Klaus aus Izmir ....
Anzeige
AW: Spaltenversatz
21.12.2024 07:10:01
GerdL
Guten Morgen,

die Alternative ist:
Cells(rng.Row, nr) = CLng(txt11)

Gruß Gerd
AW: Spaltenversatz
21.12.2024 08:09:29
RPP63
Du hast natürlich Recht, Gerd!
Noch ein wenig Erklärbär für den Threadersteller:
.Offset ist Null-, .Resize ist Eins-basiert.
Deshalb ginge (augenzwinkernd) auch folgendes, um nr nicht umrechnen zu müssen:
Cells(rng.Row, "A").Resize(1, nr).Cells(nr) = CLng(txt11)

Gruß Ralf
Anzeige
AW: Spaltenversatz
21.12.2024 09:01:31
GerdL
Moin Ralf!
Weihnachtszeit; Zeit mit den Basics zu basteln!
Columns(nr).Cells(rng.Row) = CLng(txt11)

.... ist nicht so anstrengend. :-)

Gruß Gerd
Weil es Spaß macht ;-)
21.12.2024 09:21:11
RPP63
rng.EntireRow.Cells(nr) = CLng(txt11)
AW: Ja doch ;-)
21.12.2024 09:49:35
GerdL
Rng(1, nr) = CLng(txt11)

Anzeige
Anzeige
Anzeige
Live-Forum - Die aktuellen Beiträge
Datum
Titel
14.05.2026 13:31:09
14.05.2026 09:50:42
13.05.2026 19:14:18