Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1588to1592
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
Namensfelder-Zeilenexport in neue Tabelle
27.10.2017 12:37:25
Markus
Hallo,
erstmal recht herzlichen Dank an yummi und Christian die mir bei den Namensfeldern sehr weitergeholfen hatten. Anmerkung an Christian: Deinen Code konnte ich Ansatzweise schon nachvollziehen)
https://www.herber.de/cgi-bin/callthread.pl?index=1585295#1585295
Zu Punkt 2 mit dem suchen und Ersetzen: dies habe ich händig vorgenommen und bin damit nun durch.
Jedoch habe ich nun noch ein Problem beim Export der Namensfelder und zwar nur der Zeilen die in der Tabelle beschrieben bzw. gefüllt sind.
Folgender Code funktioniert bei normalen Zellen:

Sub Makro1()
Dim Zeile As Long
Dim ZeileMax As Long
Dim n As Long
With Tabelle1
ZeileMax = .UsedRange.Rows.Count
'ZeileMax = .RefersToRange.Value.Rows.Count
n = 1
For Zeile = 2 To ZeileMax
If .Cells(Zeile, 3).Value = "" Then
'If .Cells(Zeile, 3).RefersToRange.Value = "" Then
.Rows(Zeile).Copy Destination:=Tabelle3.Rows(n)
n = n + 1
End If
Next Zeile
End With
End Sub

jedoch bei Namensfeldern kommt dann ein Fehler:
Laufzeitfehler 424:
Objekt erforderlich.
Soll heißen die Tabelle wird nicht exportiert.
Nun mein Problem: Wie bekommt man diesen Export bei Namensfeldern hin also Objekten? Normale Zellen funktionieren gut, aber dort bei den Namensfeldern wo ich es benötige halt nicht.
PS: Bei dem Spaltenproblem hängt es auch noch, das man als wählen kann welche Spalten man befüllen kann (nicht aber unbedingt hintereinander (siehe Punkt 3 von der verlinkten Seite. https://www.herber.de/cgi-bin/callthread.pl?index=1585295#1585295
Hoffe mir kann jemand bei den zwei Problemen auch weiterhelfen die noch bestehen.
Gruß
Markus

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Namensfelder-Zeilenexport in neue Tabelle
28.10.2017 12:22:12
fcs
Hallo Markus,
bei Zellen mit Namen musst du eigentlich den Namen (ohne Zählnummer) angeben und dann kann man die Namen in einer Schleife abarbeiten.
Allerdings verstehe ich den Sinn -besser Unsinn- nicht, warum du einen großen Zellbereich mit Namen zupflasterst. Excel hat Grenzen bei verschiedensten Werten - meines Wissens gibt es auch eine Grenze bei der Anzahl Namen je Blatt/Datei. Dadurch auch deine früheren Probleme beim Zuweisen der Namen.
Das kann man mit Sicherheit eleganter lösen, wenn man sehr viele genauer wüsste, was du eigentlich machen und erreichen willst.
Zum selektiven Kopieren von Spalten eines selektierten Zellbereichs hab ich die auch etwas gebastelt.
Dieses Makro musst du starten nachdem du die zu kopierenden Zellen selektiert hast.
Gruß
Franz
Sub Zellen_mit_Name_pruefen()
Dim Zeile As Long
Dim ZeileMax As Long
Dim n As Long
Dim sName As String
Dim objRange As Object
On Error GoTo Fehler
Eingabe:
sName = InputBox("Zu durchender Namensbereich (ohne Zählnummer eingeben!)", _
"Zeilen mit leerer Zelle kopieren", "Albert")
If sName = "" Then Exit Sub 'Abbrechen gewählt
With Tabelle1
'Prüfen ob Name im Blatt definiert ist
If fncChecknameSheet(ThisWorkbook.Worksheets(.Name), sName & "1") = True Then
Set objName = ThisWorkbook.Worksheets(.Name)
'Prüfen ob Name im aktiven Workbook definiert ist
ElseIf fncChecknameApplication(sName & "1") = True Then
Set objName = Application
Else
MsgBox "Name """ & sName & "1 "" existiert nicht. Bitte vorhandenen Namen " _
& "wählen!", _
vbOKOnly + vbInformation, "Zellen mit Namen prüfen"
GoTo Eingabe
End If
ZeileMax = .UsedRange.Rows.Count 'ggf. Zähler fest vorgeben entsprechend Anzahl Namen- _
Nummern
n = 1
For Zeile = 1 To ZeileMax
If objName.Range(sName & Zeile).Value = "" Then
objName.Range(sName & Zeile).EntireRow.Copy Destination:=Tabelle3.Rows(n)
n = n + 1
End If
Resume_NextZeile:
Next Zeile
End With
Fehler:
With Err
Select Case .Number
Case 0 'alles OK
Case 1004
'Name in Namensliste nicht gefunden
Resume Resume_NextZeile
Case Else
MsgBox "Fehler-Nr.: " & .Number & vbLf & .Description
End Select
End With
End Sub
Function fncChecknameSheet(wks As Worksheet, sName As String) As Boolean
Dim rngTest As Range
On Error GoTo Fehler
fncCheckname = False
Set rngTest = wks.Range(sName)
fncChecknameSheet = True
Exit Function
Fehler:
End Function
Function fncChecknameApplication(sName As String) As Boolean
Dim rngTest As Range
On Error GoTo Fehler
fncCheckname = False
Set rngTest = Application.Range(sName)
fncChecknameApplication = True
Exit Function
Fehler:
End Function
'Makro zum selektiven Kopieren von Spalten
Sub Kopieren_selektiv_einfuegen()
Dim rngCopy As Range
Dim rngTarget As Range
Dim strReihenfolge
Dim arrRF, intRF
On Error GoTo Fehler
Set rngCopy = Selection
EingabeReihenfolge:
strReihenfolge = InputBox("Bitte Nummern der zu kopierenden Spalten in der " _
& "gewünschten Reihenfolge eingeben, getrennt durch Semikolon" & vbLf _
& "Anzahl Spalten im Bereich: " & rngCopy.Columns.Count, _
"Spalten selektiv kopieren", "2;4")
If strReihenfolge = "" Then Exit Sub
arrRF = Split(strReihenfolge, ";")
'Prüfen ob Auswahl der Spalten korrekt
For intRF = LBound(arrRF) To UBound(arrRF)
If Val(Trim(arrRF(intRF)))  rngCopy.Columns.Count Then
MsgBox "Eingegebene Werte sind Text, Anzahl Spalten im selekierten " _
& "Bereich!", _
vbOKOnly + vbInformation, "Spalten selektiv kopieren"
GoTo EingabeReihenfolge
End If
Next
Auswahl_Zielzelle:
Set rngTarget = Application.InputBox( _
"Bitte linke obere Zelle auf dem Ziel-Tabellenblatt wählen, ab der eingefügt "_
& "werden soll.", _
"Spalten selektiv kopieren", Type:=8)
If rngCopy.Rows.Count = rngCopy.Parent.Rows.Count And rngTarget.Row > 1 Then
MsgBox "Wenn ganze Spalten kopiert werden sollen, dann muss die Zielzelle " _
& "in der 1. Zeile gewählt werden!", _
vbOKOnly + vbInformation, "Spalten selektiv kopieren"
GoTo Auswahl_Zielzelle
ElseIf rngCopy.Rows.Count + rngTarget.Row - 1 > rngTarget.Parent.Rows.Count Then
MsgBox "Selektierter Zellbereich hat zuviele Zeilen, um diesen ab der Zielzelle " _
& "einzufügen!" & vbLf _
& "Zielzelle muss oberhalb von Zeile " & rngTarget.Parent.Rows.Count _
- rngCopy.Rows.Count + 2 & " gewählt werden!", _
vbOKOnly + vbInformation, "Spalten selektiv kopieren"
GoTo Auswahl_Zielzelle
End If
For intRF = LBound(arrRF) To UBound(arrRF)
rngCopy.Columns(Val(arrRF(intRF))).Copy Destination:=rngTarget.Offset(0, intRF)
Next
rngTarget.Parent.Activate
Fehler:
With Err
Select Case .Number
Case 0 ' alles OK
Case 424
'Zellauswahl in Inputbox wurde abgebrochen
Case Else
MsgBox "Fehler-Nr.: " & .Number & vbLf & .Description
End Select
End With
End Sub

Anzeige
AW: Namensfelder-Zeilenexport in neue Tabelle
01.11.2017 13:30:30
Markus
Hallo Franz, vielen Dank erstmal :)
Doch bei den Namensfeldern kommt bei mir immer folgender Fehler:
Laufzeitfehler 424
Objekt erforderlich
Er springt in folgende Zeile die gelb unterlegt ist im Debugger
If fncChecknameSheet(ThisWorkbook.Worksheets(.Name), sName & "1") = True Then
Frage: Was bedeutet eigentlich die "1" bzw. was tut sie warum ist sie vorhanden?
Im Namensfeld sind aber die Namen korrekt definiert bei mir und werden auch angezeigt links oben.
Doch wenn ich jetzt zum Beispiel Berta eingebe (ohne fortlaufende Nummer) kommt dieser Laufzeitfehler, ob an es die Spalte mit den Namen Berta1 bis etwa 2300 gibt. Ach wenn ich mal Berta mit fortlaufender Nummer eingegeben Also Berta1 kommt dieser Fehler.
Eigentlich brauchte ich auch gar nicht die Namenseingabe (die sich ja nach Spaltennamen richtet), mir ging es eher darum das er die Zeilen kopiert die befüllt bzw. wo Schaltflächen drauf liegen und die ganzen Leerzeilen die nach der Tabelle kommen und für die auch Namensfelder vorliegen nicht mit kopiert bzw. exportiert. Das also nur die Zeilen genommen werden die befüllt mit Daten oder wo Schaltflächen drauf liegen.
Wie gesagt egal was ich mache, immer wieder kommt dieser Fehler mit "Objekt erforderlich". Dabei habe ich das „Albert“, schon durch „Berta“ ersetzt im Code, brachte aber auch nichts.
"Zeilen mit leerer Zelle kopieren", "Albert") geändert in "Zeilen mit leerer Zelle kopieren", "Berta")
Ich hatte alles erst in ein Modul eingefügt und als das nicht ging direkt in die Arbeitsmappe, aber immer das Selbe Ergebnis das ein Objekt erforderlich sei.
Den Fehler verursacht diese Funktion höchstwahrscheinlich: fncChecknameSheet
Ziel ist es später mal diesen Inhalt in folgender Form zu übergeben:
Dim vntBlattName As Variant
Dim strPfad As String
Dim wbkZiel As Workbook
Workbooks(1).Activate
sPath = fname
strWkbName = ActiveWorkbook.Name

vntBlattName = Array("Tabelle1")
hier soll dann nicht die ganze Tabelle 1 sondern nur der Teil in das neue Workbook kopiert werden wo die Zeilen befühlt sind bzw. wo Schaltflächen auf den Zellen liegen mit Makros dahinter.
Bisher ist es so, dass das ganze Blatt kopiert wird mit allen Namensfeldern die angelegt wurden (in der Vorlage), was ich aber nicht brauche, sondern es varriert immer mal wie viel Zeilen ich benötige. Von 120 bis 2400 in etwa. Daher der Schritt dass man nur die befühlten und mit Schaltflächen versehenen Zeilen kopiert und nicht das ganze Tabellenblatt.
Wie also müsste ich dann zum Ende diese Zeile: vntBlattName = Array("Tabelle1")
anpassen an die Zellen_mit_Name_pruefen() -Prozedur?
Weiter im Code:
Set wbkZiel = Workbooks(2)
'Sheets(vntBlattName).Copy Before:=wbkZiel.Sheets(wbkZiel.Sheets.Count)
Sheets(vntBlattName).Copy Before:=wbkZiel.Sheets(1)
Workbooks(2).Activate
'MsgBox Sheets(vntBlattName).Copy
'MsgBox "Ergebnis" & "" & ActiveWorkbook & sPath & strWkbName
ActiveWorkbook.SaveAs sPath & strWkbName, FileFormat:=52
'ActiveWorkbook.Close
End Sub

Warum das Ganze: Nun das lag daran das ich Zeilen einfügen muss ab und an und sich dann die Makros nicht änderten, mit den Namen allerdings klappt es prima nachdem ich die Makros auch darauf ausgerichtet hatte. Soll heißen ich kann es beliebig verändern ohne dass es mir alles durcheinander würfelt. Ich brauchte aber keine Namensbereiche sondern wirklich die Namensfelder.
Bei dem selektivem Kopieren von Spalten funktioniert es zumindest bei mir auch auf Anhieb :)
Es sollte am Ende so sein, das man die Spalten wählt und diese automatisch übertragen werden in die Zieltabelle, also ich denke man braucht da noch eine Art Schleife, aber sonst funktioniert es bei mir schon.
Zum Beispiel möchte ich einen bestimmten selektierten Inhalt der Tabelle 1 mit Spalte C8:C20 in die Tabelle 2 für die Spalte E30:E43 einfügen, nur als Beispiel. Dabei kann es halt vorkommen dass von der Ausgangstabelle nicht alle Spalten übernommen werden sollen, aber in der Zieltabelle alle die gewählt wurden hintereinander stehen sollen. Dies soll dann für viele Spalten in einem Schritt passieren wo es automatisch eingefügt wird über eine Schaltfläche. Wie eine Makroaufzeichnung quasi, wo man selektiert und dann alles eingetragen wird nur das man jetzt die Spalten wählen kann die man benötigt und diese in die Zieltabelle dann nacheinander eingetragen werden.
Gruß
Markus
Anzeige
AW: Namensfelder-Zeilenexport in neue Tabelle
01.11.2017 16:10:10
Markus
Nachtrag:
Öfters kommt jetzt folgender Fehler, wenn mal nicht der Ojektfehler kommt:
Die Methode Range für das Objekt Range ist fehlgeschlagen
Set rngTest = wks.Range(sName)

Nehme ich die raus, hängt es wieder an dieser Zeile:
If objName.Range(sName & Zeile).Value = "" Then

Er schreibt jedenfalls nichts in die Destination Tabelle hinein.
Gruß
Marcus
AW: Namensfelder-Zeilenexport in neue Tabelle
01.11.2017 16:44:21
Markus
Nachtrag:
Öfters kommt jetzt folgender Fehler, wenn mal nicht der Ojektfehler kommt:
Die Methode Range für das Objekt Range ist fehlgeschlagen
Set rngTest = wks.Range(sName)

Nehme ich die raus, hängt es wieder an dieser Zeile:
If objName.Range(sName & Zeile).Value = "" Then

Er schreibt jedenfalls nichts in die Destination Tabelle hinein.
Gruß
Marcus
Anzeige
AW: Namensfelder-Zeilenexport in neue Tabelle
01.11.2017 16:51:52
Markus
Bei If objName.Range(sName & Zeile).Value = "" Then
kommt dann noch folgender Fehler:
Laufzeitfehler 1004
Anwendungs- oder objektdefinierter Fehler.
und wenn ich das rausnehme hängt er bei:
objName.Range(sName & Zeile).EntireRow.Copy Destination:=Tabelle6.Rows(n)
Objekt erforderlich
Gruß
Markus

301 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige