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

Forumthread: VBA-Code Spalte einfügen

VBA-Code Spalte einfügen
01.12.2021 11:56:03
Hannes
Hallo zusammen,
folgendes Problem: Wenn ich manuell eine neue Spalte einfüge erhalte ich die Fehlermeldung Laufzeitfehler 13: Typen unverträglich...Gelb markiert wird folgende Zeile:
If Not TargetOldText = "" And Not Target.Value = "" Then
nach debuggen klappt es zwar wieder, aber wenn ich die spalte direkt vor eine beschriebene spalte einfüge ist die neue spalte von dem Code betroffen (es bleiben also in meinem Fall die Spalten 3,5 to7) ich würde aber gerne, dass sich der code/die neue Spalte entsprechend anpasst.
Beispiel ich füge die Spalte vor 3 ein, dann müsste der code entsprechend heißen 4,6-8....ist das automatisiert irgendwie möglich?
Mein Code lautet:
Option Explicit
Dim blockedEvent As Boolean
Dim TargetOldText As String

Private Sub Worksheet_Change(ByVal Target As Range)
Select Case Target.Column
Case 3, 5 To 7 'Spalten C, E bis G
If Not blockedEvent Then
blockedEvent = True
If Not TargetOldText = "" And Not Target.Value = "" Then
Target.Value = TargetOldText & ", " & Target.Value
Else
Target.Value = Target.Value
End If
TargetOldText = Target.Value
Else
blockedEvent = False
End If
Case Else
TargetOldText = ""
End Select
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
On Error Resume Next
Select Case Target.Column
Case 3, 5 To 7 'Spalten C, E bis G
TargetOldText = Target.Value
Case Else
'do nothing
End Select
End Sub
Anzeige

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA-Code Spalte einfügen
01.12.2021 12:36:45
Rudi
Hallo,
Target ist die ganze Spalte. .Value mehrerer Zellen schlägt nun mal fehl.
Füge noch die Abfrage nach nur einer geänderten Zelle ein.
If Target.count=1 Then ....
Gruß
Rudi
AW: VBA-Code Spalte einfügen
01.12.2021 12:37:31
Tobias
Hallo Hannes,
du könntest den Spalten Namen zuweisen, dann nimmt Excel die automatisch mit! Denke das ist die einfachste Möglichkeit. Dann über ein Intersect prüfen ob das target im benannten Bereich liegt!

=Tabelle1!$C:$C;Tabelle1!$E:$E;Tabelle1!$F:$F
Müsste dann der Code in ähnlicher Form für den Namen sein
Schöne Grüße
Tobias
Anzeige
AW: VBA-Code Spalte einfügen
01.12.2021 12:41:18
{Boris}
Hi,
beim Einfügen von Spalten hat Target 1.048.576 Elemente - und die kannst Du nicht mit Target.Value vergleichen.
Am Einfachsten: Zu Beginn des Codes auf Target.Count abfragen - ist der Wert größer 1: Exit Sub
Zu Deiner 2. Frage:
Du darfst die Spalten halt nicht fest im Code verdrahten (3,5,7). Entweder lassen sich die gewünschten Spalten z.B. per eindeutigen Spaltenüberschriften dynamisch ermitteln, oder Du änderst sie halt stets manuell, oder Du packst sie in einen String, den Du dann änderst / erweiterst, nach diesem Muster:

Private Sub Worksheet_Change(ByVal Target As Range)
Const strSPALTEN As String = "3,5,7,"
If InStr(1, strSPALTEN, Target.Column & ",") = 0 Then Exit Sub
'hier Dein weiterer Code
End Sub
VG, Boris
Anzeige
AW: VBA-Code Spalte einfügen
01.12.2021 13:39:24
Hannes
Hallo verstehe ich das richtig, dass dieser code klappen müsste? Ich erhalte den Fehler Case else außerhalb von select case.
Option Explicit
Dim blockedEvent As Boolean
Dim TargetOldText As String

Private Sub Worksheet_Change(ByVal Target As Range)
Const strSPALTEN As String = "3,5,7,"
If InStr(1, strSPALTEN, Target.Column & ",") = 0 Then Exit Sub
If Not blockedEvent Then
blockedEvent = True
If Not TargetOldText = "" And Not Target.Value = "" Then
Target.Value = TargetOldText & ", " & Target.Value
Else
Target.Value = Target.Value
End If
TargetOldText = Target.Value
Else
blockedEvent = False
End If
Case Else
TargetOldText = ""
End Select
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
On Error Resume Next
Select Case Target.Column
Case 3, 5 To 7 'Spalten C, E bis G
TargetOldText = Target.Value
Case Else
'do nothing
End Select
End Sub

Anzeige
AW: VBA-Code Spalte einfügen
01.12.2021 13:49:49
Rudi
du hast ja auch kein Select Case im Code.

Private Sub Worksheet_Change(ByVal Target As Range)
Const strSPALTEN As String = "3,5,7,"
If InStr(1, strSPALTEN, Target.Column & ",") = 0 Then
Exit Sub
Else
If Not blockedEvent Then
blockedEvent = True
If Not TargetOldText = "" And Not Target.Value = "" Then
Target.Value = TargetOldText & ", " & Target.Value
Else
Target.Value = Target.Value
End If
TargetOldText = Target.Value
Else
blockedEvent = False
End If
Else
TargetOldText = ""
End if
End Sub

Anzeige
AW: VBA-Code Spalte einfügen
01.12.2021 13:57:04
Hannes
Hi, ich muss nochmal stören...jetzt sagt er Fehler beim komprimieren wegen Else ohne If am ende.
Danke für deine Hilfe!
Option Explicit
Dim blockedEvent As Boolean
Dim TargetOldText As String

Private Sub Worksheet_Change(ByVal Target As Range)
Const strSPALTEN As String = "3,5,7,"
If InStr(1, strSPALTEN, Target.Column & ",") = 0 Then
Exit Sub
Else
If Not blockedEvent Then
blockedEvent = True
If Not TargetOldText = "" And Not Target.Value = "" Then
Target.Value = TargetOldText & ", " & Target.Value
Else
Target.Value = Target.Value
End If
TargetOldText = Target.Value
Else
blockedEvent = False
End If
 Else
TargetOldText = ""
End If
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
On Error Resume Next
Select Case Target.Column
Case 3, 5 To 7 'Spalten C, E bis G
TargetOldText = Target.Value
Case Else
'do nothing
End Select
End Sub

Anzeige
AW: VBA-Code Spalte einfügen
01.12.2021 14:16:10
Rudi

Dim blockedEvent As Boolean
Dim TargetOldText As String
Private Sub Worksheet_Change(ByVal Target As Range)
Const strSPALTEN As String = "3,5,7,"
If InStr(1, strSPALTEN, Target.Column & ",")  0 Then
If Not blockedEvent Then
blockedEvent = True
If Not TargetOldText = "" And Not Target.Value = "" Then
Target.Value = TargetOldText & ", " & Target.Value
Else
Target.Value = Target.Value
End If
TargetOldText = Target.Value
Else
blockedEvent = False
End If
Else
TargetOldText = ""
End If
End Sub

Anzeige
zum 2.Teil
01.12.2021 13:21:38
Rudi
Du könntest auch die Überschriften in Zeile 1 abfragen.
Schema:

If Target.Count = 1 Then
Select Case Cells(1, Target.Column)
Case "Spalte3", "Spalte5", "Spalte6", "Spalte7" 'Überschriften anpassen
If Not blockedEvent Then
Gruß
Rudi
AW: zum 2.Teil
01.12.2021 17:06:29
Hannes
Hi, leider komme ich mit diesem code immer noch nicht weiter:
Dim blockedEvent As Boolean
Dim TargetOldText As String

Private Sub Worksheet_Change(ByVal Target As Range)
Const strSPALTEN As String = "3,5,7,"
If InStr(1, strSPALTEN, Target.Column & ",")  0 Then
If Not blockedEvent Then
blockedEvent = True
If Not TargetOldText = "" And Not Target.Value = "" Then
Target.Value = TargetOldText & ", " & Target.Value
Else
Target.Value = Target.Value
End If
TargetOldText = Target.Value
Else
blockedEvent = False
End If
Else
TargetOldText = ""
End If
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
On Error Resume Next
Select Case Target.Column
Case 3, 5 To 7 'Spalten C, E bis G
TargetOldText = Target.Value
Case Else
'do nothing
End Select
End Sub
Ich erhalte nach einfügen einer neuen Spalte die meldung laufzeitfehler
markiert wird diese zeile: If Not TargetOldText = "" And Not Target.Value = "" Then
die ausführung erfolgt dabei auch immer noch in den (dann neuen) zeilen 3,5,7 und nicht in 4,6,8
Anzeige
meldung laufzeitfehler
02.12.2021 10:16:33
Rudi
du ignorierst ja auch meine Hinweise.
Gruß
Rudi
AW: meldung laufzeitfehler
02.12.2021 11:24:43
Hannes
Moin,
Ich fürchte ich bin zu dämlich um deine Hinweise konkret umzusetzen.
Sobald ich anpassungnen vornehme erhalte ich immer Fehlermeldungen....
Ich besitze einfach nicht die besten VBA Kenntnisse.
AW: meldung laufzeitfehler
02.12.2021 11:28:57
Hannes
Habe mittlerwile diese Formel aus dem Internet.
Allerdings bin ich auch da zu blöd um es einfach auf alle Zellen in meiner Mappe zu beziehen. (Also nicht nur Spalte 71) Hat da jemden eine Lösung, wie der code umgeschrieben werden muss?
Und Ich erhalte des öfteren den Laufzeitfehler 13: Typen unverträglich und diese Zeile im Code ist gelb markiert strTarget = Trim(Target.Value
Nach debuggen läuft es dann wieder.
Const TargetColumn As Long = 71 ' Ziele in Spalte 71.
Const bolSorted As Boolean = True ' Legt fest, ob die Werte noch sortiert werden.
Dim blockedEvent As Boolean
Dim TargetOldText As String

Private Sub Worksheet_Change(ByVal Target As Range)
Dim strResult As String
Dim strTarget As String
Dim arrSorted As Variant
Dim i As Long
If Target.Column = TargetColumn Then
  strTarget = Trim(Target.Value)
If Not blockedEvent Then
blockedEvent = True
If Not TargetOldText = "" And Not Target.Value = "" Then
If InStr(1, TargetOldText, Target.Value) > 0 Then
strResult = Replace(TargetOldText, ", " & strTarget, "")
strResult = Replace(strResult, strTarget & ", ", "")
strResult = Replace(strResult, strTarget, "")
Else
strResult = TargetOldText & ", " & Target.Value
End If
If bolSorted Then
arrSorted = Split(strResult, ", ")
strResult = ""
Call Selectionsort(arrSorted)
For i = 0 To UBound(arrSorted)
strResult = strResult & arrSorted(i) & ", "
Next i
If Len(strResult) > 1 Then _
strResult = Left$(strResult, Len(strResult) - 2)
End If
Target.Value = strResult
Else
Target.Value = Target.Value
End If
TargetOldText = Target.Value
Else
blockedEvent = False
End If
Else
TargetOldText = ""
End If
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
On Error Resume Next
If Target.Column = TargetColumn Then
TargetOldText = Target.Value
End If
[TargetZeile] = Target.Row
[TargetSpalte] = Target.Column
[TargetValue] = Target.Value
End Sub

Private Sub Selectionsort(ByRef data As Variant)
Dim OG&, i&, j&, k&, h As Variant
OG = UBound(data)
For i = 0 To OG - 1
h = data(i)
k = i
For j = i + 1 To OG
If data(j) 

Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige

Infobox / Tutorial

VBA-Code zum Einfügen von Spalten in Excel


Schritt-für-Schritt-Anleitung

Um einen VBA-Code zu erstellen, der automatisch Spalten in Excel einfügt und dabei bestimmte Bedingungen beachtet, folge diesen Schritten:

  1. Öffne den VBA-Editor: Drücke ALT + F11, um den Visual Basic for Applications (VBA)-Editor zu öffnen.

  2. Füge ein neues Modul hinzu: Rechtsklicke auf "VBAProject (DeineMappe)", wähle "Einfügen" und dann "Modul".

  3. Kopiere und füge den folgenden Code ein:

    Dim blockedEvent As Boolean
    Dim TargetOldText As String
    
    Private Sub Worksheet_Change(ByVal Target As Range)
       Const strSPALTEN As String = "3,5,7,"
       If InStr(1, strSPALTEN, Target.Column & ",") = 0 Then Exit Sub
       If Not blockedEvent Then
           blockedEvent = True
           If Not TargetOldText = "" And Not Target.Value = "" Then
               Target.Value = TargetOldText & ", " & Target.Value
           End If
           TargetOldText = Target.Value
       Else
           blockedEvent = False
       End If
    End Sub
    
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
       On Error Resume Next
       If Target.Column = 3 Or Target.Column = 5 Or Target.Column = 6 Or Target.Column = 7 Then
           TargetOldText = Target.Value
       End If
    End Sub
  4. Speichere die Änderungen und schließe den VBA-Editor.


Häufige Fehler und Lösungen

  • Laufzeitfehler 13: Typen unverträglich: Dieser Fehler tritt häufig auf, wenn der Code versucht, mit einem Range-Objekt zu arbeiten, das mehr als eine Zelle umfasst. Achte darauf, nur mit einer einzelnen Zelle zu arbeiten:

    If Target.Count = 1 Then
      ' Dein Code hier
    End If
  • Fehler beim Kompilieren: Überprüfe, ob alle If- und Else-Anweisungen korrekt geschachtelt sind. Ein fehlendes End If kann zu Fehlern führen.


Alternative Methoden

Eine alternative Methode zum Einfügen von Spalten könnte die Verwendung von Excel-Funktionen statt VBA sein. Du kannst Spalten dynamisch benennen und dann mit INTERSECT prüfen, ob die Änderungen in den gewünschten Bereichen liegen. Hier ein Beispiel:

If Not Intersect(Target, Range("C:C, E:E, F:F")) Is Nothing Then
    ' Deine Logik hier
End If

Praktische Beispiele

Nehmen wir an, du möchtest eine neue Spalte vor Spalte C einfügen. Der folgende Code zeigt, wie du dies tun kannst:

Sub InsertColumnBeforeC()
    Columns("C:C").Insert Shift:=xlToRight
End Sub

Diese Methode ist nützlich, wenn du die Struktur deiner Tabelle dynamisch anpassen möchtest.


Tipps für Profis

  • Verwende Konstanten: Definiere häufig verwendete Werte als Konstanten, um die Lesbarkeit deines Codes zu erhöhen.
  • Fehlerbehandlung: Implementiere eine solide Fehlerbehandlung, um unvorhergesehene Probleme abzufangen. Nutze On Error Resume Next mit Bedacht.

    On Error GoTo ErrorHandler
    ' Dein Code hier
    Exit Sub
    
    ErrorHandler:
      MsgBox "Ein Fehler ist aufgetreten: " & Err.Description

FAQ: Häufige Fragen

1. Wie kann ich sicherstellen, dass der Code nur für eine Zelle ausgeführt wird?
Durch die Verwendung der Abfrage If Target.Count = 1 Then kannst du sicherstellen, dass der Code nur ausgeführt wird, wenn eine Zelle geändert wurde.

2. Ist es notwendig, den VBA-Editor zu öffnen, um den Code zu ändern?
Ja, um den VBA-Code zu ändern, musst du den VBA-Editor öffnen und die entsprechenden Module anpassen.

3. Wie kann ich mehrere Spalten dynamisch verwalten?
Verwende ein String-Array, um die Spaltenüberschriften zu speichern und dynamisch darauf zuzugreifen, anstatt die Spaltennummern fest im Code zu verankern.

Mit diesen Anleitungen und Tipps bist du gut gerüstet, um mit VBA Spalten in Excel effizient zu verwalten!

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige