Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
24.04.2024 17:19:09
Anzeige
Archiv - Navigation
1772to1776
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
Inhaltsverzeichnis

getObject Zeile auf Inhalt überprüfen

getObject Zeile auf Inhalt überprüfen
29.07.2020 11:12:36
Henry
Hallo Zusammen,
wiedereinmal bin ich auf eure Hilfe angewiesen:
Mein Makro soll für das Speichern eines Prüfprotokolls einen Namen vorschlagen und nach dem Speichervorgang bestimmte Werte in eine andere Tabelle (fungiert als Datenbank für die gemessenen Werte) abspeichern.
Nun soll geprüft werden, ob bei einem vorherigen Speichervorgang schon Werte eingetragen wurden. Hierfür soll in der Datenbank "test.xlsm" nach dem Dateinamen der Datei vor dem aktuellen Speichern "alter_name" gesucht werden und sämtliche Zeilen welche ihn beinhalten gelöscht werden. Anschließend werden die neuen Daten wieder in die Datenbank eingetragen.
Vorab schon einmal ein Danke für eure Hilfe
Problem:
Die Datenbank wird zwar geöffnet und durchsucht aber es wird nie etwas
gefunden, obwohl der Dateiname vorhanden ist.
Wird nur der folgende Teil des gesamten Codes ausgeführt funktioniert es

Sub test()
Dim RaFound As Range
Zieldatei_pfad = "Muster" & "\" 'Pfad in der Ziledatei liegt
Zieldatei = "test.xlsm" 'Bezeichnung Zieldatei in die Hyperlink geschrieben werden soll
'akutellen Name & Pfad speichern
aktueller_pfad = ActiveWorkbook.Path & "\"
aktueller_name = ActiveWorkbook.Name
alter_name = Range("AG1")
'Zieldatei öffnen, durchsuchen
GetObject (Zieldatei_pfad & Zieldatei)
Application.AskToUpdateLinks = False
GetObject (Zieldatei_pfad & Zieldatei)
With Worksheets("Tabelle1").Columns(14)
Set RaFound = .Cells.Find(alter_name, , , xlWhole, , xlNext)
If Not RaFound Is Nothing Then
Rows(RaFound.Row).Delete
Do
Set RaFound = .Cells.Find(alter_name, , , xlWhole, , xlNext)
If RaFound Is Nothing Then Exit Do
Rows(RaFound.Row).Delete
Loop
End If
End With
Set RaFound = Nothing
End Sub
Hier der vollständige Code:

Global speichern_gedrückt As Boolean
Global speichern_abgebrochen As Boolean
Sub speichern()
Dim aktueller_pfad As String
Dim aktueller_name As String
Dim Zieldatei_pfad As String
Dim Zieldatei As String
Dim Lrow As Long
Dim i As Integer
Dim j As Integer
Dim k As Integer
j = Range("AC2")
k = Range("AD2")
i = 21 + 2 * j
'Felder für Dateinamenvorschlag definieren
Lab_nummer = Range("J6")
Datum = Range("j8")
Bearbeiter = Range("j10")
Lieferant = Range("J12")
If Range("AD1") = "Wahr" Then
Messbericht = "vorhanden"
Else
Messbericht = "nicht vorhanden"
End If
Bewertung = Range("AF2")
speichern_gedrückt = True
'Dateinamen vorschlagen
If Lab_nummer = False Or Datum = False Or Bearbeiter = False Then
userResponce = Application.Dialogs(xlDialogSaveAs).Show
Else
userResponce = Application.Dialogs(xlDialogSaveAs).Show(Lab_nummer & Format("-") _
& Cells(i, 3) & Format("-") _
& Cells(i, 4) & Format("-") _
& Cells(i, 5) & Format("-") _
& Cells(i, 6) & Format("-") _
& Datum)
End If
'Überprüfen ob Abbrechen gedrückt wurde, falls Ja Code beenden
If userResponce = False Then
GoTo ende
End If
Application.ScreenUpdating = False
Zieldatei_pfad = "Muster" 'Pfad in der Ziledatei liegt
Zieldatei = "test.xlsm" 'Bezeichnung Zieldatei in die Hyperlink geschrieben werden soll
'akutellen Name & Pfad speichern
aktueller_pfad = ActiveWorkbook.Path & "\"
aktueller_name = ActiveWorkbook.Name
alter_name = Range("AG1")
Range("AG1") = ActiveWorkbook.Name
'Zieldate öffnen, Hyperlink schreiben, speichern, schließen
GetObject (Zieldatei_pfad & Zieldatei)
Application.AskToUpdateLinks = False
Application.Visible = True
With Workbooks(Zieldatei)
With Worksheets("Tabelle1").Columns(14)
Set RaFound = .Cells.Find(alter_name, , , xlWhole, , xlNext)
If Not RaFound Is Nothing Then
Rows(RaFound.Row).Delete
Do
Set RaFound = .Cells.Find(alter_name, , , xlWhole, , xlNext)
If RaFound Is Nothing Then Exit Do
Rows(RaFound.Row).Delete
Loop
End If
End With
Set RaFound = Nothing
End With
Do
If Not IsEmpty(Cells(i, 2)) Then
If IsNumeric(Cells(i, 2)) Then
With Workbooks(Zieldatei).Worksheets("Tabelle1")
Lrow = .UsedRange.SpecialCells(xlCellTypeLastCell).Row + 1 'letzte Zeile in  _
Zieldatei +1
End With
Workbooks(Zieldatei).Worksheets("Tabelle1").Cells(Lrow, 1) = Lab_nummer
Workbooks(Zieldatei).Worksheets("Tabelle1").Cells(Lrow, 2) = Datum
Workbooks(Zieldatei).Worksheets("Tabelle1").Cells(Lrow, 3) = Bearbeiter
Workbooks(Zieldatei).Worksheets("Tabelle1").Cells(Lrow, 4) = Lieferant
Workbooks(Zieldatei).Worksheets("Tabelle1").Cells(Lrow, 5) = Messbericht
Workbooks(Zieldatei).Worksheets("Tabelle1").Cells(Lrow, 12) = Bewertung
Workbooks(Zieldatei).Worksheets("Tabelle1").Cells(Lrow, 14) = aktueller_name
Range(Cells(i, 3), Cells(i, 8)).Copy 'Werte Kopieren
With Workbooks(Zieldatei).Worksheets("Tabelle1")
.Hyperlinks.Add Anchor:=.Cells(Lrow, 13), Address:=aktueller_pfad & "\" &  _
aktueller_name, TextToDisplay:="Hyperlink"
.Cells(Lrow, 6).PasteSpecial Paste:=xlPasteValues
End With
Else:
'nichts ausführen
End If
End If
i = i + 1
Loop Until i = 47 + 2 * j + k
Application.AskToUpdateLinks = True
Workbooks("test.xlsm").Close True
MsgBox "Datei gespeicht und Daten erfolgreich übernommen", vbInformation, "Hinweis"
ende:
speichern_gedrückt = False
Application.ScreenUpdating = True
End Sub

1
Beitrag zum Forumthread
Beitrag zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: getObject Zeile auf Inhalt überprüfen
29.07.2020 16:58:15
fcs
Hallo Henry,
1. wenn die Makros in Excel angelegt werden, dann ist es sinnvoller Excel-Dateien mir Application.Workbooks.Open zu öffnen. ggf. wird sonst evtl. eine 2. Excel-Instanz geöffnet, was für den Ablauf des Makros nicht förderlich ist.
2. Du arbeitest hier mit 2 Dateien und wenn du die Zieldatei öffnest, dann wird diese zur aktiven Arbeitsmappe.
Das bereitet dann Probleme, wenn du versuchst aus der 1. Datei Daten in die 2. Datei zu kopieren.
Deshalb ist es zweckmäßig mit Objekt-Variablen zu arbeiten, die für die involvierten Arbeitsmappen und Tabellenblätter stehen. Insbesondere dann, wenn die Namen ggf. nicht bei jedem makrodurchlauf identisch sind.
Ich habe hier die Variable wksAktiv ergänzt, diese steht für das beim Start des Makros aktive Tabellenblatt und die Variable wkbZiel, diese steht für die zu öffnende Zieldatei.
Zum passenden Zeitpunkt wird im Makro diesen Variablen das zutreffende Objekt zugewiesen per Set-Anweisung.
Zusätzlich muss man in allen Zeilen darauf achten, dass durch den vorangestellten Punkt auf das korrekte übergeordnete Objekt referenziert wird.
3. Wenn man schon anfängt Variablen zu deklarieren, dann bitte alle.
Dies kann man durch das Option Explicit in der 1. Zeile des Code-Moduls erzwingen.
Ich hoffe dein Makro funktioniert mit den Anpassungen, denn ich habe diese im Blindflug ohne Testen gemacht.
LG
Franz
Option Explicit
Global speichern_gedrückt As Boolean
Global speichern_abgebrochen As Boolean
Sub speichern()
Dim aktueller_pfad As String
Dim aktueller_name As String
Dim Zieldatei_pfad As String
Dim Zieldatei As String
Dim Lrow As Long
Dim i As Integer
Dim j As Integer
Dim k As Integer
Dim Lab_nummer, Datum, Bearbeiter, Lieferant, Messbericht, Bewertung, userresponce,  _
alter_name
Dim RaFound As Range
Dim wkbZiel As Workbook
Dim wksAktiv As Worksheet
Set wksAktiv = ActiveSheet
With wksAktiv
j = Range("AC2")
k = Range("AD2")
i = 21 + 2 * j
'Felder für Dateinamenvorschlag definieren
Lab_nummer = Range("J6")
Datum = Range("j8")
Bearbeiter = Range("j10")
Lieferant = Range("J12")
If Range("AD1") = "Wahr" Then
Messbericht = "vorhanden"
Else
Messbericht = "nicht vorhanden"
End If
Bewertung = Range("AF2")
speichern_gedrückt = True
'Dateinamen vorschlagen
If Lab_nummer = False Or Datum = False Or Bearbeiter = False Then
userresponce = Application.Dialogs(xlDialogSaveAs).Show
Else
userresponce = Application.Dialogs(xlDialogSaveAs).Show(Lab_nummer & Format("-") _
& Cells(i, 3) & Format("-") _
& Cells(i, 4) & Format("-") _
& Cells(i, 5) & Format("-") _
& Cells(i, 6) & Format("-") _
& Datum)
End If
End With
'Überprüfen ob Abbrechen gedrückt wurde, falls Ja Code beenden
If userresponce = False Then
GoTo ende
End If
Application.ScreenUpdating = False
Zieldatei_pfad = "Muster" 'Pfad in der Ziledatei liegt
Zieldatei = "test.xlsm" 'Bezeichnung Zieldatei in die Hyperlink geschrieben werden soll
'akutellen Name & Pfad speichern
aktueller_pfad = ActiveWorkbook.Path & "\"
aktueller_name = ActiveWorkbook.Name
alter_name = wksAktiv.Range("AG1")
wksAktiv.Range("AG1") = ActiveWorkbook.Name
'Zieldate öffnen, Hyperlink schreiben, speichern, schließen
Set wkbZiel = Application.Workbooks.Open(Zieldatei_pfad & Zieldatei)
Application.AskToUpdateLinks = False
With wkbZiel
With .Worksheets("Tabelle1").Columns(14)
Set RaFound = .Cells.Find(alter_name, , , xlWhole, , xlNext)
If Not RaFound Is Nothing Then
.Rows(RaFound.Row).Delete
Do
Set RaFound = .Cells.Find(alter_name, , , xlWhole, , xlNext)
If RaFound Is Nothing Then Exit Do
.Rows(RaFound.Row).Delete
Loop
End If
End With
Set RaFound = Nothing
End With
Do
If Not IsEmpty(wksAktiv.Cells(i, 2)) Then
If IsNumeric(wksAktiv.Cells(i, 2)) Then
With wkbZiel.Worksheets("Tabelle1")
Lrow = .UsedRange.SpecialCells(xlCellTypeLastCell).Row + 1 'letzte Zeile in _
Zieldatei +1
.Cells(Lrow, 1) = Lab_nummer
.Cells(Lrow, 2) = Datum
.Cells(Lrow, 3) = Bearbeiter
.Cells(Lrow, 4) = Lieferant
.Cells(Lrow, 5) = Messbericht
.Cells(Lrow, 12) = Bewertung
.Cells(Lrow, 14) = aktueller_name
With wksAktiv
.Range(.Cells(i, 3), .Cells(i, 8)).Copy 'Werte Kopieren
End With
.Hyperlinks.Add Anchor:=.Cells(Lrow, 13), Address:=aktueller_pfad & "\" & _
aktueller_name, TextToDisplay:="Hyperlink"
.Cells(Lrow, 6).PasteSpecial Paste:=xlPasteValues
End With
Else:
'nichts ausführen
End If
End If
i = i + 1
Loop Until i = 47 + 2 * j + k
Application.AskToUpdateLinks = True
wkbZiel.Close True
MsgBox "Datei gespeicht und Daten erfolgreich übernommen", vbInformation, "Hinweis"
ende:
speichern_gedrückt = False
Application.ScreenUpdating = True
End Sub

Anzeige

306 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige